[Spring] Spring의 DB 연동

Updated: Categories:

Spring에서 DB를 연동하는 여러가지 방법 (JDBC, MyBatis, JPA 등)

발전 순서

  1. JDBC
  2. Spring JDBC
    • JdbcTemplate
    • NamedParameterJdbcTemplate
  3. MyBatis
  4. JPA
    • Hibernate
    • Spring Data JPA
  5. QueryDsl


JDBC

  • Java DataBase Connectivity
  • DB연결을 위한 자바 표준 인터페이스 API
    • 다양한 DB 벤더의 드라이버를 지원
  • 단점
    • DB를 연결하는 과정이 반복적이고 귀찮음
    • 커넥션을 반드시 종료해줘야 함

동작원리

try(
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/db", "username", "password");
    Statement statement = connection.prepareStatement(쿼리문);
    ResultSet resultSet = statement.executeQuery()
){
    여기서 쿼리문 결과를 사용
}
  1. DriverManager에 driver + host url, username, password를 넣어 DB의 커넥션을 생성
  2. 날리고 싶은 쿼리를 커넥션에 넣고 statement를 생성
  3. 생성한 statement를 실행하여 실제 쿼리를 날림


Spring JDBC

  • DB정보를 가지고 자동으로 커넥션을 생성해주는 DataSource가 있다
    • 커넥션들을 미리 만들어 놓는 커넥션 풀을 관리한다.
    • SpringBoot 2.0 이전엔 default로 tomcat-jdbc를 사용했고, 이후엔 HikariCP를 사용함
  • 쿼리문을 실행시켜주는 JdbcTemplate이 있다
    • DataSource Bean을 주입받아 사용
    • 쿼리문을 더 쉽게 생성할 수 있는 NamedParameterJdbcTemplate도 있음
  • 단점
    • DAO에서 쿼리문을 직접 써줘야 하기에 JAVA와 SQL이 한 클래스에 존재함
    • 쿼리문 결과를 분석한 후 직접 객체로 만들어줘야함


MyBatis

  • SQL Mapper에 해당
    • SQL 실행과 결과를 객체와 매핑시켜주는 기술
    • JDBC Template, Mybatis
      • SQL문을 직접 작성해야 한다.
  • DataSouce를 사용해 커넥션 얻음
    • SqlSession을 통해 세션을 통해 쿼리 날림 (?)
  • 장점
    • 복잡한 쿼리문도 만들수 있음
      • 동적 쿼리
      • Join, 서브쿼리 등
    • SQL과 Java 코드를 분리할 수 있음
  • 단점
    • 쿼리를 직접 작성하기에 특정 DB 벤더에 종속적임


JPA

  • SQL을 작성하지 않고 entity 객체를 통해 데이터에 접근하는 ORM
    • Object Relational mapping
    • OOP의 객체와 RDB의 테이블을 자동으로 매핑해주는 기술
    • ORM이 자동으로 SQL을 생성해주기에 객체만으로 DB를 사용할 수 있음
  • JPQL을 사용한다
    • Java Persistence Query Language
    • 플랫폼에 독립적인 객체지향 쿼리 언어로, JPA 엔티티 객체를 대상으로 동작
  • 장점
    • 객체지향적인 코드를 작성할 수 있음
    • 재사용성 및 유지보수성 증가
    • 특정 벤더에 종속되지 않음
    • 캐싱을 지원
  • 단점
    • 정확한 설계를 필요로 함
    • 성능 향상을 위한 튜닝이 필요할 때가 있음
      • JPQL의 즉시/지연 로딩시 N+1 문제
      • 캐시와 변경 감지를 위한 메모리 최적화

구조

  • JPA는 라이브러리가 아닌 인터페이스, 즉 관계형 DB를 어떻게 자바 객체로 사용할지를 정의한 방법일 뿐이다.
  • Hibernate는 JPA 인터페이스를 구현한 구현체이다.
    • 즉 우리가 가져다 쓸 수 있는 라이브러리임.
  • Spring Data JPA는 JPA를 쓰기 편하게 만들어주는 모듈이다.
    • 우리가 Repository를 통해 JPA를 편하게 사용할 수 있는 것은 Spring Data JPA 내부에 있는 Entity Manager 덕분임


QueryDsl

  • 정적 타입을 이용해 자바코드로 SQL 쿼리를 생성해주는 프레임워크
    • JPA에서 해결하지 못하는 동적 쿼리와 복잡한 쿼리 문제를 해결한다