Skip to content

Latest commit

Β 

History

History
186 lines (124 loc) Β· 6.97 KB

04.md

File metadata and controls

186 lines (124 loc) Β· 6.97 KB

04. μ—”ν‹°ν‹° 맀핑

🐣 이 글은 κΉ€μ˜ν•œλ‹˜μ˜ 'μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ°'을 κ³΅λΆ€ν•˜λ©° μ •λ¦¬ν•œ κ²ƒμž„μ„ μ•Œλ¦½λ‹ˆλ‹€.


4.1 @Entity

  • ν…Œμ΄λΈ”κ³Ό 맀핑할 ν΄λž˜μŠ€λŠ” @Entity μ–΄λ…Έν…Œμ΄μ…˜μ€ ν•„μˆ˜

  • 속성

    • name

      JPAμ—μ„œ μ‚¬μš©ν•  μ—”ν‹°ν‹° 이름 지정, 보톡 기본값인 클래슀 이름 μ‚¬μš©

  • μ£Όμ˜μ‚¬ν•­

    • κΈ°λ³Έ μƒμ„±μžλŠ” ν•„μˆ˜
    • final, enum, interface, inner ν΄λž˜μŠ€μ—μ„œλŠ” μ‚¬μš© λΆˆκ°€
    • μ €μž₯ν•  ν•„λ“œμ— final λΆˆκ°€

4.2 @Table

  • 엔티티와 맀핑할 ν…Œμ΄λΈ”μ„ 지정

  • 속성

    • name

      맀핑할 ν…Œμ΄λΈ” 이름, κΈ°λ³Έκ°’μœΌλ‘œλŠ” μ—”ν‹°ν‹° 이름 μ‚¬μš©

    • catalog

      catalog κΈ°λŠ₯이 μžˆλŠ” λ””λΉ„μ—μ„œ catalogλ₯Ό 맀핑

    • schema

      schema κΈ°λŠ₯이 μžˆλŠ” λ””λΉ„μ—μ„œ schemaλ₯Ό 맀핑

    • uniqueConstraints(DDL)

      DDL 생성 μ‹œμ— μœ λ‹ˆν¬ μ œμ•½μ‘°κ±΄μ„ λ§Œλ“¦, 2개 μ΄μƒμ˜ 볡합 μœ λ‹ˆν¬ μ œμ•½μ‘°κ±΄λ„ κ°€λŠ₯
      μŠ€ν‚€λ§ˆ μžλ™ 생성 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ DDL을 λ§Œλ“€ λ•Œλ§Œ κ°€λŠ₯


4.3 λ‹€μ–‘ν•œ 맀핑 μ‚¬μš©

  • μƒλž΅

4.4 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ μžλ™ 생성

  • JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” κΈ°λŠ₯을 지원(JPA 2.1λΆ€ν„°λŠ” μžλ™ 생성을 ν‘œμ€€ 지원, update, validate μ˜΅μ…˜ X)

  • 클래슀의 맀핑 정보와 λ°μ΄ν„°λ² μ΄μŠ€ 방언을 μ‚¬μš©ν•˜μ—¬ μŠ€ν‚€λ§ˆ 생성

  • <propery name="hibernate.hbm2ddl.auto" value="create" />

    λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό persistence.xml 에 μΆ”κ°€ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œμ μ— λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ„ μžλ™μœΌλ‘œ 생성

    • valueμ—λŠ” λ‹€μŒκ³Ό 같은 μ˜΅μ…˜λ“€μ΄ 듀어감
      • create : κΈ°μ‘΄ ν…Œμ΄λΈ” μ‚­μ œ ν›„ μƒˆλ‘œ 생성
        (개발 초기, CI μ„œλ²„)
      • create-drop : create 속성 + μ’…λ£Œμ‹œ ν…Œμ΄λΈ” 제거
        (CI μ„œλ²„)
      • update : λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό μ—”ν‹°ν‹° 맀핑정보λ₯Ό λΉ„κ΅ν•˜μ—¬ λ³€κ²½ μ‚¬ν•­λ§Œ μˆ˜μ •
        (개발 초기, ν…ŒμŠ€νŠΈ μ„œλ²„)
      • validate : λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό μ—”ν‹°ν‹° 맀핑정보λ₯Ό λΉ„κ΅ν•˜μ—¬ λ³€κ²½ 사항 λ°œμƒμ‹œ κ²½κ³  및 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ X (ν…ŒμŠ€νŠΈ μ„œλ²„, μŠ€ν…Œμ΄μ§• μ„œλ²„, 운영 μ„œλ²„)
      • none : μžλ™ 생성 κΈ°λŠ₯을 μ‚¬μš© μ•ˆν•  μ‹œμ—λŠ” μœ νš¨ν•˜μ§€ μ•Šμ€ κ°’ μž‘μ„±(none도 μœ νš¨ν•˜μ§€ μ•Šμ€ κ°’)
        (μŠ€ν…Œμ΄μ§• μ„œλ²„, 운영 μ„œλ²„)
  • <propery name="hibernate.show_sql" value="true" />

    참고둜 ν•΄λ‹Ή 속성을 μ§€μ •ν•˜λ©΄ μ½˜μ†”μ— μ‹€ν–‰λ˜λŠ” DDL을 좜λ ₯

  • <propery name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImproveNamingStrategy" />

    참고둜 λ‹€μŒκ³Ό 같은 속성을 μ‚¬μš©ν•˜λ©° ν…Œμ΄λΈ” λͺ… ν˜Ήμ€ 컬럼 λͺ…이 μƒλž΅λ˜λ©΄ 카멜 μΌ€μ΄μŠ€λ₯Ό μ–Έλ”μŠ€μ½”μ–΄ μΌ€μ΄μŠ€λ‘œ 맀핑


