ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC란 무엇일까?
    spring/스프링 입문 주차 2024. 1. 18. 17:56

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


    애플리케이션 서버에서 DB에 접근하기 위해서는 여러가지 작업이 필요하다.
    1. 우선 DB에 연결하기 위해 커넥션을 연결해야 한다.
    2. SQL을 작성한 후 커넥션을 통해 SQL을 요청한다.
    3. 요청한 SQL에 대한 결과를 응답 받는다.

     

     

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

     

     

    - 이러한 문제를 해결하기 위해 JDBC 표준 인터페이스가 등장했다.
    - JDBC는 Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
    - JDBC에 연결해야 하는 DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요 없이 DB 변경이 가능하다.
     - DB 회사들은 자신들의 DB에 맞도록 JDBC 인터페이스를 구현한 후 라이브러리로 제공하는데
     이를 JDBC 드라이버라 부른다.

     

     


     


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

     

    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


    2. build.gradle에 JDBC 라이브러리와 MySQL을 등록한다.

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

     

    3. 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", "오늘 하루도 화이팅!");

     

    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);
        }
    });

     

    코드를 봤다면 느꼈겠지만, 굉장히 복잡하고 어렵다.
    이러한 점을 극복하기 위해 DB와 자바의 객체를 매핑하여 소통할 수 있는 ORM 이라는 기술이 등장했다.

    이는 JPA 파트에서 자세하게 다룰 수 있을 것이다.

Designed by Tistory.