[Spring Boot - ๐ŸฑPetClinic๐Ÿถ] 5. ํ…Œ์ด๋ธ”๊ณผ ์—”ํ‹ฐํ‹ฐ๐Ÿ—บ

์‘ค๋ฐยท2023๋…„ 4์›” 13์ผ

[Spring Boot - ๐ŸฑPetClinic๐Ÿถ]

๋ชฉ๋ก ๋ณด๊ธฐ
5/11

๐Ÿ”Ž Pet Clinic์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”

์œ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ Pet Clinic Application์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋„์‹ํ™”ํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ์ด๋‹ค. ์ด ๊ทธ๋ฆผ์€ resources/db/mysql/schema.sql ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ https://dbdiagram.io/home์— ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜์™€ ์ƒ๊ด€ ์—†์ด schema๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋‚ด์šฉ์ด๋ฉด ๋˜๋Š” ๋“ฏํ•˜๋‹ค. ์ปฌ๋Ÿผ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด์ฃผ์–ด ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ข‹๋‹ค.

๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ•ด์„ํ•˜์ž๋ฉด ์ผ๋‹จ pets์˜ id๋Š” visits์˜ pet_id์™€ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์ด๋ฃฌ๋‹ค. pets์˜ type_id๋Š” types์˜ id, owner_id๋Š” owners์˜ id์™€ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋ฅผ ์ด๋ฃฌ๋‹ค. vet_specialties์˜ vet_id๋Š” vets์˜ id, specialty_id๋Š” specialties์˜ id์™€ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋ฅผ ์ด๋ฃฌ๋‹ค.

types ํ…Œ์ด๋ธ”๊ณผ specialties ํ…Œ์ด๋ธ”, vets ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ์ •ํ•ด์ ธ ์žˆ๊ณ  ์ถ”๊ฐ€๋‚˜ ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ์•ˆ ๋œ๋‹ค. ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ถ”๊ฐ€/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ pets ํ…Œ์ด๋ธ”๊ณผ owners ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋“ค์ด๋‹ค.

๐Ÿ”Ž Pet Clinic์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

์œ„์˜ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ Pet Clinic Application์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ ์‹œ ํ…Œ์ด๋ธ” ์—ญํ• ์„ ํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ https://app.diagrams.net/ ์—์„œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ UML(Unified Modeling Language)์˜ ํ•˜๋‚˜๋กœ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๊ฐ€์žฅ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ํด๋ž˜์Šค๋Š” BaseEntity๋กœ Integer ํƒ€์ž… id๋งŒ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. BaseEntity๋ฅผ ์ƒ์†๋ฐ›์€ NamedEntity์™€ PersonEntity, Visit์ด ์žˆ๋‹ค. BaseEntity์™€ NamedEntity, PersonEntity๋Š” @MappedSuperClass๋‹ค. @MappedSuperClass๋ž€ ํ…Œ์ด๋ธ”์„ ๊ฐ–์ง€ ์•Š์œผ๋ฉด์„œ @Entity๊ฐ€ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ด๋‹ค. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋“ค์ด ๊ณตํ†ต์œผ๋กœ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ๋“ค์„ ๊ฐ–๊ณ  ์žˆ์–ด ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์—ฌ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ๋ฆฌ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค. Owner ํด๋ž˜์Šค์™€ Vet ํด๋ž˜์Šค๋Š” Person ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ , Pet, PetType, Specialty ํด๋ž˜์Šค๋Š” NamedEntity ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ์ด๋“ค์˜ ์—ฐ๊ด€๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Owner๋Š” List<Pet>์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ , Pet์€ Set<Visit>๊ณผ Set<PetType>๋ฅผ, Vet์€ Set<Specialty>๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

@MappedSuperClass๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€ BaseEntity์˜ ํ•ญ๋ชฉ์„ ์„ค๊ณ„ํ•  ๋•Œ id๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.(์ฐธ๊ณ  ๋งํฌ @MappedSuperClass ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ ์ฐธ๊ณ ) id๋ฅผ BaseEntity์— ํฌํ•จํ•˜๋ฉด ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ํ•œ๋‹ค. Pet Clinic์€ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ์ด๊ณ  ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— BaseEntity์— id๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