4.5 DDL 생성 κΈ°λŠ₯

  • μ»¬λŸΌμ— λ‹€μŒκ³Ό 같이 μ œμ•½μ‘°κ±΄μ„ μΆ”κ°€ν•  수 있음

    // not null, 길이 = 10
    @Column(name="NAME", nullable = false, length = 10)
    private String userName;
  • @Table 에 uniqueConstraints 속성을 μ‚¬μš©ν•˜λ©΄ μœ λ‹ˆν¬ μ œμ•½μ‘°κ±΄μ„ μΆ”κ°€ν•  수 있음

    @Table(name="MEMBER", uniqueConstrains = {@UniqueConstraint(
    	name = "NAME_AGE_UNIQUE",
        columnNames = {"NAME", "AGE"}
    )})
  • ν•΄λ‹Ή κΈ°λŠ₯듀은 DDL을 μžλ™μœΌλ‘œ 생성할 λ•Œλ§Œ μ‚¬μš©λ˜λ©° JPA의 μ‹€ν–‰ λ‘œμ§μ—λŠ” 영ν–₯을 주지 μ•ŠμŒ


4.6 κΈ°λ³Έ ν‚€ 맀핑

  • JPAκ°€ μ œκ³΅ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ κΈ°λ³Έ ν‚€ 생성 μ „λž΅μ€ λ‹€μŒκ³Ό κ°™μŒ

    • 직접 ν• λ‹Ή : κΈ°λ³Έ ν‚€λ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 직접 ν• λ‹Ή

      @Id 적용 κ°€λŠ₯ μžλ°” νƒ€μž…

      • κΈ°λ³Έν˜•, λž˜νΌν˜•
      • String
      • java.util.Date
      • java.sql.Date
      • java.math.BigDecimal
      • java.math.BigInteger

      κΈ°λ³Έ ν‚€ 직접 ν• λ‹Ή μ „λž΅μ€ em.persist()둜 μ—”ν‹°ν‹°λ₯Ό μ €μž₯ν•˜κΈ° μ „ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κΈ°λ³Έ ν‚€λ₯Ό 직접 ν• λ‹Ή

    • μžλ™ 생성 : λŒ€λ¦¬ ν‚€ μ‚¬μš© 방식

      ν‚€ 생성 μ „λž΅μ΄ λ‹€μ–‘ν•œ μ΄μœ λŠ” λ°μ΄ν„°λ² μ΄μŠ€ λ²€λ”λ§ˆλ‹€ μ§€μ›ν•˜λŠ” 방식이 λ‹€λ₯΄κΈ° λ•Œλ¬Έ
      ex) 였라클 - μ‹œν€ΈμŠ€ 제곡 , MySQL - μ‹œν€ΈμŠ€ 미제곡

      μžλ™ 생성 μ „λž΅μ„ μ‚¬μš©μ‹œμ— @GeneratedValue λ₯Ό μΆ”κ°€ν•˜κ³  μ›ν•˜λŠ” ν‚€ 생성 μ „λž΅ 선택
      μ΄λ•Œ, persistence.xml에 hibernate.id.new_generator_mappings=trueλΌλŠ” 속성을 λ°˜λ“œμ‹œ μΆ”κ°€

      • IDENTITY : κΈ°λ³Έ ν‚€ 생성을 λ°μ΄ν„°λ² μ΄μŠ€μ— μœ„μž„

        주둜 MySQL, PostgreSQL, SQL Server, DB2μ—μ„œ μ‚¬μš©

        데이터λ₯Ό INSERTν•œ 뒀에 κΈ°λ³Έ ν‚€ 값을 쑰회 κ°€λŠ₯ν•˜λ―€λ‘œ 좔가적인 λ°μ΄ν„°λ² μ΄μŠ€ μ‘°νšŒκ°€ ν•„μš”
        ν•˜μ§€λ§Œ ν•˜μ΄λ²„λ„€μ΄νŠΈμ—μ„œλŠ” Statement.getGeneratedKeys() λ₯Ό μ‚¬μš©ν•˜μ—¬ μ €μž₯κ³Ό λ™μ‹œμ— κΈ°λ³Έ κΈ° 값을 κ°€μ Έμ˜΄

        μ—”ν‹°ν‹°κ°€ μ˜μ† μƒνƒœκ°€ 되렀면 μ‹λ³„μž 값을 가지고 μžˆμ–΄μ•Όν•˜λŠ”λ°, ν•΄λ‹Ή μ „λž΅μ€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν•œλ²ˆ 거쳐 μ‹λ³„μž 값을 μ•Œμ•„μ˜¬ 수 μžˆμœΌλ―€λ‘œ 'νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜λŠ” μ“°κΈ° 지연'이 λ™μž‘ν•˜μ§€ μ•ŠμŒ

      • SEQUENCE : λ°μ΄ν„°λ² μ΄μŠ€ μ‹œν€ΈμŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ ν‚€λ₯Ό ν• λ‹Ή

        μ‹œν€ΈμŠ€λŠ” μœ μΌν•œ 값을 μˆœμ„œλŒ€λ‘œ μƒμ„±ν•˜λŠ” νŠΉλ³„ν•œ λ°μ΄ν„°λ² μ΄μŠ€ 였브젝트, ν•΄λ‹Ή μ „λž΅μ€ 이 였브젝트λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ ν‚€ 생성(Oracle, PostgreSQL, DB2, H2)

        @SequenceGeneratorλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œν€ΈμŠ€ 생성 κ°€λŠ₯

        λ°μ΄ν„°λ² μ΄μŠ€ μ‹œν€ΈμŠ€λ₯Ό 톡해 μ‹λ³„μžλ₯Ό μ‘°νšŒν•˜λŠ” μΆ”κ°€ μž‘μ—…μ΄ ν•„μš”, λ”°λΌμ„œ 2번 톡신

        1. μ‹λ³„μžλ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œν€ΈμŠ€λ₯Ό 쑰회
        2. μ‘°νšŒν•œ μ‹œν€ΈμŠ€λ₯Ό κΈ°λ³Έν‚€ κ°’μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ 데이터 μ €μž₯

        JPAμ—μ„œλŠ” μ‹œν€€μŠ€μ— μ ‘κ·Όν•˜λŠ” 횟수λ₯Ό 쀄이기 μœ„ν•΄ @SequenceGenerator.allocationSize λ₯Ό μ‚¬μš©
        이 값을 μ €μž₯ν•˜μ—¬ ν•œλ²ˆμ— μ‹œν€ΈμŠ€ 값을 증가 μ‹œν‚€κ³  ν•΄λ‹Ή λ©”λͺ¨λ¦¬μ— μ‹œν€€μŠ€ 값을 ν• λ‹Ή

      • TABLE : ν‚€ 생성 ν…Œμ΄λΈ” μ‚¬μš©

        ν‚€ 생성 μ „μš© ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  이곳에 이름과 κ°’μœΌλ‘œ μ‚¬μš©ν•  μ»¬λŸΌμ„ λ§Œλ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œν€€μŠ€λ₯Ό ν‰λ‚΄λ‚΄λŠ” μ „λž΅, μ΄λŠ” ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€μ— 적용 κ°€λŠ₯

      • AUTO : λ°μ΄ν„°λ² μ΄μŠ€ 방언에 따라 κΈ°λ³Έ ν‚€λ₯Ό 생성

        였라클 - SEQUENCE, MySQL - IDENTITY

        λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 변경해도 μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš”κ°€ μ—†μŒ

  • ꢌμž₯ μ‹λ³„μž 선택 μ „λž΅

    • μžμ—° ν‚€ : λΉ„μ§€λ‹ˆμŠ€μ— μ˜λ―Έκ°€ μžˆλŠ” ν‚€(주민번호, μ „ν™”λ²ˆν˜Έ)
    • λŒ€λ¦¬ ν‚€ : λΉ„μ§€λ‹ˆμŠ€μ™€ κ΄€λ ¨ μ—†λŠ” μž„μ˜λ‘œ λ§Œλ“€μ–΄μ§„ ν‚€(μ‹œν€€μŠ€, auto_increment)
    • μžμ—° ν‚€ λ³΄λ‹€λŠ” λŒ€λ¦¬ ν‚€ ꢌμž₯
      • μ „ν™”λ²ˆν˜Έλ‘œ ν‚€κ°€ μ„ μ •λ˜λ©΄ μ „ν™”λ²ˆν˜Έκ°€ μ—†μ–΄μ§ˆ μˆ˜λ„ 있고 변경될 κ²½μš°κ°€ λ‹€λΆ„
      • λΉ„μ§€λ‹ˆμŠ€ ν™˜κ²½μ€ μ–Έμ œλ‚˜ λ°”λ€” μœ„ν—˜μ΄ λ„λž˜
      • JPAμ—λŠ” λͺ¨λ“  엔티티에 μΌκ΄€λœ λ°©μ‹μœΌλ‘œ λŒ€λ¦¬ ν‚€ μ‚¬μš©μ„ ꢌμž₯

4.7 ν•„λ“œμ™€ 컬럼 맀핑: 레퍼런슀

  • μƒλž΅