22.05.09 :: 실전! 스프링 부트와 JPA 활용
스프링 부트: 복잡하고 어려운 스프링 기술을 간결하고 쉽게 사용할 수 있도록 도와주는 기술
JPA: 강력한 ORM 자바 표준 기술
스프링 부트+JPA: 높은 개발 생산성 + 빠른 웹 어플리케이션 개발
프로젝트 환경설정
프로젝트 생성
스프링 부트 스타터(https://start.spring.io/)
Project Dependencies

롬복 적용
- Prefrences plugin lombok 검색 실행 (재시작)
- Prefrences Annotation Processors 검색 Enable annotation processing 체크 (재시작)
- 임의의 테스트 클래스를 만들고 @Getter, @Setter 확인
IntelliJ Gradle 대신에 자바 직접 실행
Preferences > Build, Execution, Deployment > Build Tools > Gradle
- Build and run using: Gradle -> IntelliJ IDEA
- Run tests using: Gradle -> IntelliJ IDEA
라이브러리 살펴보기
스프링 부트 라이브러리
spring-boot-starter-web
- spring-boot-starter-tomcat: 톰캣 (웹서버)
- spring-webmvc: 스프링 웹 MVC
spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
spring-boot-starter-data-jpa
- spring-boot-starter-aop
- spring-boot-starter-jdbc: HikariCP 커넥션 풀 (부트 2.0 기본)
- hibernate + JPA
- spring-data-jpa: 스프링 데이터 JPA
spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
- spring-boot, spring-core
- spring-boot-starter-logging: logback, slf4j
테스트 라이브러리
spring-boot-starter-test
- junit: 테스트 프레임워크
- mockito: 목 라이브러리
- assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test: 스프링 통합 테스트 지원
View 환경 설정
thymeleaf 템플릿 엔진
thymeleaf 공식 사이트: https://www.thymeleaf.org/
스프링 공식 튜토리얼: https://spring.io/guides/gs/serving-web-content/
스프링 부트 thymeleaf viewName 매핑
resources/templates/ +{ViewName}+ .html
*spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다.
*recomplie: ctrl+shift+F9
H2 데이터베이스 설치
개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
데이터베이스 파일 생성 방법
- jdbc:h2:~/jpashop (최소 한번)
- ~/jpashop.mv.db 파일 생성 확인
- 이후 부터는 jdbc:h2:tcp://localhost/~/jpashop 으로 접속
주의: H2 데이터베이스의 MVCC 옵션은 H2 1.4.198 버전부터 제거되었다. 1.4.200 버전에서는 MVCC 옵션을 사용하면 오류가 발생한다.
JPA와 DB 설정, 동작확인
H2 database는 자바로 실행되므로 자바가 깔려있어야 한다.
main/resources/application.yml
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop; MVCC=TRUE
username: sa
password:
driver-class-name: orh.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
show_sql: true
format_sql: true
logging:
level:
org.hibernate.SQL: debug
- datasource: 데이터베이스 커넥션 데이터소스 설정
- spring.jpa.hibernate.ddl-auto: create: 애플리케이션 실행 시점에 테이블을 drop 하고 다시 생성한다. (엔티티 매핑 정보 기반)
모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
show_sql : System.out 에 하이버네이트(jpa) 실행 SQL을 남긴다.
org.hibernate.SQL : logger를 통해 하이버네이트 실행 SQL을 남긴다.
주의! yml 파일은 띄어쓰기(스페이스) 2칸으로 계층을 만든다.
- 스프링 부트가 jpa 설정을 읽고 @PersistenceContext Annotation이 달린 EntityManager에 객체를 생성하여 주입해준다.
- EntityManager를 통한 모든 데이터 변경은 transaction 안에서 이루어져야 한다.
- @transactional 애노테이션이 test 안에 있으면 테스트 종료 후 rollback (@Rollback(false) 추가하면 commit)
- 같은 transaction 안에서는 식별자(pk)가 같으면 같은 엔티티로 인식한다. (1차 캐시)
*커맨드와 쿼리를 분리해라. 데이터 저장은 side effect를 일으킬 수 있는 커맨드이기 때문에 return 값을 거의 만들지 않는다.
쿼리 파라미터 로그 남기기
JPA를 쓸 때 sql 쿼리나 DB 커넥션이 언제 일어나는지 알 수 없고 쿼리 파라미터가 물음표로 남는 불편함
- logging 옵션 'org.hibernate.type: trace' 추가 : SQL 실행 파라미터를 로그로 남긴다.
- 외부 라이브러리 사용: p6spy 로그에 대한 옵션도 변경 가능
https://github.com/gavlyukovskiy/spring-boot-data-source-decorator
//스프링 부트를 사용한다면 아래 라이브러리만 추가
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
참고: 외부 라이브러리는 개발 단계에는 괜찮지만, 운영/배포 단계에는 애플리케이션 성능을 저하시키지 않는지 테스트를 거쳐 사용을 고려해봐야 한다.
*ctrl+shift+enter: 자동 완성