Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

JPA 본문

Spring/Spring 데이터 접근 - 활용 기술

JPA

studyHub 2024. 8. 17. 22:42

 

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 예외 변환기를 통해 발생한 예외를 스프링 데이터 접근 예외로 변환한다.

결과적으로 리포지토리에 @Repository 애노테이션만 있으면 스프링이 예외 변환을 처리하는 AOP를 만들어준다

 

※ 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