| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- dockerhub
- Dead Letter Queue
- @Transactional
- docker compose
- 컨테이너
- DI
- Spring Data JPA
- @ComponentScan
- 페이징
- 스프링 부트
- Spring Container
- 쿠버네티스
- JWT
- AWS
- DLQ
- JPA
- JdbcTemplate
- CORS
- mybatis
- Routing Key
- kafka
- JPQL
- securitycontextholderfilter
- Spring
- docker
- MSA
- redis
- 서블릿 컨테이너
- 지연 로딩
- Web
- Today
- Total
look-forest
JPA 본문
JPA 설정
build.gradle
//JPA, 스프링 데이터 JPA 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' -> spring-boot-starter-jdbc 도 함께 포함
application.properties
#JPA log
logging.level.org.hibernate.SQL=DEBUG -> : 하이버네이트가 생성하고 실행하는 SQL을 확인할 수 있다
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE -> : SQL에 바인딩 되는 파라미터를 확인
(JPA log springboot 3이상일 경우는 logging.level.org.hibernate.orm.jdbc.bind=TRACE)
JPA 적용
# 도메인 객체
- @Entity : JPA가 사용하는 객체라는 뜻
- @Id : 테이블의 PK와 해당 필드를 매핑
- @Column : 객체의 필드를 테이블의 컬럼과 매핑한다
- JPA는 public 또는 protected 의 기본 생성자가 필수
# Repository
- 스프링을 통해 엔티티 매니저( EntityManager ) 라는 것을 주입받는다. JPA의 모든 동작은 엔티티 매니저를 통해서 이루어진다. 엔티티 매니저는 내부에 데이터소스를 가지고 있고, 데이터베이스에 접근할 수 있다
- JPA의 모든 데이터 변경(등록, 수정, 삭제)은 트랜잭션 안에서 이루어져야 한다
- EntityManagerFactory , JPA 트랜잭션 매니저( JpaTransactionManager ), 데이터 소스 등등 다양한 설정 자동
- insert: JPA에서 객체를 테이블에 저장할 때는 엔티티 매니저가 제공하는 persist() 메서드 를 사용하면 된다.
- update : JPA는 트랜잭션이 커밋되는 시점에, 변경된 엔티티 객체가 있는지 확인한다. 특정 엔티티 객체가 변경된 경우에 는 UPDATE SQL을 실행한다.
- select(단건) : 엔티티 객체를 PK를 기준으로 조회할 때는 find() 를 사용하고 조회 타입과, PK 값을 주면 된다
- select(PKx, 복합 조건) : JPQL 사용. JPQL은 엔티티 객체를 대상으로 SQL을 실행한다 생각하면 된다.

동적 쿼리 문제
실무에서는 동적 쿼리 문제 때문에, JPA 사용할 때 Querydsl도 함께 선택하게 된다
JPA 적용 - 예외 변환
JPA의 경우 예외가 발생하면 JPA 예외가 발생하게 된다. JPA는 PersistenceException과 그 하위 예외를 발생시킨다.
(추가로 JPA는 IllegalStateException, IllegalArgumentException을 발생시킬 수 있다)
그렇다면 JPA 예외를 스프링 예외 추상화( DataAccessException )로 어떻게 변환할 수 있을까?
@Repository 가 붙은 클래스는 예외 변환 AOP의 적용 대상이 된다!
스프링과 JPA를 함께 사용하는 경우 스프링은 JPA 예외 변환기 ( PersistenceExceptionTranslator )를 등록한다.
예외 변환 AOP 프록시는 JPA 관련 예외가 발생하면 JPA 예외 변환기를 통해 발생한 예외를 스프링 데이터 접근 예외로 변환한다.

※ JdbcTemplate 이나, Mybatis 도 스프링이 예외 변환기를 자동 처리해준다.
참고 자료 & 이미지 출처
스프링 DB 2편 - 데이터 접근 기술 (김영한 님)
'Spring > Spring 데이터 접근 - 활용 기술' 카테고리의 다른 글
| 데이터 접근 기술 - 활용 방안 (2) | 2024.09.02 |
|---|---|
| QueryDSL : type-safe Query (0) | 2024.08.31 |
| 스프링 데이터 JPA (0) | 2024.08.18 |
| MyBatis (0) | 2024.08.17 |
| 데이터 접근 기술 - 스프링 JdbcTemplate (0) | 2024.08.17 |