프로젝트에서 Spring Data JPA를 사용하고 있다.
JPA와 JDBC의 차이는 이 글에서 확인할 수 있다.
간단히 말하면 JPA는 ORM 기술로서
내부적으로 JDBC를 사용하는 High Level API이다.
JPA
는 유아용 레고,
JDBC
는 어른용 레고.
쿼리 학습을 위해서라도 JPA 내부에 사용되는
JDBC에 대해 공부할 필요가 있다.
그래야 나중에 더 복잡한 프로그램에 잘 적용할 수 있다.
그리고,
유아용 레고만 깨작거릴 수는 없다.
유아용 레고 대신 어른용 레고를 가지고 놀 수 있도록
JPA와 더불어 불필요한 것들을 모두 걷어내고 경량화 하여
JDBC Template을 적용해보자.
JDBC Template
은 Spring에서 제공하는 JDBC 템플릿 클래스다.
연결 및 트랜잭션 관리를 자동으로 처리해준다.
JDBC API
에서는
try-catch 문 안에
연결(Connection)부터 시작해서
작성한 쿼리문 (PreparedStatement) 전송하고
결과를 가져오기 위해 ResultSet도 만들어야 해서
구조적인 반복이 심하다.
일단 뭔 말인지는 모르겠으나, 순수 JDBC
는 너무 으른용 레고 같으니까
일단 15세용 레고로 가보자.
먼저 application.properties
에서
jpa 관련 속성들을 다 주석처리 해준다.
위에 있는 데이터베이스에 통신하기 위한 속성이다.
(오 나도 알게 모르게 jdbc를 쓰고 있었구나)
build.gradle
에서
implementation
'org.springframework.boot:spring-boot-starter-data-jpa' 도 주석처리한다.
그러면 각종 Entity
와 Repository
에서 빨간불이 들어온다.
JPARepository
를 상속
받았기 때문이지.
모든 Repository
에서
대충 요로코롬 annotation
을 주석처리 해주고
import 했던 JPA는 지워주자.
지우지 않고 주석처리하는 이유는
Repository Interface
를 상속 받아서
JDBC Repository
를 구현해야하기 때문이다.
build.gradle
에서 주석 처리한 JPA
대신 JDBC
를 추가해준다.
앗 그러면 spring
입맛에 맞게 작성했던
JDBC
속성을 내 입맛에 맞게 수정할 수 있다.
내 입맛에 맞춘 속성들을 변수로 불러와서
dataSource
객체를 생성해준다.
이렇게 Repository
를 상속 받아 구현해준다.
단일 객체
는 queryForObject로 불러오고
List 객체
는 query로 불러온다.
그런데 어라라 Spring Boot
를 실행하면
여전히 JPA
관련 로그가 발생한다.
이 부분은 더 알아봐야겠다.
Java
의 다형성으로 새로운 형식의 Repository
를 만들어서
JPARepository
를 대체해 주었다.
JPA
로 편하게 DB를 운용하면서 생산성을 높일 수 있었지만,
JDBC Template
로 바꾸면서 더 낮은 레벨의 접근으로
모든 DB 액세스를 관리할 수 있게 되었다.
이것이 득이 될 수 있도록 DB 쿼리를 학습해야겠다.
순수 JDBC
는 낮은 레벨에서 DB에 접근 하기보다
코드 구조가 반복이 되는 느낌이 강하다.
JDBC Template
에서 충분히 낮은 레벨에서 접근할 수 있다.
잠깐 JDBC Template
를 맛 봐본 결과,
가져온 데이터 중 필요한 데이터만 선택적으로 반환하면서
다양한 요구 사항에 맞게 데이터 표현 방식을 조정할 수 있을 것 같다.
MyBatis에 대해서는 들어보셨나요?