@Entity๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋Š” Owner, Vet, Pet, Visit์˜ ๋„ค ๊ฐ€์ง€๋กœ ๊ฐ๊ฐ owners, vets, pets, visits ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋œ๋‹ค.

๐Ÿ—บ Entity Mapping

Entity Mapping์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค ์„ ์–ธ ๋ถ€ ์œ„์ชฝ์— @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ๋„ฃ์–ด์ฃผ๋ฉด Entity๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , @Table(name="table_name")์„ ๋„ฃ์–ด์ฃผ๋ฉด Entity๋ฅผ table_name ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘ํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ฐ ์ปฌ๋Ÿผ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋“ค ์œ„์— @Column ์–ด๋…ธํ…Œ์ด์…˜์„ ๋„ฃ์–ด์ฃผ๋ฉด ์ปฌ๋Ÿผ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ต์…˜๊ฐ’์œผ๋กœ ์ปฌ๋Ÿผ ์ด๋ฆ„, nullable, length ๋“ฑ ์ œํ•œ์‚ฌํ•ญ ๋“ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ด๋ธ” ์„ค๊ณ„์— ๋”ฐ๋ผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์ฐธ๊ณ  ๋งํฌ์˜ Entity Mapping์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

Pet Clinic์—์„œ๋Š” BaseEntity์—์„œ id ๋ณ€์ˆ˜์— @Id, @GeneratedValue(strategy = GenerationType.IDENTITY) ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์˜€๋Š”๋ฐ ์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ ๋œป์€ id ๋ณ€์ˆ˜๋ฅผ PK๋กœ ์ง€์ •ํ•˜๊ณ  ์ƒ์„ฑ ์ „๋žต์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

๐Ÿงฉ ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ๊ธ€์€ ๊ฐ„๋‹จํ•˜๊ฒŒ Pet Clinic Application์˜ ํ…Œ์ด๋ธ”๊ณผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ดํŽด๋ดค๋‹ค. Spring Boot์—์„œ๋Š” Entity Manager๋ฅผ ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†์ด ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ์ ์ ˆํ•˜๊ฒŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—”ํ‹ฐํ‹ฐ์˜ ๋งคํ•‘์€ JPA๊ฐ€ ์•Œ์•„์„œ ํ•ด์ฃผ๋‹ˆ ํŽธํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์ง€๊ธˆ ๋‹จ๊ณ„๋Š” ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋‹จ๊ณ„์—ฌ์„œ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋˜์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ํ…Œ์ด๋ธ” ์„ค๊ณ„์— ๋งž๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ œํ•œ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ฐธ๊ณ  ๋งํฌ์˜ Entity Mapping ์„ค๋ช… ๋งํฌ๋ฅผ ๋‹ณ๋„๋ก ๋“œ๋‚˜๋“ค ๊ฒƒ ๊ฐ™๋‹ค.

[์ฐธ๊ณ ]

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์ž‘์„ฑ ์‚ฌ์ดํŠธ
https://dbdiagram.io/home

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์ž‘์„ฑ ์‚ฌ์ดํŠธ
https://app.diagrams.net/

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฐœ๋…๊ณผ ํ™œ์šฉ๋ฒ•
https://sabarada.tistory.com/72
https://velog.io/@zooneon/ํด๋ž˜์Šค-๋‹ค์ด์–ด๊ทธ๋žจ

@MappedSuperClass ์„ค๋ช…
https://ttl-blog.tistory.com/132

@MappedSuperClass ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ
https://developer-ping9.tistory.com/358

Entity Mapping ์„ค๋ช… -
https://velog.io/@bae12/JPA-04์žฅ-์—”ํ‹ฐํ‹ฐ-๋งคํ•‘

@Id, @GeneratedValue ์„ค๋ช… -
https://ttl-blog.tistory.com/123

profile
๊ฐœ๋ฐœ์ž์ง€๋ง์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€