[JPA] Persistence, ๋งคํ•‘

Updated:

Categories:

Tags: , ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

JPA(Java Persistence API)

  • ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ  ํ•˜๊ธฐ
    https://docs.spring.io/spring-data/jpa/reference/jpa.html

JPA๋ž€?

JPA

  • ORM(Object-Relational Mapping) ๊ธฐ์ˆ ์˜ ํ‘œ์ค€ ์‚ฌ์–‘(๋˜๋Š” ๋ช…์„ธ, Specification)
  • ํ‘œ์ค€์‚ฌ์–‘์ด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์–‘์ด ์ •์˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
  • JPA๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋Š” ๋”ฐ๋กœ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • ๊ตฌํ˜„์ฒด๋กœ๋Š” Hibernate ORM, EclipseLink, DataNucleus ๋“ฑ์ด ์žˆ๋Š”๋ฐ Hiberante ORM์„ ๊ฐ€์žฅ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ
  • JPA๋Š” Java Persistence API์˜ ์•ฝ์ž์ด์ง€๋งŒ ํ˜„์žฌ๋Š” Jakarta Persistence๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ

Data Access Layer์—์„œ JPA์˜ ์œ„์น˜

  • Layerd Architecture์—์„œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์˜ ์ƒ๋‹จ์— ์œ„์น˜
  • ๋ฐ์ดํ„ฐ ์ €์žฅ, ์กฐํšŒ ๋“ฑ์˜ ์ž‘์—…์€ JPA๋ฅผ ๊ฑฐ์ณ JPA์˜ ๊ตฌํ˜„์ฒด์ธ Hibernate ORM์„ ํ†ตํ•ด์„œ ์ด๋ฃจ์–ด์ง
  • Hibernate ORM์€ ๋‚ด๋ถ€์ ์œผ๋กœ JDBC API๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผ

