๋ค์ด์ด๊ทธ๋จ์ ํด์ํ์๋ฉด ์ผ๋จ 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 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 ์ด๋ ธํ ์ด์ ์ ๋ฃ์ด์ฃผ๋ฉด 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