diff --git a/content/jpa/ch14.md b/content/jpa/ch14.md index 005ce7b..8280bc6 100644 --- a/content/jpa/ch14.md +++ b/content/jpa/ch14.md @@ -8,10 +8,13 @@ date: '2021-01-28' ## πŸ€Έβ€β™‚οΈλͺ©μ°¨ -- μ»¬λ ‰μ…˜ +- **μ»¬λ ‰μ…˜** - λ‹€μ–‘ν•œ μ»¬λ ‰μ…˜κ³Ό νŠΉμ§•μ„ μ„€λͺ…ν•œλ‹€. -* Converter +* **컨버터** - μ—”ν‹°ν‹°μ˜ 데이터λ₯Ό λ³€ν™˜ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•œλ‹€. -- λ¦¬μŠ€λ„ˆ +- **λ¦¬μŠ€λ„ˆ** - μ—”ν‹°ν‹°μ—μ„œ λ°œμƒν•œ 이벀트λ₯Ό μ²˜λ¦¬ν•œλ‹€. + +* **μ—”ν‹°ν‹° κ·Έλž˜ν”„** - μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ μ—°κ΄€λœ 엔티티듀을 μ„ νƒν•΄μ„œ ν•¨κ»˜ μ‘°νšŒν•œλ‹€. + +--- -* μ—”ν‹°ν‹° κ·Έλž˜ν”„ diff --git a/content/jpa/ch14/14-1.md b/content/jpa/ch14/14-1.md index c14e788..17054d8 100644 --- a/content/jpa/ch14/14-1.md +++ b/content/jpa/ch14/14-1.md @@ -6,27 +6,23 @@ tags: ['Spring Boot JPA'] date: '2021-01-28' --- -- μ»¬λ ‰μ…˜ : λ‹€μ–‘ν•œ μ»¬λ ‰μ…˜κ³Ό νŠΉμ§•μ„ μ„€λͺ…ν•œλ‹€. - -* 컨버터 : μ—”ν‹°ν‹°μ˜ 데이터λ₯Ό λ³€ν™˜ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•œλ‹€. - -- λ¦¬μŠ€λ„ˆ : μ—”ν‹°ν‹°μ—μ„œ λ°œμƒν•œ 이벀트λ₯Ό μ²˜λ¦¬ν•œλ‹€. - -* μ—”ν‹°ν‹° κ·Έλž˜ν”„ : μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  λ•Œ μ—°κ΄€λœ 엔티티듀을 μ„ νƒν•΄μ„œ ν•¨κ»˜ μ‘°νšŒν•œλ‹€. - -## μ»¬λ ‰μ…˜ +## 14.1.1 JPA와 μ»¬λ ‰μ…˜ - `@OneToMany`, `@ManyToMany` λ₯Ό μ‚¬μš©ν•΄μ„œ μΌλŒ€λ‹€λ‚˜ λ‹€λŒ€λ‹€ μ—”ν‹°ν‹° 관계λ₯Ό 맀핑할 λ•Œ μ‚¬μš© * `@ElementCollection`을 μ‚¬μš©ν•΄μ„œ κ°’ νƒ€μž…μ„ ν•˜λ‚˜ 이상 보관할 λ•Œ μ‚¬μš© -ν•˜μ΄λ²„λ„€μ΄νŠΈλŠ” μ—”ν‹°ν‹°λ₯Ό μ˜μ† μƒνƒœλ‘œ λ§Œλ“€ λ•Œ **μ»¬λ ‰μ…˜ ν•„λ“œλ₯Ό ν•˜μ΄λ²„λ„€μ΄νŠΈμ—μ„œ μ€€λΉ„ν•œ μ»¬λ ‰μ…˜(PersistentBag)으둜 κ°μ‹Έμ„œ μ‚¬μš©**ν•œλ‹€. +ν•˜μ΄λ²„λ„€μ΄νŠΈλŠ” μ—”ν‹°ν‹°λ₯Ό μ˜μ† μƒνƒœλ‘œ λ§Œλ“€ λ•Œ **μ»¬λ ‰μ…˜ ν•„λ“œλ₯Ό ν•˜μ΄λ²„λ„€μ΄νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” μ»¬λ ‰μ…˜(PersistentBag)으둜 κ°μ‹Έμ„œ μ‚¬μš©**ν•œλ‹€. > μ»¬λ ‰μ…˜μ„ 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ—”ν‹°ν‹°λ₯Ό μ˜μ† μƒνƒœλ‘œ λ§Œλ“€ λ•Œ 원본 μ»¬λ ‰μ…˜μ„ κ°μ‹ΈλŠ” λ‚΄μž₯ μ»¬λ ‰μ…˜μ„ μƒμ„±ν•΄μ„œ μ‚¬μš©. > -> 래퍼 μ»¬λ ‰μ…˜μ΄λΌκ³ λ„ λΆ€λ₯Έλ‹€. +> 이λ₯Ό **래퍼 μ»¬λ ‰μ…˜**이라고도 λΆ€λ₯Έλ‹€. +> +> λ”°λΌμ„œ μ»¬λ ‰μ…˜ μ‚¬μš© μ‹œ μ¦‰μ‹œ μ΄ˆκΈ°ν™”ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€. +> +> `Collection members = new ArrayList();` ---- +### ν•˜μ΄λ²„λ„€μ΄νŠΈ λ‚΄μž₯ μ»¬λ ‰μ…˜κ³Ό νŠΉμ§• | μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€ | λ‚΄μž₯ μ»¬λ ‰μ…˜ | 쀑볡 ν—ˆμš© | μˆœμ„œ 보관 | | :-----------------: | :------------: | :-------: | :-------: | @@ -34,29 +30,34 @@ date: '2021-01-28' | Set | PersistenceSet | X | X | | List + @OrderColumn | PersistentList | O | O | -### Collection, List +--- -- 쀑볡을 ν—ˆμš©ν•˜λŠ” μ»¬λ ‰μ…˜. `PersistentBag` 을 래퍼 μ»¬λ ‰μ…˜μœΌλ‘œ μ‚¬μš© +## 14.1.2 Collection, List -* `ArrayList` 둜 μ΄ˆκΈ°ν™”ν•œλ‹€. +- 쀑볡을 ν—ˆμš©ν•˜λŠ” μ»¬λ ‰μ…˜. `PersistentBag` 을 래퍼 μ»¬λ ‰μ…˜μœΌλ‘œ μ‚¬μš© -> `ArrayList` 둜 μ΄ˆκΈ°ν™”ν•œλ‹€. - μ—”ν‹°ν‹°λ₯Ό μΆ”κ°€ν•  λ•Œ μ€‘λ³΅λœ μ—”ν‹°ν‹°κ°€ μžˆλŠ”μ§€ λΉ„κ΅ν•˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ μ €μž₯만 ν•œλ‹€. * **μ—”ν‹°ν‹°λ₯Ό 좔가해도 지연 λ‘œλ”©λœ μ»¬λ ‰μ…˜μ„ μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠλŠ”λ‹€.** -### Set +- 같은 μ—”ν‹°ν‹°κ°€ μžˆλŠ”μ§€ μ°Ύκ±°λ‚˜ μ‚­μ œ μ‹œ `equals()` λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. => `.contains(μΈμŠ€ν„΄μŠ€)`, `.remove(μΈμŠ€ν„΄μŠ€)` + +--- + +## 14.1.3 Set -- 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ»¬λ ‰μ…˜. `PersistentSet`을 래퍼 μ»¬λ ‰μ…˜λ‘œ μ‚¬μš© +- 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ»¬λ ‰μ…˜. `PersistentSet`을 래퍼 μ»¬λ ‰μ…˜λ‘œ μ‚¬μš© -> `HashSet` 으둜 μ΄ˆκΈ°ν™”ν•œλ‹€. -* `HashSet` 으둜 μ΄ˆκΈ°ν™”ν•œλ‹€. - 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ `add()` λ©”μ†Œλ“œλ‘œ 객체λ₯Ό μΆ”κ°€ν•  λ•Œ λ§ˆλ‹€ `equals()` λ©”μ†Œλ“œμ™€ `hashcode()` 둜 같은 객체가 μžˆλŠ”μ§€ λΉ„κ΅ν•œλ‹€. -* 같은 객체가 μ—†μœΌλ©΄ 객체λ₯Ό μΆ”κ°€ν•˜κ³  `true` λ°˜ν™˜, 같은 객체가 있으면 좔가에 μ‹€νŒ¨ν•˜κ³  `false` λ°˜ν™˜ + * 같은 객체가 μ—†μœΌλ©΄ 객체λ₯Ό μΆ”κ°€ν•˜κ³  `true` λ°˜ν™˜, 같은 객체가 있으면 좔가에 μ‹€νŒ¨ν•˜κ³  `false` λ°˜ν™˜ + + - **μ€‘λ³΅λœ μ—”ν‹°ν‹°κ°€ μžˆλŠ”μ§€ λΉ„κ΅ν•˜κΈ° λ•Œλ¬Έμ— μ—”ν‹°ν‹°λ₯Ό μΆ”κ°€ν•  λ•Œ 지연 λ‘œλ”©λœ μ»¬λ ‰μ…˜μ„ μ΄ˆκΈ°ν™”ν•œλ‹€.** -- **μ€‘λ³΅λœ μ—”ν‹°ν‹°κ°€ μžˆλŠ”μ§€ λΉ„κ΅ν•˜κΈ° λ•Œλ¬Έμ— μ—”ν‹°ν‹°λ₯Ό μΆ”κ°€ν•  λ•Œ 지연 λ‘œλ”©λœ μ»¬λ ‰μ…˜μ„ μ΄ˆκΈ°ν™”ν•œλ‹€.** +--- -### List + @OrderColumn +## 14.1.4 List + @OrderColumn - `List` μΈν„°νŽ˜μ΄μŠ€μ— `@OrderColumn`을 μΆ”κ°€ν•˜λ©΄ μˆœμ„œκ°€ μžˆλŠ” νŠΉμˆ˜ν•œ μ»¬λ ‰μ…˜μœΌλ‘œ μΈμ‹ν•œλ‹€. -> DB에 μˆœμ„œ 값을 μ €μž₯ν•΄μ„œ μ‘°νšŒν•  λ•Œ μ‚¬μš©ν•œλ‹€. @@ -98,7 +99,7 @@ public class Comment { } ``` -
+### @OrderColumn μ‚¬μš© μ½”λ“œ ```java @@ -112,35 +113,35 @@ em.persist(comment1); Comment comment2 = new Comment("λŒ“κΈ€2"); comment2.setBoard(board); -board.getComments().add(comment2); // POSITION 0 +board.getComments().add(comment2); // POSITION 1 em.persist(comment2); Comment comment3 = new Comment("λŒ“κΈ€3"); comment3.setBoard(board); -board.getComments().add(comment3); // POSITION 0 +board.getComments().add(comment3); // POSITION 2 em.persist(comment3); Comment comment4 = new Comment("λŒ“κΈ€4"); comment4.setBoard(board); -board.getComments().add(comment4); // POSITION 0 +board.getComments().add(comment4); // POSITION 3 em.persist(comment4); ``` -
κ²°κ³Ό
+### κ²°κ³Ό #### BOARD | ID | TITLE | CONTENT | -| :-: | :---: | :-----: | +| :---: | :---: | :-----: | | 1 | 제λͺ©1 | λ‚΄μš©1 | -
+ #### COMMENT | ID | COMMENT | COMMENTS_ID(FK) | POSITION (@OrderColumn) | -| :-: | :-----: | :-------------: | :---------------------: | +| :---: | :-----: | :-------------: | :---------------------: | | 1 | λŒ“κΈ€1 | 1 | 0 | | 2 | λŒ“κΈ€2 | 1 | 1 | | 3 | λŒ“κΈ€3 | 1 | 2 | @@ -148,11 +149,9 @@ em.persist(comment4); --- -### 단점 - -λ‹€μŒμ˜ λ‹¨μ λ“€λ‘œ μ‹€λ¬΄μ—μ„œλŠ” 잘 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. +### @OrderColumn 단점 -κ°œλ°œμžκ°€ 직접 `POSITION` 값을 κ΄€λ¦¬ν•˜κ±°λ‚˜ `@OrderBy`λ₯Ό μ‚¬μš©ν•˜κΈΈ ꢌμž₯ν•œλ‹€. +μ—¬λŸ¬ λ‹¨μ λ“€λ‘œ μ‹€λ¬΄μ—μ„œλŠ” 잘 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. - `@OrderColumn` 을 `Board` μ—”ν‹°ν‹°μ—μ„œ λ§€ν•‘ν•˜λ―€λ‘œ `Comment`λŠ” `POSITION`의 값을 μ•Œ 수 μ—†λ‹€. @@ -166,9 +165,15 @@ em.persist(comment4); - 쀑간에 `POSITION` 값이 μ—†μœΌλ©΄ μ‘°νšŒν•œ `List` μ—λŠ” `null`이 λ³΄κ΄€λœλ‹€. 이 경우 `List` λ₯Ό μ‘°νšŒν•˜λ©΄ μ»¬λ ‰μ…˜μ„ μˆœνšŒν•  λ•Œ `NullPointerException`이 λ°œμƒν•œλ‹€. + - 예λ₯Ό λ“€μ–΄ λŒ“κΈ€ 2λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°•μ œλ‘œ μ‚­μ œν•˜κ³  λ‹€λ₯Έ λŒ“κΈ€μ˜ POSITION 값을 μˆ˜μ •ν•˜μ§€ μ•ŠμœΌλ©΄, POSITION 값은 `[0, 2, 3]` 이 λ˜μ–΄μ„œ 1번 μœ„μΉ˜ 쑰회 μ‹œ μ˜ˆμ™Έ λ°œμƒ + +
+ +> μ΄λŸ¬ν•œ 단점듀 λ•Œλ¬Έμ— λŒ€μ‹ μ— κ°œλ°œμžκ°€ 직접 `POSITION` 값을 κ΄€λ¦¬ν•˜κ±°λ‚˜ `@OrderBy`λ₯Ό μ‚¬μš©ν•˜κΈΈ ꢌμž₯ν•œλ‹€. + --- -## @OrderBy +## 14.1.5 @OrderBy - λ°μ΄ν„°λ² μ΄μŠ€μ˜ `ORDER BY` μ ˆμ„ μ‚¬μš©ν•΄μ„œ μ»¬λ ‰μ…˜μ„ μ •λ ¬ν•œλ‹€. λ”°λΌμ„œ μˆœμ„œμš© μ»¬λŸΌμ„ λ§€ν•‘ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. @@ -190,7 +195,7 @@ public class Team { @OneToMany(mappedBy = "team") @OrderBy("username desc, id asc") // Member의 username ν•„λ“œλ‘œ λ‚΄λ¦Όμ°¨μˆœ, id둜 μ˜€λ¦„μ°¨μˆœ μ •λ ¬ - private Set members = new HashSet(); + private Set members = new HashSet(); // μ΄λ•Œ μˆœμ„œ μœ μ§€λ₯Ό μœ„ν•΄ LinkedHashSet을 λ‚΄λΆ€μ—μ„œ μ‚¬μš© ... } @@ -208,7 +213,4 @@ public class Member { private Team team; ... } - ``` - ----