[프로그래밍 기록] Spring - JDBC

김엄지·2024년 3월 24일
0

Spring

목록 보기
14/21

JDBC란 무엇일까?

애플리케이션 서버와 데이터베이스는 어떻게 소통할까?

기존에 사용하던 MySQL 서버를 PostgreSQL 서버로 변경한다면 무슨일이 발생할까?
이러한 문제를 해결하기위해 JDBC 표준 인터페이스가 등장했다.

JDBC란?

Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요없이 DB 변경이 가능하다.


JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러가지 작업 로직들을 직접 작성해야한다는 불편함이 있었고,
반복적이고 중복되는 작업들을 대신 처리해주는 JdbcTemplate이 등장한다.

JdbcTemplate 사용방법

  1. application.properties에 DB에 접근하기 위한 정보를 작성
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
  1. build.gradle에 JDBC 라이브러리와 MySQL을 등록
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
  1. DB연결이 필요한 곳에서 JdbcTemplate을 주입받아와 사용
private final JdbcTemplate jdbctemplate;

public MemoRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
}
  • 생성자의 파라미터를 통해 JdbcTemplate 객체가 자동으로 넘어와 jdbctemplate 변수에 저장된다.
  1. jdbcTemplate.update() 메서드는 INSERT, UPDATE, DELETE 와 같이 생성, 수정, 삭제에 사용되고, 첫 번째 파라미터로 SQL을 받고 그 이후에는 ?에 들어갈 값을 받는다.
  • INSERT SQL을 작성해 String 변수에 저장한다.
String sql = "INSERT INTO notices (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "EOMJI", "오늘 하루도 수고했어");
  • UPDATE SQL을 작성해 String 변수에 저장한다.
String sql = "UPDATE notices SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "EOMJI", 1);
  • DELETE SQL을 작성해 String 변수에 저장한다.
String sql = "DELETE FROM notices WHERE id = ?";
jdbcTemplate.update(sql, 1);
  • SELECT SQL을 작성해 String 변수에 저장한다.
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를 사용하여 한 줄씩 처리 할 수 있다.

    • RowMapper는 인터페이스이기 때문에 익명 클래스를 구현하여 처리한다.
    • 오버라이딩 된 mapRow 메서드는 제네릭스에 선언한 NoticeResponseDto 타입으로 데이터 한 줄을 변환하는 작업을 수행한다.

JdbcTemplate 사용방법은 가볍게 보고 넘어가고, DB와 객체를 매핑하여 소통할 수 있는 ORM이라는 기술을 알아보자.

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글