# [JPA] JPA(Java Persistent API)
Study Repository

[JPA] JPA(Java Persistent API)

by rlaehddnd0422

์ง€๊ธˆ๊นŒ์ง€ jdbc๋ถ€ํ„ฐ jdbctemplate๊นŒ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ SQL์„ ์ž‘์„ฑํ•ด ๋งคํ•‘ํ•ด์˜ค๋Š” SQL Mapper ๋ฐฉ์‹์œผ๋กœ SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

 

SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ ์ƒ์„ ๋งŽ์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.. CRUD์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ SQL๋กœ ๋ฐ”๊พธ๊ณ , SQL์„ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๊ณ ..  ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๋ฅผ SQL ๋กœ ๋งคํ•‘ํ•˜๋Š” ์ž‘์—…๋“ค์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผํ•˜์ฃ . ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.  

 

๊ฐ„๋‹จํ•œ ์ผ€์ด์Šค์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„, ๊ฐ์ฒด ๋ ˆ๋ฒจ์ด ์ƒ์†์— ์˜ํ•ด์„œ ์ปค์ง€๊ฒŒ ๋˜๋ฉด SQL๋กœ ๋งคํ•‘์€ ๋ฐฐ๋กœ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Item์„ ์ƒ์†ํ•œ ๊ฐ์ฒด Album, Movie, Book์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Album, Movie, Book ์€ Item์˜ PK์ธ id๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ๊ฐ€์ง„๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.

 

 

์ด ๋•Œ Album์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๋Š”

1) ๊ฐ์ฒด๋ฅผ ๋ถ„ํ•ดํ•˜๊ณ 

2) insert into item ...

3) insert into album values ...

 

๋ณต์žกํ•œ ์ž‘์—…๋“ค์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์กฐํšŒ, ์‚ญ์ œ, ์ˆ˜์ •์—์„œ๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์†๋ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์ด ์ƒ๋‹นํžˆ ๋งŽ์•„์ง‘๋‹ˆ๋‹ค.

 

๊ฐ์ฒด์™€ ๊ฐ์ฒด๊ฐ„, ํ…Œ์ด๋ธ”๊ณผ ํ…Œ์ด๋ธ”๊ฐ„ ๊ด€๊ณ„๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JPA๋Š” ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

JPA๋ž€?

JPA๋Š” ์ž๋ฐ” ์ง„์˜์˜ ORM(Object-relational mapping ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘) ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ 

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋Œ€๋กœ ์„ค๊ณ„ํ•˜๊ณ  , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Œ€๋กœ ์„ค๊ณ„๋งŒ ํ•˜๋ฉด ORM ํ”„๋ ˆ์ž„์›Œํฌ์ธ JPA๊ฐ€ ์ค‘๊ฐ„์—์„œ ์•Œ์•„์„œ ๋งคํ•‘์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„  ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ๋งคํ•‘ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ์ƒ๋‹นํžˆ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

 

JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. 

 

์ด์ œ๋ถ€ํ„ฐ๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•ด SQL ์ค‘์‹ฌ ๊ฐœ๋ฐœ์—์„œ ๋ฒ—์–ด๋‚˜ ๊ฐ์ฒด ์ค‘์‹ฌ ๊ฐœ๋ฐœ๋กœ ์ „ํ™˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด, ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ, ์„ฑ๋Šฅ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

JPA๋Š” ์Šคํ”„๋ง๋งŒํผ ๋ฐฉ๋Œ€ํ•˜๊ณ  ๊ณต๋ถ€ํ•  ๊ฒŒ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„ JPA๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ณ , ์ง€๊ธˆ์€ ๋Œ€๋žต์ ์œผ๋กœ JPA๋ฅผ ์“ฐ๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ตฌ๋‚˜ ์ •๋„๋กœ๋งŒ ์•Œ์•„๋‘ก์‹œ๋‹ค.

 

JPA ์„ค์ •

 

- build.gradle

//JPA, ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ์ถ”๊ฐ€
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

  • hibernate-core : JPA ๊ตฌํ˜„์ฒด์ธ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • jakarta.persistence-api : JPA ์ธํ„ฐํŽ˜์ด์Šค
  • spring-data-jpa : ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์œ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

//JdbcTemplate ์ถ”๊ฐ€
//implementation 'org.springframework.boot:spring-boot-starter-jdbc'

