songining
article thumbnail
๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜
BACKEND/Spring 2022. 1. 18. 16:47

ํŠน์ • ํ…Œ์ด๋ธ”์•ˆ์— ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ RDBMS๋Š” ํ…Œ์ด๋ธ” ์•ˆ์— ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ์ด ๋ถˆ๊ฐ€. ์ฆ‰ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๋กœ ๋นผ๋‚ด์•ผ ํ•จ (๋นผ๋‚ธ ํ…Œ์ด๋ธ”์€ Id์™€ ์ปฌ๋Ÿผ ์ „๋ถ€๋ฅผ pk๋กœ ๊ฐ€์ง„๋‹ค.) Ex) //์ฃผ์†Œ @Embedded private Address homeAddress; //HashSet @ElementCollection @CollectionTable(name = "favorite_food", joinColumns = @JoinColumn(name = "member_id")) // FK๋กœ ์žก๊ธฐ ์œ„ํ•จ private Set favoriteFoods = new HashSet(); //ArrayList @ElementCollection @CollectionTable(name = "address", joinC..

์ž„๋ฒ ๋””๋“œ ํƒ€์ž… ์‚ฌ์šฉ๋ฐฉ๋ฒ•
BACKEND/Spring 2022. 1. 18. 15:00

Ex) Member ์—”ํ‹ฐํ‹ฐ //๊ธฐ๊ฐ„ Period @Embedded private Period workPeriod; //์ฃผ์†Œ @Embedded private Address homeAddress; Ex) Period @Embeddable public class Period { private LocalDateTime startDate; private LocalDateTime endDate; ์ƒ์„ฑ์ž Getter, Setter . . } - ํด๋ž˜์Šคํ˜•ํƒœ๋Š” ๊ธฐ์กด๊ณผ ๊ฐ™๊ฒŒ ํ•˜๋ฉฐ ์œ„์™€ ๊ฐ™์ด ๋” ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ - ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ๋งคํ•‘ํ•˜๋Š” ํ…Œ์ด๋ธ”์€ ๊ฐ™๋‹ค. @AttributeOverrides(์†์„ฑํ•˜๋‚˜), @AttributeOverride(์†์„ฑ ์—ฌ๋Ÿฌ๊ฐœ) Ex) ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… Address ์— ๋Œ€ํ•˜์—ฌ..

SpringBoot JPA CASCADE ์˜ˆ์ œ
BACKEND/Spring 2022. 1. 17. 00:33

@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL) //childList๊นŒ์ง€ ํ•จ๊ป˜ persit ๋‚ ๋ ค์ฃผ๊ฒ ๋‹ค๋Š” ์–˜๊ธฐ private List childList = new ArrayList(); ์œ„์™€ ๊ฐ™์ด ํŠน์ • ํ•„๋“œ์— cascade ์„ค์ •์„ ํ•  ๊ฒฝ์šฐ parent๋ฅผ persistํ•  ๋•Œ childList๋„ ํ•จ๊ป˜ persist ๋œ๋‹ค. Ex) Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); ์œ„์™€ ๊ฐ™์ด parent๋งŒ persist ํ•ด์ฃผ์–ด๋„ ๊ทธ ..

article thumbnail
ํ”„๋ก์‹œ
BACKEND/Spring 2022. 1. 16. 17:25

- ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์ง(๋”ฐ๋ผ์„œ ๊ฒ‰๋ชจ์–‘์ด ๊ฐ™๋‹ค) - ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ(target)์„ ๋ณด๊ด€ - ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ** ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์›๋ณธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์†๋ฐ›์Œ . ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ, ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ ์•„๋‹˜. ์ดˆ๊ธฐํ™”๋˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ฐพ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด em.getReference() ํ˜ธ์ถœํ•ด๋„ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๋ฐ˜ํ™˜ Member findMember = em.getReference(Member.class, member); //๋นˆ ๊ป๋ฐ๊ธฐ(ํ”„๋ก์‹œ) //getUsername()์‹œ์— ์‹ค์ œ ์ฟผ๋ฆฌ ์‹คํ–‰ -> ํ”„๋ก์‹œ ์ดˆ๊ธฐํ™” System.out.println("findMem..

์ƒ์†๊ด€๊ณ„ ๋งคํ•‘ + ๊ณ ๊ธ‰ ๋งคํ•‘
BACKEND/Spring 2022. 1. 15. 21:26

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ƒ์†๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ 1. ์กฐ์ธ ์ „๋žต (์ตœ์šฐ์„  ์„ ํƒ, ๋ณต์žกํ•œ๊ฒฝ์šฐ) insert๋Š” ๋ถ€๋ชจ์™€ ์ž์‹์— 2๋ฒˆ / DTYPE์œผ๋กœ ์กฐ์ธํ•  ์ž์‹ ์—”ํ‹ฐํ‹ฐ ๊ตฌ๋ถ„ @Inheritance(strategy = InheritanceType.JOINED) 2. ๋‹จ์ผ ํ…Œ์ด๋ธ” ์ „๋žต(๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ) ํ•œ ํ…Œ์ด๋ธ”์— ํ•ฉ์นœ๋‹ค(JPA์˜ ๊ธฐ๋ณธ์ „๋žต์ž„) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์— ์ ์šฉ @DiscriminatorColumn //DTYPE ์ž์‹์—”ํ‹ฐํ‹ฐ ์ ์šฉ @DiscriminatorValue("A")//์ž์‹ ์—”ํ‹ฐํ‹ฐ ๊ตฌ๋ถ„์ž @MappedSuperclass - ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘์€ ์•„๋‹ˆ์ง€๋งŒ ๊ณตํ†ต๋˜๋Š” ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ!! - ์—”ํ‹ฐํ‹ฐ๋„ ์•„๋‹˜(ํ…Œ์ด๋ธ”..

