애플리케이션 서버와 데이터베이스는 어떻게 소통할까?
기존에 사용하던 MySQL 서버를 PostgreSQL 서버로 변경한다면 무슨일이 발생할까?
이러한 문제를 해결하기위해 JDBC 표준 인터페이스가 등장했다.
Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요없이 DB 변경이 가능하다.
JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러가지 작업 로직들을 직접 작성해야한다는 불편함이 있었고,
반복적이고 중복되는 작업들을 대신 처리해주는 JdbcTemplate이 등장한다.
spring.datasource.url=jdbc:mysql://localhost:3306/memo
spring.datasource.username=root
spring.datasource.password={비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
private final JdbcTemplate jdbctemplate;
public MemoRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
String sql = "INSERT INTO notices (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "EOMJI", "오늘 하루도 수고했어");
String sql = "UPDATE notices SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "EOMJI", 1);
String sql = "DELETE FROM notices WHERE id = ?";
jdbcTemplate.update(sql, 1);
String sql = "SELECT * FROM notices";
return jdbcTemplate.query(sql, new RowMapper<NoticeResponseDto>() {
@Override
public NoticeResponseDto 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 NoticeResponseDto(id, username, contents);
}
});
SELECT의 경우 결과가 여러 줄로 넘어오기 때문에 RowMapper를 사용하여 한 줄씩 처리 할 수 있다.
JdbcTemplate 사용방법은 가볍게 보고 넘어가고, DB와 객체를 매핑하여 소통할 수 있는 ORM이라는 기술을 알아보자.