[JPA] 간단한 사이드 프로젝트를 위한 데이터베이스 설계
공부하고 있는 JPA를 활용하여 간단한 사이드프로젝트를 만들어 보고자한다.
프로젝트 주제는 '동물병원' 이고, 구현하고자 했던 기능은 아래와 같다.
(조금 더 프로젝트를 다듬어서 엔티티는 어떻게 만들었는지도 추후 정리할 것이다)
기능설명
1. 동물의 종류는 한 가지가 아니다.
2. 의사들은 진료기록을 조회, 등록, 수정, 삭제를 할 수 있다.
3. 진료받는 공통의 진료가 있고, 동물 종류마다 다른 진료가 있다.
4. 의사 이름과 동물이름으로 진료기록으로 조회할 수 있다.
5. 동물이름으로 진료기록을 삭제 할 수 있다.
데이터베이스 설계
어떻게 해야할지 머릿속으로 생각은 나는데 구체적으로 정리가 안되서 손으로 그려가면서 정리를 했다.
정규화 과정을 거쳐서 데이터베이스 설계를 해야한다는 것을 알고있지만, 아직 그렇게 하기가 어려워서 필요한 테이블과 컬럼을 정하면서 그렸다, 지웠다를 무한반복했다.
처음에는 어렵지 않을거라고 생각했던 테이블 설계였는데, 개인적으로 어려웠던 부분은 "진료받는 공통의 진료가 있고, 동물 종류마다 다른 진료가 있다." 라는 기능을 구현하기 위해 필요한 설계였다.
도대체 공통 진료부위 테이블과 동물 종류마다 다른 진료부위를 저장하기 위한 테이블을 어떻게 연결해야 내가 원하는 결과대로 조회할 수 있을까에 대해서 엄청나게 고민을했다. 둘을 연결하는게 맞는것일지, 아니면 연결지으면 안되는 것인지, 공통진료 테이블이 정말 필요한 것인지에 대해서 고민이 되기 시작했다.
아래 사진은 그 고민의 흔적들이다. 사실 이렇게 그린 페이지만 10페이지가 넘는데 그나마 조금 알아보기 쉬운 것들로만 첨부한다🙄
마지막 사진이 최종으로 내가 완성한 ERD 설계도이다. 인텔리제이에 있는 ERD 그리기 기능을 이용해서 만들었다. 위에 내가 고민하던 부분에서 내가 내린 결론은 공통진료 테이블과 동물종류마다 다른 진료부위 테이블은 연결을 하지 않았다. 동물종류별 진료부위 테이블과 동물종류타입 테이블을 다대일로 연결하는 방식을 선택했고, 진료기록 테이블과 공통진료부위 테이블을 양방향관계로 놓는 방식을 선택했다.(JPA에서는 양방향 설계는 지양해야하기 때문에 중간 테이블을 하나 만들어서 일대다 다대일로 만들었다.) 왜 이렇게 선택을 했냐면 만약 테이블을 연결한다면 진료기록테이블과, 공통진료부위 테이블, 동물종류별 진료부위 테이블 이 3가지가 모두 다대다로 연결이 된다고 생각했다. 연결짓지 않는다면 필요없는 중간테이블이 내가 연결지음으로써 맍아진다고 생각했고, 이게 옳은 방향인가에 대해 고민하다가 결국 두 개를 연결짓지 않고 테이블을 설계했다. 아직도 이거에 대한 명확한 해답?은 모르겠다. 이미 이대로 프로젝트를 진행하긴 했지만 더 고민을 해봐야겠다.
느낀점
데이터베이스 설계하는 거 정말 너무 어렵고 어려웠다. 사실 생각해보면 내가 하고자 했던 기능들이 어려운 기능은 아니었기에 기능구현자체를 하는 시간보다 데이터베이스 설계하는데 가장 많은 시간을 할애했던 것 같다. 이렇게 하나씩 배운 것을 정리해보고 습득해나가야지