클러버

[클러버] Java Enum을 활용한 프로젝트 개선기 (2)

kidmillionaire1998 2024. 7. 7. 16:54

 

지난번엔 클러버 프로젝트에서의 동아리 리뷰 작성 시 고정된 키워드, 동아리의 소속 분과 등과 같이 값이 변경될 일이 거의 없는 값들의 모음들을 별도의 테이블이 아니라 Enum을 활용해 관리하는 방법에 대해 포스팅을 했다. 

https://minjun98.tistory.com/108

 

[java] Java Enum 활용 프로젝트 개선기 (1)

문제 상황 현재 진행하고 있는 프로젝트에서는 변경되지 않는 값들의 모음이 많은데, 이러한 값들을 별도의 테이블로 분리해서 관리를 해야할 지 고민이 많았다. 대표적인 항목으로는 다음과

minjun98.tistory.com

 

이번에는 프로젝트의 Enum 항목들 중 둘 사이의 포함관계를 가지고 있는 값들을 어떻게 구성하고 관리했는 지에 대해 얘기해보고자 한다. 

 

문제 상황 

프로젝트에서 동아리 테이블 중 학과/단과대 소모임일 경우 소속 학과와 단과대 2가지의 항목을 컬럼으로 가지고 있었다. 예를 들어 , 소프트웨어학부의 소모임이라면 학과 컬럼 값은 '소프트웨어'일거고, 소프트웨어학부의 단과대 소속은 IT대학이므로 단과대 컬럼값에는 'IT대학'으로 컬럼 값을 설정하여 관리하고 있었다. 

소모임 개별 페이지에 들어가면 단과대/학과의 값을 보여준다.

하지만, 이전 포스팅에서 고민했던 것 처럼 학과나 단과대는 추가될 가능성이 거의 없는 항목들이었고 필요한 원소들을 컴파일 타임에 다 알 수 있는 상수 집합이기에 (교내 단과대 및 학과 목록은 정해져 있기 때문) Enum을 도입해야겠다는 생각은 하고 있었다. 하지만, 이를 테이블로 관리를 해야하나?라고 고민하는 도중 생각이 났던 키워드는 데이터베이스 정규화였다. 

 

정규화를 해서 별도의 테이블로 분리해야하나? 

별도의 테이블을 만들지 않고 Enum으로 관리하는 방법에 대한 생각 전이었기에 단과대, 학과를 별도의 테이블로 분리하여 구성할까 생각중이었다. 왜냐하면, 단과대는 non-key column인데 key column이 아닌 컬럼인 학과에 종속되어있기 때문이다.(학과를 알면 어느 소속 단과대인지 결정된다) 동아리 테이블에 이러한 단과대, 학과와 같이 중복된 값들을 분리하지 않고 넣는 것 자체도 문제일 것 같았으며, 학과에 소속된 단과대를 잘못 입력하였을 경우에도 문제가 생길 수 있었다. 

 

하지만 여전히 단과대 및 학과는 추가될 일이 거의 없는 테이블이었으며 이를 테이블로 관리를 할 필요성을 느끼지 못했다. 그리고 필수적인 항목인 학과 컬럼과 비교했을 때 단과대 컬럼은 존재할 이유를 잘 알지 못했다. 자신의 학과 기반으로 동아리를 검색하는 경우는 있어도 본인이 소속되어있는 단과대 중 소속되어있지 않은 학과들 (내가 소프트웨어학과라면 IT대학의 다른 학과인 컴퓨터학부, 글로벌미디어학부 등)의 소모임을 단과대 단위로 검색(IT대학)을 해서 검색할 일이 있을까라는 생각이 들었기 때문이다. 

 

결국 중요하게 고려해야하는 포인트는 크게 아래와 같이 2가지였다. 

 

1. 필수적으로 필요한 컬럼은 학과 컬럼이며 학과 컬럼을 통해 해당 학과가 어떤 단과대에 속해있는 지 알아낼 수 있어야한다. 