spring-boot-starter-data-jpa๋Š” jpa, spring data jpa ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ jdbc๋„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

 

 

- application.properties ( main, test )

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
  • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” SQL์„ ํ™•์ธํ•˜๊ณ , SQL์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™•์ธํ•˜๋„๋ก ์„ค์ •

JPA ์ ์šฉ

์ด์ œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ์ „์— jdbctemplate์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์— ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. Item - ORM ๋งคํ•‘

@Data
@Entity
public class Item {

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

    @Column(name="item_name",length = 10)
    private String itemName;
   
    private Integer price;
    private Integer quantity;
    
    public Item() {
    }
    
    public Item(String itemName, Integer price, Integer quantity) {
    this.itemName = itemName;
    this.price = price;
    this.quantity = quantity;
	}
}
  • @Entity : JPA๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ผ๋Š” ๋œป์œผ๋กœ ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์–ด์•ผ JPA๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  • @Id : ํ…Œ์ด๋ธ”์˜ PK์™€ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • @GeneratedValue(strategy = GenerationType.IDENTITY) : PK ์ƒ์„ฑ ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ƒ์„ฑํ•˜๋Š” IDENTITY ๋ฐฉ์‹์„ ์‚ฌ์šฉ
  • @Column : ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๊ณผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žตํ•ด๋„ ๋˜์ง€๋งŒ, ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์ง์ ‘ ๋งคํ•‘ํ•ด์ค๋‹ˆ๋‹ค.

+ JPA๋Š” public์ด๋‚˜ protected ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

2. Repository์— ์ ์šฉ 

@Slf4j
@Repository
@Transactional
@RequiredArgsConstructor
public class JpaItemRepositoryV1 implements ItemRepository {
    
    private final EntityManager em;
  • JPA์˜ ๋ชจ๋“  ๋™์ž‘์€ EntityManager๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. EntityManager๋Š” ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JPA์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(์‚ฝ์ž…,์ˆ˜์ •,์‚ญ์ œ // ์กฐํšŒ๋Š” X)๋Š” ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, @Transactional์„ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (JPA์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ ํŠธ๋žœ์žญ์…˜์ด ํ•„์ˆ˜)

 

์ด ์ „ ํฌ์ŠคํŒ…์—์„œ๋„ ๋งํ–ˆ์ง€๋งŒ, ํŠธ๋žœ์žญ์…˜์€ ์„œ๋น„์Šค ๊ณ„์ธต์— ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ๋งž์ง€๋งŒ ์ด ์˜ˆ์ œ์—์„œ๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์— ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—†์–ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์— ๊ฑธ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

2-1. save()

@Override
public Item save(Item item) {
    em.persist(item);
    return item;
}

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์˜ persist ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ( ๋งคํ•‘์€ JPA๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์ค๋‹ˆ๋‹ค. )

์ด ๋•Œ Item ๊ฐ์ฒด์— PK id๋Š” ์ƒ์„ฑ์ „๋žต์„ IDENTITY๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ €์žฅ ์ดํ›„์— Item ๊ฐ์ฒด์˜ idํ•„๋“œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑํ•œ PK๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, JPA๊ฐ€ INSERT SQL(persist ๋ฉ”์†Œ๋“œ) ์‹คํ–‰ ์ดํ›„์— ์ƒ์„ฑ๋œ ID๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ ํ…Œ์ด๋ธ”์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

2-2. update()

@Override
public void update(Long itemId, ItemUpdateDto updateParam) {
    Item item = em.find(Item.class, itemId);
    item.setItemName(updateParam.getItemName());
    item.setPrice(updateParam.getPrice());
    item.setQuantity(updateParam.getQuantity());
}

JPA๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋Š” ์‹œ์ ์—, ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํŠน์ • ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์— UPDATE SQL์„ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค. 

๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ผ๋Š” JPA ์›๋ฆฌ๋ฅผ ํ†ตํ•ด ํƒ์ƒ‰์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. 

 

2-3. findById() 

@Override
public Optional<Item> findById(Long id) {
    Item item = em.find(Item.class, id);
    return Optional.ofNullable(item);
}

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์˜ find ๋ฉ”์†Œ๋“œ๋กœ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

find์—๋Š” ์กฐํšŒ ํƒ€์ž…๊ณผ, PK ๊ฐ’์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹จ์ˆœํžˆ PK๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์žกํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ์š”?

 

2-4. findAll()

JPA๋Š” JPQL์ด๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์žกํ•œ ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

SQL์ด ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค๋ฉด, JPQL์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ SQL์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

@Override
public List<Item> findAll(ItemSearchCond cond) {
    String jpql = "select i from Item i";

    Integer maxPrice = cond.getMaxPrice();
    String itemName = cond.getItemName();

    if (StringUtils.hasText(itemName) || maxPrice != null) {
        jpql += " where";
    }

    boolean andFlag = false;
    if (StringUtils.hasText(itemName)) {
        jpql += " i.itemName like concat('%',:itemName,'%')";
        andFlag = true;
    }

    if (maxPrice != null) {
        if (andFlag) {
            jpql += " and";
        }
        jpql += " i.price <= :maxPrice";
    }

    log.info("jpql={}", jpql);

    TypedQuery<Item> query = em.createQuery(jpql, Item.class);

    if (StringUtils.hasText(itemName)) {
        query.setParameter("itemName", itemName);
    }

    if (maxPrice != null) {
        query.setParameter("maxPrice", maxPrice);
    }
    return query.getResultList();
}

์‹คํ–‰๋œ JPQL ์˜ˆ์‹œ)

