2023년 1학기때 수강한 데이터베이스 설계 수업을 마치고 되돌아 보는 시간을 가지고자 한다.
원래는 4학년 수업이라 3학년 2학기 이수 중이였던 나는 원래 듣지 못하는 과목이였다. 하지만 진로를 백엔드로 정했기 때문에 정말정말 듣고 싶었고 교수님께 메일까지 보내며 빌넣 성공했다 ^^
해당 수업에서는 어떤 체계적인 과정으로 개념적 설계를 하여 erd를 도출하는지, 도출된 erd에서 검토해야 할 사항은 무엇인지, 검토 이후 어떻게 테이블로 물리적 모델링을 하는지 등 전반적인 데이터베이스 설계 프로세스에 대해 배울 수 있었다. 뿐만 아니라 그 과정에서 코드 데이터 모델링, 이력 데이터 모델링, 인덱스, 비정규화, 성능 향상 등 새로운 데이터베이스 개념에 대해 학습할 수 있었다.
이러한 이론을 기반으로 주어진 영화관 예매 시스템의 업무 기술서를 바탕으로 실제로 영화 예매 시스템을 만들어 보는 프로젝트를 진행했다..(이 프로젝트로 인해 정말 한 학기를 바쁘게 보낸 것 같다 ㅠㅠ)
해당 수업에서 작업한 문서는 아래와 같다
1. ER 다이어그램
2. 엔티티타입 정의서
3. 관계 정의서
4. 용어 사전
5. 도메인 정의서
6. 속성 정의서
7. CRUD 메트릭스
8. 테이블 정의서
9. 인덱스 정의서
정의한 문서는 아래 링크의 docs 폴더에 존재한다.
https://github.com/UOS-DBD
처음에는 왜 이렇게 많은 부분을 문서로 작업하는지 이해할 수 없었지만 프로젝트가 끝낼 때쯤 이해가 되었다. 내가 느낀 이유는 크게 2가지이다
유지 및 보수하기 용이하다
지금은 현재 팀원들이 처음부터 설계를 하여 어떤 엔티티 타입이 존재하고 어떤 관계가 엔티티 타입들 간에 존재하는 지 알고 있지만 제 3자가 프로젝트에 함류 하였을 때 정의서가 없으면 정의서가 있을 때보다 프로젝트를 이해하기 힘들 것 같았다.
개발하기 수월했다.
용어 사전, 도메인 정의서가 있음으로써 새로운 속성이 추가 되었을 때 속성명과 도메인을 새로 지정하기 수월하였다.
구분을 용이하게 하기 위해 프로젝트 데이터베이스에 코드 타입과 상세 코드 테이블을 설계하였다. 하지만 구현 단계에서 코드 테이블이 많은 테이블과 조인이 되고 코드 값(00,01,,,)만 봐서 해당 코드가 무엇을 의미하는지 직관적으로 알기 힘들었다. 그래서 직관적으로 확인이 가능한 자바의 ENUM으로의 개발이 필요했고 ENUM과 코드 테이블 사이에 상호 작용하는 방법이 필요했었다.
구글링을 하다 다음 글들을 보았다.
Legacy DB의 JPA Entity Mapping: https://techblog.woowahan.com/2600/
JAVA enum 활용기: https://techblog.woowahan.com/2527/
스프링에서 변환 역활을 해주는 Converter와 AttributeConverter 인터페이스를 알게 되었고 이를 이용해서 ENUM과 DB의 값을 변환했다.
또한 자바에 대해서 더 깊게 알게 되었던 계기였다. 열겨형 타입인 ENUM이 생각보다 많은 역활을 해준다는 사실과 제네릭 타입은 확정성을 위해 많이 사용된다는 점을 알게 되었다. 관련 지식은 추가적으로 따로 블로그 글을 작성할 계획이다. 내용이 워낙 많다보니..ㅎㅎ
팀에 프론트엔드 개발자가 없어 요즘 유행하는 Rest api를 사용하여 프로젝트를 구현하지 못하였고 MVC 패던 형태로 프로젝트 개발을 진행했다. 그래도 html,css,thymeleaf 지식을 조금이나마 알게 되어 괜찮았다.
1학기에 20학점을 수강하다보니 시간이 절대적으로 부족했다. 쿼리를 작성할 때 단순 구현만을 목표로 하였기에 효율적인 쿼리 작성을 하지 못하여 cross join이 발생하는 쿼리문이 다수 존재했다. 해당 쿼리들은 리팩토링을 진행할 예정이다.