JDBC (Java Database Connectivity)
: DB에 접근할 수 있도록 Java에서 제공하는 API
- 애플리케이션 서버를 개발하게 되면 DB와의 소통이 필수적인데,
이 때 Java application과 DB를 연결해주는 역할을 함.
JDBC의 등장 배경
application server에서 DB(MySQL)의 접근하기 위해 필요한 작업
- DB에 연결
- SQL 작성 후 커넥션을 통해 SQL 요청
- 요청한 SQL에 대한 응답 받기
➡️ MySQL 이 아닌 PostgreSQL 로 변경한다면 위의 3가지 방법이 모두 다를 수 있기 때문에 DB의 연결 로직들을 모두 수정해야 하는 문제가 발생하는데 이러한 문제를 해결하기 위해 JDBC 표준 인터페이스 등장
- JDBC에 연결해야하는 DB의 JDBC 드라이버만 교체하면 손쉽게 DB 변경 가능
JdbcTemplate
: 반복적이고 중복되는 작업들을 대신 처리해줌
- JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 DB에 연결하기 위해서 여러 가지 작업 로직들을 직접 작성해야 한다는 불편함을 해결하기 위해 등장
사용방법
- application.properties에 DB에 접근하기 위한 정보 작성
- build.gradle에 JDBC 라이브러리와 MySQL 등록
- DB 연결이 필요한 곳에서 JdbcTemplate 주입받아와 사용
private final JdbcTemplate jdbctemplate;
public MemoRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
INSERT
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
- insert문은 항상 값이 바뀌기 때문에 ? 를 사용하면 유동적으로 데이터를 넣어줄 수 있음.
- insert, update, delete 모두 jdbcTemplate.update() 메서드 사용해서 요청
UPDATE
String sql = "UPDATE memo SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "Robbert", 1);
DELETE
String sql = "DELETE FROM memo WHERE id = ?";
jdbcTemplate.update(sql, 1);
SELECT
String sql = "SELECT * FROM memo";
return jdbcTemplate.query(sql, new RowMapper<MemoResponseDto>() {
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
return new MemoResponseDto(id, username, contents);
}
});
- insert, update, delete와는 다르게 JdbcTemplate의 query()라는 메서드 사용
- 여러 줄이 넘어오기 때문에 RowMapper 인터페이스를 사용해 한 줄씩 처리
- 오버라이딩 된 mapRow 메서드는 제네릭스에 선언한 MemoResponseDto 타입으로 데이터 한 줄을 변환하는 작업 수행
- JdbcTemplate이 복잡하고 사용하기 어려움.그래서 현재는 Java 개발자들을 위해 DB와 객체를 매핑하여 소통할 수 있는 ORM이라는 기술 등장
용어 정리
- JDBC 드라이버
: DB회사들이 자신들의 DB에 맞도록 JDBC 인터페이스를 구현한 후 제공하는 라이브러리
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] IoC / DI / Bean (0) | 2023.11.07 |
---|---|
[Spring] 3 Layer Architecture (0) | 2023.11.03 |
[Spring] Database / SQL (0) | 2023.11.03 |
[Spring] DTO (0) | 2023.11.02 |
HTTP 데이터를 객체로 처리하는 방법 (0) | 2023.11.02 |