2. 단과대 별 학과 전체목록은 보내 줄 수 있어야하기 때문에 단과대에 소속한 학과 목록은 가지고 있어야한다. 

단과대의 전체 목록을 알 수 있어야하며 해당 단과대에 어떤 학과들이 있는지 알 필요성이 있었다.

해결 

저번 포스팅에서도 도움을 받았던 이동욱님의 글을 보고 해답에 대한 힌트를 찾을 수 있었다. 해당 글에서 [3. 데이터 그룹관리]라는 소제목에 해당하는 내용이었다. 

https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 Enum에 관해

techblog.woowahan.com

 

약 8개의 단과대 목록이 있었고 하나의 단과대 목록에 약 10개 정도의 학과가 존재하였다. 

학과(Department) Enum 

모든 학과를 Enum으로 선언했고 이전 포스팅에서 적용했던 EnumMapperType을 구현했다. 이를 통해 학과 code와 title을 알 수 있게 구성했다. 

단과대 동아리 (IT대 소속)은 단과대 컬럼을 의미하는 것이 아니라 별도의 단과대 동아리이다. 이를 통해 조회하면 특정대학에 소속하는 학과의 모든 소모임이 조회되는 것이 아니라 특정 단과대의 동아리만 따로 조회되기 때문에, 학과와 같은 위치를 갖는 다고 판단하여 학과 enum에 추가하였다. 

 

 

단과대(College) Enum 

 

- 단과대 Enum 목록을 추가한 후 해당 단과대에 포함된 학과 Enum 목록들을 EnumSet 형식으로 저장하였다.

- 단과대 enum 또한 EnumMapperType을 구현하기 때문에 code는 Enum 문자열, title은 단과대 이름("IT대학")으로 지정하였다. 

 

학과 -> 단과대 반환 메서드 

특정 학과가 어떤 단과대에 소속되어 있는 지 반환하는 메서드가 필요했다. 

학과 Enum을 인자로 받으며 단과대별로 특정 단과대에 소속되어 있는 학과 목록인 departments를 순회하여 해당 학과 Enum이 있는 지 찾아서 이를 반환한다. 

 

 

EnumMapper를 이용한 학과별 단과대 목록 반환 

이전 포스팅에서 빈으로 등록해둔 EnumMapper을 주입받아 College에 해당하는 EnumMapperVO를 반환한 후, 

해당하는 College Enum으로 변환하여 college enum에 소속되어있는 학과를 반환하여 하나의 responseDTO로 전달했다. 

collegeVos를 다시 College Enum으로 반환하는 작업이 불필요하다고 느껴지긴 했지만 College.values()를 매번 호출하여 객체 생성을 할 필요는 없기 때문에 이를 활용하여 DTO로 변환하기로 했다. 

 

이제 프런트엔드에서 학과목록 하드 코딩은 안해도 될 것 같다

 

 

마무리 

프로젝트 초기에 테이블 설계하는 시점 부터 코드 테이블 항목에 대한 처리는 개선해야할 점이라고 생각했었다. 

컬럼이 code, title 2개만 필요했었고 변경될 가능성이 매우 적었다. 

또한 이번 포스팅에서 다룬 학과와 단과대 같은 경우는 테이블 설계시 정규화 문제도 관련되어있었기 때문에 어떤 방식으로 풀어낼 것인지에 대한 고민이 있었다. 

 

Enum을 통해 포함관계를 구현할 수 있었고 , Enum 클래스 내부에서의 함수를 통해 학과가 소속되어있는 단과대를 찾을 수 있었다. 

또한, 별도의 테이블이 아닌 이전 포스팅에서 적용한 EnumMapper 빈을 통해 Enum 객체를 매번 생성하지 않고 전체 단과대 리스트 및 해당 단과대에 포함되어있는 학과 리스트를 반환할 수 있었다.

 

다시 한번 문제 해결에 큰 도움을 주신 이동욱님께 감사드리고 싶다.