JPA

  • build.gradle

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • application.properties

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.orm.jdbc.bind=TRACE
  • org.hibernate.SQL : 하이버네이트가 생성하고 실행하는 SQL을 확인할 수 있다. logger를 통해 출력 된다.

  • org.hibernate.orm.jdbc.bind : SQL에 바인딩 되는 파라미터를 확인할 수 있다.

  • spring.jpa.show-sql=true : org.hibernate.SQL와 같이 SQL이 출력되는데 System.out으로 출력 된다. 그래서 로그로 나오는 위 설정을 쓰는 것이 좋다.

  • 객체 매핑

@Data
@Entity
@NoArgsConstructor(access = PROTECTED)
public class Item {

    @Id @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @Column(name = "item_name", length = 10)
    private String itemName;
    private Integer price;
    private Integer quantity;

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}
  • Repository

  • Config

EntityManager는 순수한 JPA기술이고 스프링과는 관계가 없다. 그래서 EntityManager는 예외가 발생하면 JPA 관련 예외를 발생시킨다.

JPA는 PersistenceException과 그 하위 예외, 추가로 IllegalArgumentException, IllegalStateException을 발생시킬 수 있다.

JPA 예외를 스프링 예외 추상화(DataAccessException)으로 변환하려면 @Repository가 필요하다.

img.png

@Repository의 기능

  • 컴포넌트 스캔의 대상이 된다.

  • 예외 변환 AOP의 적용 대상이 된다.

    • 스프링과 JPA를 함께 사용하는 경우 스프링은 JPA 예외 변환기(PersistenceExceptionTranslator)를 등록한다.

    • 예외 변환 AOP Proxy는 JPA 관련 예외가 발생하면 JPA 예외 변환기를 통해 발생한 예외를 스프링 데이터 접근 예외로 변환한다.

img_1.png

Last updated