Persistence

  • JPA์—์„œ P๋Š” Persistence๋ฅผ ๋œปํ•จ.
  • ORM์€ ๊ฐ์ฒด(Object)์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๋งคํ•‘์„ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐ์ฒด ์•ˆ์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋Š” ๊ธฐ์ˆ 
  • JPA์—์„œ๋Š” ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์ •๋ณด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์— ์˜ค๋ž˜ ์ง€์†๋˜๋„๋ก ํ•จ.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—๋Š” 1์ฐจ ์บ์‹œ์™€ ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ์˜ ์˜์—ญ์ด ์žˆ์Œ.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ EntityManger

  1. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ƒ์„ฑ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
     import lombok.Getter;
        
     import javax.persistence.*;
        
     @Getter
     @Setter
     @NoArgsConstructor
     @Entity //(1) 
     public class Member {
         @Id  // (2)
         @GeneratedValue  // (3)
         private Long memberId;
        
         private String email;
        
         public Member(String email) {
             this.email = email;
         }
     }
        
    

    (1) JPA ์—”ํ‹ฐํ‹ฐ๋กœ ์‚ฌ์šฉโ†’ members๋ผ๋Š” ํ…Œ์ด๋ธ”์— ๋งคํ•‘๋จ

    (2) ์—”ํ‹ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค

    (3)@GeneratedValue ์–ด๋…ธํ…Œ์ด์…˜์€ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋จ

  2. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ด€๋ จ JPA API

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
     @Configuration
     public class JpaBasicConfig {
         private EntityManager em; 
         private EntityTransaction tx;
        
         @Bean
         public CommandLineRunner testJpaBasicRunner(EntityManagerFactory emFactory) {
             this.em = emFactory.createEntityManager();
        
                
             this.tx = em.getTransaction();
                
             return args -> {
             Member member = new Member("hgd@gmail.com");
             em.persist(member); 
             //์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— member ๊ฐ์ฒด์˜ ์ •๋ณด๋“ค์ด ์ €์žฅ
     				tx.commit();
        				
             Member resultMember = em.find(Member.class, 1L);
             System.out.println("Id: " + resultMember.getMemberId() + ", email: " +
                     resultMember.getEmail());
             };
         }
    
  • EntityManger
    • JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” EntityManager ํด๋ž˜์Šค์— ์˜ํ•ด์„œ ๊ด€๋ฆฌ๋œ๋‹ค.
    • EntityManager ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” (1)๊ณผ ๊ฐ™์ด EntityManagerFactory ๊ฐ์ฒด๋ฅผ Spring์œผ๋กœ๋ถ€ํ„ฐ DI ๋ฐ›์Œ
    • EntityManagerFactory์˜ createEntityManager() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ EntityManager ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    • createEntityManager๋Š” @Entity ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋กœ ์ž๋™์œผ๋กœ ๋งคํ•‘๋˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ์‹œ์ผœ์คŒ.
    • hibernate.hbm2ddl.auto ์†์„ฑ์— ๋”ฐ๋ฆ„. โ†’ ์˜ˆ์ œ๋Š” create๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์Œ.
      • create: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ๊ธฐ์กด ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑ
      • create-drop: create์™€ ๋™์ผํ•˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•จ
      • update: ๊ธฐ์กด ํ…Œ์ด๋ธ”์„ ์œ ์ง€ํ•˜๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ
      • validate: ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ ํ›„ ๋งคํ•‘ ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆ, ๋ณ€๊ฒฝ์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
      • none: ์•„๋ฌด๋Ÿฐ ๋™์ž‘๋„ ํ•˜์ง€ ์•Š์Œ
  • Transaction์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ tx.begin() ๋ฉ”์„œ๋“œ๋ฅผ ๋จผ์ € ํ˜ธ์ถœ
  • find() : ์กฐํšŒ ๊ธฐ๋Šฅ , commit ๋˜๋ฉด Select ์ฟผ๋ฆฌ ๋‚ ๋ฆผ
    • ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ์กฐํšŒํ•  ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ํƒ€์ž…
    • ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ : ์กฐํšŒํ•  ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์‹๋ณ„์ž ๊ฐ’
  • em.persist() : ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ
  • em.flush() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ด๋ธ”์— ๋ฐ˜์˜ โ†’ tx.commit()์ด ํ˜ธ์ถœ๋˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ em.flush()๊ฐ€ ํ˜ธ์ถœ๋จ.
  • tx.commit() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” member ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ์ €์žฅ

1์ฐจ ์บ์‹œ์™€ ์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ

  1. Entity Create, Insert, Select

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด์„œ hibernate.hbm2ddl.auto : create ์†์„ฑ์— ๋”ฐ๋ผ ๊ธฐ์กด ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑํ•จ
      (@Entity ๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค)
    • ๋ถ„ํ™๋ฐ•์Šค์˜ em.persist(member); โ†’ ์—ฌ๊ธฐ์„œ member๊ฐ€ 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋˜๊ณ  ์“ฐ๊ธฐ์ง€์—ฐ์ €์žฅ์†Œ์— insert์ฟผ๋ฆฌ๊ฐ€ ์ €์žฅ๋˜๊ณ (์˜์†์„ฑ์ปจํ…์ŠคํŠธ์— ์ €์žฅ)

    • ์•„๋žซ์ค„์— tx.commit();์ด ์‹คํ–‰๋˜๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ด ์‹คํ–‰๋˜๊ณ  DB์— ์ €์žฅ๋จ.

      ์“ฐ๊ธฐ์ง€์—ฐ์ €์žฅ์†Œ์—๋Š” ์ฟผ๋ฆฌ๋ฌธ์ด ์‹คํ–‰๋˜์–ด ์‚ฌ๋ผ์ง€๊ณ  1์ฐจ์บ์‹œ์— ์žˆ๋˜ member๋Š” ๋‚จ์•„์žˆ์Œ

    • Member result =em.find(Member.class, 1L);
      ์—์„œ 1์ฐจ ์บ์‹œ์— member๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— select ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ์ง€ ์•Š์•„๋„ ์กฐํšŒ ๊ฐ€๋Šฅ โ†’ ์ฝ˜์†”์— ์ถœ๋ ฅ๋„ ์ž˜ ๋จ.
    • ๊ทธ๋Ÿฌ๋‚˜ member_Id๊ฐ€ 2์ธ ๊ฐ์ฒด๋Š” 1์ฐจ ์บ์‹œ์— ์—†์œผ๋ฏ€๋กœ select ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ DB๋ฅผ ์กฐํšŒ ํ•˜๊ณ  ์—†๊ธฐ ๋•Œ๋ฌธ์— null ์ด ๋งž์Œ.
  2. ์—”ํ‹ฐํ‹ฐ ์—…๋ฐ์ดํŠธ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
     private void example(){
        tx.begin();
        em.persist(new Member("jerry5@gmail.com")); 
         // 1์ฐจ ์บ์‹œ์— ๋ณด๊ด€ - snapshot ์ฐ์–ด์„œ ๋ณด๊ด€ 
        tx.commit(); //commit ํ•˜๋Š” ์ˆœ๊ฐ„ ๊ฐ์ฒด์ •๋ณด๊ฐ€ ๋‹ฌ๋ผ์กŒ๋Š”์ง€ ๋น„๊ต ํ•จ
         // ์ฃผ์†Œ๊ฐ’ ๊ณต์œ ํ•ด์„œ ์บ์‹œ์™€ DB๊ฐ€ ๋งž์ง€ ์•Š์œผ๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋˜๊ณ  commit์‹œ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋จ.
                
         //๋‹ค์‹œ transaction ์ƒ์„ฑ
     	 tx.begin();
        Member member1 =em.find(Member.class,1L); 
        //์œ„์—์„œ ์ƒ์„ฑ๋œ ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์ ธ์˜ด. -> 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒ
        member1.setEmail("jerry5@yahoo.co.kr"); 
        //๋ถˆ๋Ÿฌ์˜จ ๊ฐ์ฒด(1์ฐจ์บ์‹œ์— ์žˆ๋Š”)๋ฅผ ๋ฐ”๊ฟˆ.
       // ์ด๋ฏธ ์ด์ „์— ์ฐ์–ด๋†“๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์“ฐ๊ธฐ์ง€์—ฐ์ €์žฅ์†Œ์— ์ฟผ๋ฆฌ๋“ฑ๋ก
        //update ์‹คํ–‰๋จ.(JPA๊ฐ€ ์•Œ์•„์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜์—ฌ update ์ฟผ๋ฆฌ ๋‚ ๋ ค์คŒ)
                        
         }
    
  3. ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ

    • select ์ฟผ๋ฆฌ๋Š” 1์ฐจ ์บ์‹œ์— ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๊ฐ€์ง€ ์•Š์Œ.
    • remove ํ•˜๋ฉด 1์ฐจ ์บ์‹œ๋ฅผ ์ง€์šฐ์ง€๋งŒ ์‚ฌ๋ผ์กŒ๋‹ค๋Š” ์ƒํƒœ๋„ ๋ณด๊ด€ํ•จ.
    • tx.commit()์„ ์‹คํ–‰ํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ 1์ฐจ ์บ์‹œ์— ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์“ฐ๊ธฐ ์ง€์—ฐ SQL ์ €์žฅ์†Œ์— ๋“ฑ๋ก๋œ DELETE ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰
    • tx๋ฅผ ์ปค๋ฐ‹ํ• ๋•Œ ํ”Œ๋Ÿฌ์‹œ๋ฅผ ๊ฐ•์ œ๋กœ ๋ฐœ์ƒ์‹œํ‚ด. โ‡’ ์ปค๋„ฅ์…˜ ํ’€ ๋‹ด๋‹น ํžˆ์นด๋ฆฌ ํ’€

์—”ํ‹ฐํ‹ฐ๋งคํ•‘

์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”

  1. @Entity
    • ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘
    • attribute
      • name: ์—”ํ‹ฐํ‹ฐ์˜ ์ด๋ฆ„ ์„ค์ • ๊ฐ€๋Šฅ, ์ฐธ๊ณ ๋กœ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ ˆ๋Œ€ ์•ˆ๋จ!
  2. @Table
    • ์ฃผ๋กœ ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๋‹ฌ๋ผ์•ผ ํ•  ๊ฒฝ์šฐ์— ์ถ”๊ฐ€
    • name attribute๋กœ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์„ค์ • ๊ฐ€๋Šฅ.
    • @Table ์• ๋„ˆํ…Œ์ด์…˜์€ ์˜ต์…˜์ด๋ฉฐ, ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ
  3. ์ฃผ์˜์‚ฌํ•ญ
    • @Entity ์• ๋„ˆํ…Œ์ด์…˜๊ณผ @Id ์• ๋„ˆํ…Œ์ด์…˜์€ ํ•„์ˆ˜
    • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜๋กœ ์ถ”๊ฐ€

      โ†’ ์ƒ์„ฑ์ž๊ฐ€ ์—†์„๋•Œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜๋กœ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์Šต๊ด€์ ์œผ๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ถ”๊ฐ€ํ•˜๊ธฐ.

    • ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋”ฐ๋กœ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ.

๊ธฐ๋ณธํ‚ค ๋งคํ•‘

@ID ์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ ํ‚ค ์—ด์ด ๋˜๋Š”๋ฐ JPA์—์„œ๋Š” ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ•ด์ค„์ง€ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ์ง€์›

  1. IDENTITY
    • @GeneratedValue(strategy = GenerationType.IDENTITY
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ธฐ๋ณธ ํ‚ค ๋Œ€์‹  ์ƒ์„ฑ
    • Ex) MySQL์˜ AUTO_INCREMENT ๊ธฐ๋Šฅ
  2. SEQUENCE
    • @GeneratedValue(strategy = GenerationType.SEQUENCE)
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ „๋žต
  3. TABLE
    • ๋ณ„๋„์˜ ํ‚ค ์ƒ์„ฑ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต
  4. AUTO
    • @GeneratedValue(strategy = GenerationType.AUTO
    • JPA๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Dialect์— ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์ „๋žต์„ ์ž๋™์œผ๋กœ ์„ ํƒ

ํ•„๋“œ(๋ฉค๋ฒ„๋ณ€์ˆ˜)์™€ Column ๊ฐ„์˜ ๋งคํ•‘

Annotation

annotation Description
@Column ์—ด ๋งคํ•‘
@Temporal ๋‚ ์งœ ํƒ€์ž… ๋งคํ•‘
LocalDateTime ํƒ€์ž…์ผ ๊ฒฝ์šฐ, @Temporal ์• ๋„ˆํ…Œ์ด์…˜์€ ์ƒ๋žต ๊ฐ€๋Šฅ(LocalDateTime์€ ์—ด์˜ TIMESTAMP ํƒ€์ž…๊ณผ ๋งคํ•‘) ย 
@Enumerated enum ํƒ€์ž… ๋งคํ•‘
@Lob BLOB, CLOB ๋งคํ•‘
@Transient ํŠน์ •ํ•„๋“œ๋ฅผ ์ปฌ๋Ÿผ์— ๋งคํ•‘ํ•˜์ง€ ์•Š์Œ (๋งคํ•‘ ๋ฌด์‹œ)
์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ ย 

attribute

์†์„ฑ ๊ธฐ๋ณธ๊ฐ’ Description
updatable true ์ˆ˜์ • ์—ฌ๋ถ€ ์ง€์ •
nullable(DDL) true null ๊ฐ’์˜ ํ—ˆ์šฉ์—ฌ๋ถ€ ์„ค์ •
false ์„ค์ •์‹œ DDL ์ƒ์„ฑ์‹œ์— NOT NULL ์ œ์•ฝ์กฐ๊ฑด ๋ถ™์Œ ย  ย 
columnDefinition(DDL) ย  @Table์˜ uniqueConstraints์™€ ๊ฐ™์ง€๋งŒ ํ•œ ์ปฌ๋Ÿผ์— ๊ฐ„๋‹จํžˆ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฑธ ๋•Œ ์‚ฌ์šฉ
length(DDL) 255 ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž ๊ธธ์ด
unique false ๊ณ ์œ ํ•œ ๊ฐ’๋งŒ, ์ค‘๋ณต ๋ถˆ๊ฐ€
ย  ย  ย 

์• ํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฃผ์˜ ์‚ฌํ•ญ

  • @Column ์• ๋„ˆํ…Œ์ด์…˜์ด ์ƒ๋žต๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ nullable=true ์ž„.
  • int price not null์ผ ๊ฒฝ์šฐ์—๋Š” @Column(nullable=false)๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•จ.

@Enumerated ์• ๋„ˆํ…Œ์ด์…˜์€ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ํƒ€์ž…

  • EnumType.ORDINAL : enum์˜ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅ โ†’ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • EnumType.STRING : enum์˜ ์ด๋ฆ„์„ ํ…Œ์ด๋ธ”์— ์ €์žฅ
  • EnumType.STRING์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
  • ์˜ˆ์ œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
      public enum Day {
          SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
      }
        
      @Entity
      public class Event {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
        
          @Enumerated(EnumType.ORDINAL)
          private Day day;
        
          // getters and setters
      }
    

    Enum ์ƒ์ˆ˜ ๋ณ€๊ฒฝ

    1
    2
    
      public enum Day {
          MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
    

    0์€ MONDAY๋ฅผ, 1์€ TUESDAY๋ฅผ ์˜๋ฏธํ•˜๊ฒŒ ๋˜์–ด ์ž˜๋ชป๋œ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒ

์—”ํ‹ฐํ‹ฐ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘

๋ฐฉํ–ฅ (๋‹จ๋ฐฉํ–ฅ/์–‘๋ฐฉํ–ฅ)

  1. ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„

    ํ•œ์ชฝ ํด๋ž˜์Šค๋งŒ ๋‹ค๋ฅธ ์ชฝ ํด๋ž˜์Šค์˜ ์ฐธ์กฐ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„

    • Member ํด๋ž˜์Šค๊ฐ€ Order ๊ฐ์ฒด๋ฅผ ์›์†Œ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” List ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, Order๋ฅผ ์ฐธ์กฐ
    • Order ์ž…์žฅ์—์„œ๋Š” Member ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ
  2. ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„

    ์–‘์ชฝ ํด๋ž˜์Šค๊ฐ€ ์„œ๋กœ์˜ ์ฐธ์กฐ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„
    ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„ 2๊ฐœ์ž„.

    • ๋‘ ํด๋ž˜์Šค๊ฐ€ ๋ชจ๋‘ ์„œ๋กœ์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, Member๋Š” Order ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ , Order๋Š” Member ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ
  3. JPA๋Š” ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„์™€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋ฐ˜๋ฉด์— Spring Data JDBC๋Š” ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋งŒ ์ง€์›

๋‹ค์ค‘์„ฑ(๋‹ค๋Œ€์ผ/์ผ๋Œ€๋‹ค/์ผ๋Œ€์ผ/๋‹ค๋Œ€๋‹ค)

๋‹ค๋Œ€์ผ[N:1] : @ManyToOne

  1. ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ : ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ, ๋‹ค(N)์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ผ(1)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ์˜๋ฏธ

    • Order๋งŒ Member ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„
    • ์˜ˆ์ œ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
        @NoArgsConstructor
        @Getter
        @Setter
        @Entity(name = "ORDERS")
        public class Order {
        ...
            @ManyToOne   // (1)
            @JoinColumn(name = "MEMBER_ID")  // (2)
            private Member member;
              
            public void addMember(Member member) {
                this.member = member;
            }
      

      (1) @ManyToOne ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ ๋‹ค๋Œ€์ผ์˜ ๊ด€๊ณ„๋ฅผ ๋ช…์‹œ

      (2) @JoinColumn ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ ์™ธ๋ž˜ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ์—ด ์ด๋ฆ„ ์ž‘์„ฑ

      • MEMBER ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค ์—ด ์ด๋ฆ„์ด โ€œMEMBER_IDโ€ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑ
    • ์˜ˆ์ œ) ๋‹ค๋Œ€์ผ์—์„œ ์ผ๋Œ€๋‹ค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      
         	   	  tx.begin();
                Member member 
        			        = new Member("hgd@gmail.com", "Hong Gil Dong",
                        "010-1111-1111");
               	   	  
         	   	  em.persist(member);
              
                Order order = new Order();
                order.addMember(member);     // (2)
                em.persist(order);           // (3)
              
                tx.commit();
              
        				// (4)
                Order findOrder = em.find(Order.class, 1L);
              
                // (5) ์ฃผ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์› ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
                System.out.println("findOrder: " + findOrder.getMember().getMemberId() +
                                ", " + findOrder.getMember().getEmail());
      

      (2) order ๊ฐ์ฒด์— member ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, member ๊ฐ์ฒด๋Š” ์ด MEMBER_ID ๊ฐ™์€ ์™ธ๋ž˜ํ‚ค์˜ ์—ญํ• 

      (3) ์—์„œ ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ์ €์žฅ

      (4) ๋“ฑ๋กํ•œ ํšŒ์›์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ์กฐํšŒ

      (5) findOrder.getMember()์™€ ๊ฐ™์ด ์ฃผ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์› ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅ

      โœ”๏ธ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ฃผ๋ฌธํ•œ ์ฃผ๋ฌธ ์ •๋ณด๋Š” ์กฐํšŒํ•  ์ˆ˜ ์—†์Œ โ†’ ์ผ๋Œ€๋‹ค ๋งคํ•‘์„ ์ถ”๊ฐ€ํ•ด ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„ ๋งŒ๋“ค์–ด์•ผ ํ•จ.

  2. ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ

    • ์–‘์ชฝ์„ ์„œ๋กœ ์ฐธ์กฐ, ๋‹ค ์— ํ•ด๋‹นํ•˜๋Š” ์ชฝ์ด ๊ฐ์ฒด, ์ผ์— ํ•ด๋‹นํ•˜๋Š” ์ชฝ์ด List
      • @ManyToOne
        @JoinColumn(name = โ€œMEMBER_IDโ€)
      • @OneToMany(mappedBy = โ€œmemberโ€)
    • ๋งŒ์•ฝ์— ์ƒˆ๋กœ์šด ์ฃผ๋ฌธ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ์—์„œ๋Š” ์„œ๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ์„œ๋กœ๋ฅผ update ํ•ด์ฃผ์–ด์•ผ ํ•จ.
    • ์–‘์ชฝ์— add ๋ฉ”์„œ๋“œ ์ƒ์„ฑํ›„ commit ํ•˜๋ฉด StackOverFlow ๋ฐœ์ƒ - ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ โ‡’ ์ข…๋ฃŒ์‹œ์  ํ•„์š”

    • ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•จ!

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
        public void addOrder(Order order) {
            orders.add(order); // Order ๊ฐ์ฒด๋ฅผ orders ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
                  
            // Order ๊ฐ์ฒด์˜ member ํ•„๋“œ๊ฐ€ ํ˜„์žฌ Member ๊ฐ์ฒด(this)๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
            if (order.getMember() != this) {
                order.addMember(this); 
                // Order ๊ฐ์ฒด์˜ member ํ•„๋“œ๋ฅผ ํ˜„์žฌ Member ๊ฐ์ฒด(this)๋กœ ์„ค์ •
            }
        }
                  
          public void addMember(Member member){
            this.member = member; 
            // Order ๊ฐ์ฒด์˜ member ํ•„๋“œ๋ฅผ ์ฃผ์–ด์ง„ Member ๊ฐ์ฒด๋กœ ์„ค
              
            // Member ๊ฐ์ฒด์˜ orders ๋ฆฌ์ŠคํŠธ์— ํ˜„์žฌ Order ๊ฐ์ฒด(this)๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
            if (!member.getOrders().contains(this)) {
                member.addOrder(this); 
                // Member ๊ฐ์ฒด์˜ orders ๋ฆฌ์ŠคํŠธ์— ํ˜„์žฌ Order ๊ฐ์ฒด(this)๋ฅผ ์ถ”๊ฐ€
            }
        }
      

      ์ƒˆ๋กœ์šด ์ฃผ๋ฌธ์„ ํ–ˆ๋Š”๋ฐ ์ฃผ๋ฌธ๋ชฉ๋ก์— ๋ฉค๋ฒ„๊ฐ€ ์—†๋‹ค๋ฉด ํ˜„์žฌ ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€

      ๋ฉค๋ฒ„์˜ ์ฃผ๋ฌธ๋ชฉ๋ก์— ์ƒˆ๋กœ์šด ์ฃผ๋ฌธ์ด ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ฃผ๋ฌธ์„ ์ถ”๊ฐ€.

      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
      
         tx.begin();
                Member member = new Member("hgd@gmail.com", "Hong Gil Dong",
                        "010-1111-1111");
                Order order = new Order();
              
                member.addOrder(order); // (1)
                order.addMember(member); // (2)
              
                em.persist(member);   // (3) ํšŒ์›์ •๋ณด ์ €์žฅ
                em.persist(order);    // (4) ์ฃผ๋ฌธ์ •๋ณด ์ €์žฅ
              
                tx.commit();
              
        				// (5) 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒ
                Member findMember = em.find(Member.class, 1L);
              
                // (6) ์ด์ œ ์ฃผ๋ฌธํ•œ ํšŒ์›์˜ ํšŒ์› ์ •๋ณด๋ฅผ ํ†ตํ•ด ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
                findMember
                        .getOrders()
                        .stream()
                        .forEach(findOrder -> {
                            System.out.println("findOrder: " +
                                    findOrder.getOrderId() + ", "
                                    + findOrder.getOrderStatus());
                        });
      

      (1) member์— order๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ํ…Œ์ด๋ธ”์— order ์ž๋™ ์ €์žฅ๋จ.

      But, order๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์—†์Œ, 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋œ member๋Š” order๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ

      (2) order ๊ฐ์ฒด์— member ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, member๊ฐ€ order์˜ ์™ธ๋ž˜ํ‚ค ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— order ๊ฐ์ฒด ์ €์žฅ ์‹œ, ๋ฐ˜๋“œ์‹œ ํ•„์š” โ†’ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฃผ๋ฌธ์ •๋ณด์˜ MEBER_ID ๋Š” Null์ด ๋จ.

์ผ๋Œ€๋‹ค[1:N] : @OneToMany

  1. ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„

    ์ผ(1)์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‹ค(N)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๊ณ„๋ฅผ ์˜๋ฏธ

    • Member๋งŒ List ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„
    • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์™ธ๋ž˜ ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ์Œ
    • Order ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋”๋ผ๋„ ์™ธ๋ž˜ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” MEMBER ํด๋ž˜์Šค์˜ memberId ๊ฐ’์ด ์—†๋Š” ์ฑ„๋กœ ์ €์žฅ๋จ โ†’ ์ด๋Ÿฐ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์— ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ.
    • ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์„ ๋จผ์ € ํ•œ ํ›„์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์„ ์ถ”๊ฐ€ํ•ด์„œ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
    • ์˜ˆ์ œ

      1
      2
      3
      4
      5
      6
      7
      
        @Entity
        public class Member{
        ...
        @OneToMany
        private List<Order> orders = new ArrayList<>();
        ...
        }
      

์ผ๋Œ€์ผ[1:1] : @OneToOne

  • ์ผ๋Œ€์ผ์€ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„๋Š” JPA์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

๋‹ค๋Œ€๋‹ค[N:M] : @ManyToMany

  • ์‹ค๋ฌด์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋Ÿฐ๊ฒŒ ์žˆ๋‹ค ์ •๋„๋งŒ ์ฐธ๊ณ !

Comment

์˜ค๋Š˜ ์ฝ”๋“œ ๋”ฐ๋ผ์ง€๋ฉด์„œ Enum์„ ์•„๋ฌด์ƒ๊ฐ์—†์ด enum์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์—๋Ÿฌ๊ฐ€๋‚˜์„œ ์™œ๊ทธ๋Ÿฐ๊ฐ€ ํ–ˆ๋”๋‹ˆ
Enum์€ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค(java.lang.Enum)์ด๋ฉฐ,
๋ชจ๋“  enum ํƒ€์ž…์€ java.lang.Enum ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋‚˜, extends๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์Œ(์‚ฌ์šฉ๋ชปํ•จ)
์ž๋™์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ extend๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!
๊ทธ๋ฆฌ๊ณ  ๊ผญ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ฒƒ ํ•˜๋‚˜ ๋”๋Š” Order๋Š” Orderby๋กœ ์ธ์‹ํ•˜๋‹ˆ๊นŒ Orders๋กœ ํ…Œ์ด๋ธ”๋ช… ๋ฐ”๊ฟ”์ค˜์•ผํ•จ.

๋‹ค๋ฅธ ๊ฒƒ ๋ณด๋‹ค ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ์—์„œ ์•„์ง ํ—ท๊ฐˆ๋ ค์„œ ๋” ๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค..!

Spring ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment