[Spring] JDBC(Java Database Connectivity)

thingzoo·2023년 6월 25일
0

Spring

목록 보기
18/54
post-thumbnail

JDBC의 등장배경

  • 애플리케이션 서버에서 DB에 접근 하는 과정
    1. 우선 DB에 연결하기 위해 connection을 연결
    2. SQL을 작성한 후 커넥션을 통해 SQL을 요청
    3. 요청한 SQL에 대한 결과를 응답받음

  • 기존에 사용하던 MySQL 서버를 PostgreSQL 서버로 변경한다면 무슨일이 발생할까?
  • MySQL과 PostgreSQL은 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법 모두 다를 수 있다.
  • 따라서 애플리케이션 서버에서 작성했던 DB 연결 로직들을 전부 수정해야한다.

  • 이러한 문제를 해결하기위해 JDBC 표준 인터페이스가 등장했다.
  • JDBC는 Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
  • JDBC에 연결해야하는 DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요없이 DB 변경이 가능하다.
    • JDBC 드라이버: DB 회사들은 자신들의 DB에 맞도록 JDBC 인터페이스를 구현한 후 라이브러리로 제공
  • 따라서, MySQL 드라이버를 사용해 DB에 연결을 하다 PostgreSQL 서버로 변경이 필요할 때 드라이버만 교체하면 손쉽게 DB 변경이 가능하다.

JdbcTemplate

  • JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러가지 작업 로직들을 직접 작성해야한다는 불편함이 남았다.
  • 이러한 불편함을 해결하기 위해 connection 연결, statement 준비 및 실행, connection 종료 등의 반복적이고 중복되는 작업들을 대신 처리해주는 JdbcTemplate이 등장했다.

JdbcTemplate 사용방법

application.properties에 DB에 접근하기 위한 정보 작성

spring.datasource.url=jdbc:mysql://localhost:3306/
spring.datasource.username=root
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

build.gradle에 JDBC 라이브러리와 DB(MySQL) 등록

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'  // JDBC
implementation 'mysql:mysql-connector-java:8.0.28' // MySQL

Intellij Database 연동

  • Database 생성
CREATE DATABASE memo;
  • Database 탭을 클릭 후 + 버튼 클릭
  • Data Source > 원하는 DB(MySQL) 클릭
  • User, Password, Database 정보 추가 후 Ok 클릭
  • Database에 연결 완료

DB연결이 필요한 곳에서 JdbcTemplate을 주입받아와 사용

private final JdbcTemplate jdbctemplate;

public MemoRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
}
  • 생성자의 파라미터를 통해 JdbcTemplate 객체가 자동으로 넘어와 jdbctemplate 변수에 저장됨

JdbcTemplate 코드 작성

😮‍💨 JdbcTemplate이 JDBC를 직접 사용할 때 발생하는 불편함을 해결해 주었지만 아직도 복잡하고 사용하기 까다로운 것은 분명한 사실이다. 다행히도 Java 개발자들을 위해 DB와 객체를 매핑하여 소통할 수 있는 ORM이라는 기술이 등장했다. 따라서 JdbcTemplate 사용방법은 가볍게 보고 넘어가자!!! 휴!

  • INSERT
    String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
    jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
    • INSERT SQL을 작성해 String 변수에 저장
      • 이때, 넣고자 하는 데이터 부분에 ?를 사용하면 유동적으로 데이터를 넣어줄 수 있다.
    • jdbcTemplate.update() 메서드는 INSERT, UPDATE, DELETE 와 같이 생성, 수정, 삭제에 사용될 수 있는데 첫 번째 파라미터로 SQL을 받고 그 이후에는 ?에 들어갈 값을 받는다.
  • UPDATE
    String sql = "UPDATE memo SET username = ? WHERE id = ?";
    jdbcTemplate.update(sql, "Robbert", 1);
    • UPDATE SQL을 작성해 String 변수에 저장한 후 update() 메서드 첫 번째 파라미터에 넣어준다.
      • 이때, 넣고자 하는 데이터 부분에 ?를 사용하면 유동적으로 데이터를 넣어줄 수 있다.
  • DELETE
    String sql = "DELETE FROM memo WHERE id = ?";
    jdbcTemplate.update(sql, 1);
    • DELETE SQL을 작성해 String 변수에 저장한 후 update() 메서드 첫 번째 파라미터에 넣어준다.
      • 이때, 넣고자 하는 데이터 부분에 ?를 사용하면 유동적으로 데이터를 넣어줄 수 있다.
  • 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);
        }
    });
    • SELECT SQL을 작성해 String 변수에 저장한 후 query() 메서드 첫 번째 파라미터에 넣어준다.
    • SELECT의 경우 결과가 여러 줄로 넘어오기 때문에 RowMapper를 사용하여 한 줄씩 처리 할 수 있다.
      • RowMapper는 인터페이스 이기 때문에 익명 클래스를 구현하여 처리다.
      • 오버라이딩 된 mapRow 메서드는 제네릭스에 선언한 MemoResponseDto 타입으로 데이터 한 줄을 변환하는 작업을 수행한다.
profile
공부한 내용은 바로바로 기록하자!

0개의 댓글