pk ์‚ฌ์šฉ ์ „๋žต
BACKEND/Spring 2022. 1. 13. 23:08

- null ์ด๋ฉด ์•ˆ๋œ๋‹ค. - ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค. - ์ž์—ฐํ‚ค๋Š” ์ฐพ๊ธฐ ์–ด๋ ค์›€ ๋Œ€์ฒดํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ž! - ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ๋„ ๊ธฐ๋ณธ ํ‚ค๋กœ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค. (์™ ๋งŒํ•˜๋ฉด ์˜๋ฏธ ์—†๋Š” ๊ฐ’์„ pk๋กœ ์„ ํƒํ•˜์ž ex) 1,2,3,4,..) - Auto Increment(IDENTITY) ์•„๋‹ˆ๋ฉด Sequence object ๋‘˜์ค‘์— ํ•˜๋‚˜ ์“ฐ๊ธฐ +) GeneratedValue ๊ฐ€ IDENTITY์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ ์œผ๋กœ persist ์‹œ์— ๋””๋น„์— ๋ฐ”๋กœ Insert query๊ฐ€ ๋‚ ๋ผ๊ฐ„๋‹ค. (๋””๋น„๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฐ’์„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ €์žฅํ•ด์•ผํ•˜๋ฏ€๋กœ) sequence๋Š” ์ปค๋ฐ‹์‹œ์— query +) ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์„ค๊ณ„๋ณด๋‹ค๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ํ•˜์ž! (JPA์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ id ๊ฐ’์„ ์ฐธ์กฐํ•˜์ง€๋ง๊ณ  ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ฐธ์กฐ!)

JPA ์˜์†์„ฑ
BACKEND/Spring 2022. 1. 13. 16:10

JPA์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ 2๊ฐ€์ง€ - ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งคํ•‘ํ•˜๊ธฐ - ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ) ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผ ์—”ํ‹ฐํ‹ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ - ๋น„์˜์† : ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์ƒํƒœ - ์˜์† : ๊ฐ์ฒด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ ์ƒํƒœ (EX) persist() / But, ์ปค๋ฐ‹๊นŒ์ง€ ํ•ด์•ผ ๋””๋น„์— ์ฟผ๋ฆฌ ๋‚ ๋ผ๊ฐ) - ์ค€์˜์† : ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ(detach(entity), clear(), close()) - ์‚ญ์ œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์  • 1์ฐจ ์บ์‹œ • ๋™์ผ์„ฑ(identity) ๋ณด์žฅ (๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์—์„œ ๋น„๊ต์‹œ์—) • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ (transactional write-behind) • ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking) • ์ง€์—ฐ ๋กœ..

JPA ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ 
BACKEND/Spring 2022. 1. 12. 12:25

๊ด€๊ณ„ํ˜• DB๊ฐ€ ์•„๋ฌด๋ž˜๋„ NoSQL๋ณด๋‹ค๋Š” ๋ฉ”์ธ! JPA-> ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋งคํ•‘(๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ๊ด€๊ณ„ํ˜• DB์‚ฌ์ด) -> SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ -> ์ƒ์‚ฐ์„ฑ (CRUD ๊ฐ„๋‹จ) - ์ €์žฅ(persist) ์กฐํšŒ(find) ์ˆ˜์ •(set) ์‚ญ์ œ (remove) - DB์— ๋‹ค์‹œ ์ง‘์–ด๋„ฃ๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ๋จ -> ์œ ์ง€๋ณด์ˆ˜ -> ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ -> ์„ฑ๋Šฅ -> ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ถ”์ƒํ™”์™€ ๋ฒค๋” ๋…๋ฆฝ์„ฑ -> ํ‘œ์ค€

์—”ํ‹ฐํ‹ฐ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
BACKEND/Spring 2022. 1. 11. 20:58

