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