[Spring] Spring의 DB 연동
Updated: Categories: CSSpring에서 DB를 연동하는 여러가지 방법 (JDBC, MyBatis, JPA 등)
발전 순서
- JDBC
- Spring JDBC
- JdbcTemplate
- NamedParameterJdbcTemplate
- MyBatis
- JPA
- Hibernate
- Spring Data JPA
- 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()
){
여기서 쿼리문 결과를 사용
}
- DriverManager에 driver + host url, username, password를 넣어 DB의 커넥션을 생성
- 날리고 싶은 쿼리를 커넥션에 넣고 statement를 생성
- 생성한 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에서 해결하지 못하는 동적 쿼리와 복잡한 쿼리 문제를 해결한다