๋ณ€๊ฒฝ๋ฐฉ๋ฒ• 1. ๋ณ‘ํ•ฉ(merge) -> ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ๊ฐ’์œผ๋กœ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝ -> ์„ธํŒ…ํ•ด์ฃผ์ง€ ์•Š์€ ํ•„๋“œ๊ฐ’์€ null๋กœ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ๊ต‰์žฅํžˆ ์œ„ํ—˜ 2. ๋ณ€๊ฒฝ๊ฐ์ง€ -> ํ›จ์”ฌ ๋‚˜์€ ๋ฐฉ๋ฒ• -> ๊ฐ์ง€ํ›„ DB์—์„œ ์•Œ์•„์„œ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ ํ•ด์คŒ / ์›ํ•˜๋Š” ์†์„ฑ๋งŒ ์„ ํƒํ•ด์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ -> ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ˜ธ์ถœํ•  ์„œ๋น„์Šค ์˜์—ญ ์•ˆ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. +) ์—”ํ‹ฐํ‹ฐ ์˜์—ญ์•ˆ์—์„œ ์—…๋ฐ์ดํŠธํ•จ์ˆ˜ ๋งŒ๋“ค๊ณ  ์„œ๋น„์Šค์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ํ•จ์ˆ˜ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค. (์œ ์ง€๋ณด์ˆ˜,์ถ”์  ์œ„ํ•ด) ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋‚ด์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ, ๋ณ€๊ฒฝ, ์กฐํšŒ๋“ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ƒ์„ฑํ•œ๋‹ค. -> ์„œ๋น„์Šค์—์„œ ํ˜ธ์ถœ -> ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์„œ๋น„์Šค ํ˜ธ์ถœ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฐฉ๋ฒ•
BACKEND/Spring 2022. 1. 7. 16:19

- ํ…Œ์ŠคํŠธ๋Š” ๋”ฐ๋กœ application.yml ์„ค์ •ํŒŒ์ผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ -๊ฐ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์—๋Š” @Test ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉฐ ๋งŒ์•ฝ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” @Test(expected = IllegalStateException.class) ์™€ ๊ฐ™์ด ํ•ด๋‹น ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ‹€ ์˜ˆ์‹œ @RunWith(SpringRunner.class) @SpringBootTest @Transactional // ํ…Œ์ŠคํŠธ ๋๋‚ ๋•Œ ๋‹ค์‹œ rollback ํ•ด๋ฒ„๋ฆผ public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test..

SpringBoot JPA ์ƒ์„ฑ์ž ์ฃผ์ž…
BACKEND/Spring 2022. 1. 7. 15:22

-์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์˜ ๊ฒฝ์šฐ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ง€ํ–ฅ ํ›„์— ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์•ˆ์ „ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ. - ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋ฉด @Autowired ์ƒ๋žต ๊ฐ€๋Šฅ - ๋ณ€์ˆ˜์— final ๋ถ™์—ฌ์„œ ํ›„์— ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ - Repository์—์„œ ์‚ฌ์šฉํ•˜๋Š” EntityManager๋Š” @PersistenceContext๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ SpringBoot์—์„œ๋Š” @Autowired๋„ ๊ฐ€๋Šฅ - final์„ ๋ถ™์ธ ๋ณ€์ˆ˜๋ฅผ Lombok์˜ @RequiredArgsConstructor ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž ์ƒ์„ฑ/์ฃผ์ž…ํ•ด์ฃผ๋ฉด ์ผ๊ด€์„ฑ์žˆ๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ ์ •๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ ์šฉํ•œ Repository ์˜ˆ์‹œ) @Repository @RequiredArgsConstructor public class MemberReposi..

Entity ์„ค๊ณ„์‹œ ์ฃผ์˜ํ•  ์ 
BACKEND/Spring 2022. 1. 4. 23:48

1. ๊ฐ€๊ธ‰์ ์ด๋ฉด setter ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž. - ๋ณ€๊ฒฝ ํฌ์ธํŠธ๊ฐ€ ๋งŽ์•„์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง 2. ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ • - LAZY๋กœ ์„ค์ •!!! EX) @ManyToOne(fetch = FetchType.LAZY) 3. ์ปฌ๋ ‰์…˜ ๋ฐ”๋กœ๋ฐ”๋กœ ์„ธํŒ… (์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”) - null ๋ฌธ์ œ ๋ฐฉ์ง€ ์œ„ํ•ด 4. ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€์ผ๋•Œ๋Š” ์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ’ ์„ธํŒ… - ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ๋งŒ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ (DB์—๋Š” ์ฃผ์ธ๋งŒ ๊ฐ€์ ธ๋„ ok) 5. ์ตœ๋Œ€ํ•œ ์–ด๋””์—์„œ dependency์—†์ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋†”๋‘๊ธฐ(ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ! ํ™”๋ฉด ๊ด€๋ จ ๋กœ์ง์€ Form ๊ฐ์ฒด ๋˜๋Š” DTO ์‚ฌ์šฉ) +) manytomany๋Š” ์™ ๋งŒํ•˜๋ฉด ์‚ฌ์šฉx, ์ผ๋Œ€๋‹ค, ๋‹ค๋Œ€์ผ๋กœ ๋‚˜๋ˆ„๊ธฐ +) API ๋งŒ๋“ค๋•Œ์—๋Š” ์ ˆ๋Œ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜(๋…ธ์ถœ)..