 select i from Item i
    where i.itemName like concat('%',:itemName,'%')
      and i.price <= :maxPrice

JPQL์„ ํ†ตํ•ด ์‹คํ–‰๋œ SQL

select
      item0_.id as id1_0_,
      item0_.item_name as item_nam2_0_,
      item0_.price as price3_0_,
      item0_.quantity as quantity4_0_
    from item item0_
    where (item0_.item_name like ('%'||?||'%'))
      and item0_.price<=?
JPQL๋Š” JPA๋ฅผ ์ž์„ธํžˆ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.
  • (SQL) query์— ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์€ setParameter() ์‚ฌ์šฉ
  • JPA๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋™์  ์ฟผ๋ฆฌ๋Š” ์ฒ˜๋ฆฌํ•˜๊ธฐ ์—ฌ์ „ํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋™์  ์ฟผ๋ฆฌ๋Š” ๋‚˜์ค‘์— Querydsl์ด๋ผ๋Š” ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

+ Config ์„ค์ •

@Configuration
public class JpaConfig {

    //    private final ItemMapper itemMapper; // Mybatis

    private final EntityManager em;

    public JpaConfig(EntityManager em) {
        this.em = em;
    }
JPA๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด EntityManagerFactory, JPA ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €, ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•  ์„ค์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ด ๊ณผ์ •์„ ๋ชจ๋‘ ์ž๋™ํ™” ํ•ด์ค๋‹ˆ๋‹ค.

 

+ ์˜ˆ์™ธ ๋ณ€ํ™˜

JPA์˜ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด JPA ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. EntityManager๋Š” ์ˆœ์ˆ˜ํ•œ JPA ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ JPA์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด JPA ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ JPA ์˜ˆ์™ธ๋ฅผ ์Šคํ”„๋ง ์˜ˆ์™ธ ์ถ”์ƒํ™”๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

 

๋ฐ”๋กœ @Repository ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

@Repository๋Š” ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•ด์ค„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์˜ˆ์™ธ ๋ณ€ํ™˜ AOP์˜ ์ ์šฉ ๋Œ€์ƒ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง๊ณผ JPA๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํ”„๋ง์€ JPA ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. 

์˜ˆ์™ธ ๋ณ€ํ™˜ AOP ํ”„๋ก์‹œ๋Š” JPA ๊ด€๋ จ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด JPA ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์˜ˆ์™ธ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— @Repository ์• ๋…ธํ…Œ์ด์…˜๋งŒ ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์ด ์˜ˆ์™ธ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” AOP๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

<์ •๋ฆฌ>

  • ORM ๊ธฐ์ˆ ์ธ JPA๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.
  • JPA๋ฅผ ์ด์šฉํ•ด SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • JPA๋Š” ๋‚ด์šฉ์ด ๋ฐฉ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ›„ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

<์ฐธ๊ณ ์ž๋ฃŒ>

 

์Šคํ”„๋ง DB 2ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ™œ์šฉ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธ

www.inflearn.com

 

 

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