저번 프로젝트 만들 때, 아쉬웠던 점들을 최대한 보완해보려고 한다.
아쉬웠던 부분
- Item 정보 중, ItemType(상품등급), ItemCategory(상품카테고리) 설계하는 더 나은 방법을 찾았으면 한다.
- 카테고리별로 상품 페이징하는 부분에서 아쉬운점이 있다.
- 그 외 코드 리팩토링
Enum 활용하여 개선해보자.
이전 프로젝트 설계했을 때, Item 필드에 ItemType(상품 등급), ItemCategory(상품 카테고리)가 있는데 String 문자열로 선언했었다.
자바의 enum 타입을 매핑한다.
- enum을 활용하여, 객체간 책임을 확실히 분리하도록 하자.
- 객체가 상태(값)와 행위(로직)을 갖고 있는 것이 좋다.
상품 등급과 카테고리를 명확히 표현하며, 각 타입은 본인이 수행해야할 기능과 책임만 가질 수 있게 하려면
기존 방식으로는 해결하기가 어렵다고 생각하였습니다.
그래서 이를 Enum으로 전환하였습니다.
Java의 Enum은 결국 클래스인 점을 이용하여, Enum의 상수에 카테고리 종류 문자열을 갖도록 하였습니다.
각 Enum 상수들은 본인들이 갖고 있는 문자열들을 확인하여 문자열 인자값이 어느 Enum 상수에 포함되어 있는지 확인할 수 있게 되었습니다.
enum 클래스는 다음과 같다.
특정 typeCode가 있을 때 이 값이 어떤 카테고리 타입인지 CategoryType에 직접 물어보면(enumOf) 된다.
추가할 카테고리 타입이 있는 경우엔 CategoryType에 추가하면 된다.
ItemType도 enum 타입으로, 상품 등급정보를 명확하게 표현한다.
다음은 enum 이름으로 매핑한다.
JPA 경우, 위 처럼 @Enumerated(EnumType.STRING)를 선언했을 때 Enum 필드가 테이블에 저장시 Enum의 이름으로 저장된다.
전체 값이 변경되버리는 위험한 일이기 때문에 Enum에선 @Enumerated를 함께 사용해야 한다.
자바 ORM 표준 JPA 프로그래밍 책, 4.7.2절을 참고하면 좀 더 자세히 확인할 수 있다.
컨트롤러에서 사용하기
변경하기 전
개선했을 때
select box로 그룹 리스트를 출력해야하는 경우엔 CategoryType.enumOf()을 사용하면 아주 쉽게 대응할 수 있다
뷰 템플릿 코드를 작성할 때, Enum 값을 가져와서 쓰면 된다. 상품 등록할 때 '카테고리 선택' '상풍등급 선택' select 박스를 구현해야 하는데, Enum의 값을 순회하면서 값을 출력해주었다.
- 뷰에서 사용할 Enum을 모델을 통해서 뷰에 전달한다.
- Controller에서 보낸 "categoryTypes" "itemTypes"를 반복문을 돌면서 th:text, th:value로 출력한다.
테스트 코드를 작성해서 확인해보자.
카테고리 타입코드에 따라 CategoryType에게 물어보고 값을 가져오는 것을 명확하게 확인할 수 있다.
후기
Enum 활용했을 때, Item에 필요한 CategoryType, ItemType, ItemSellStatus (카테고리 타입, 상품등급, 판매상태) 등등 역할을 명확하게 보이도록 설계할 수 있게 되었다.
"객체간 책임을 확실히 분리" 하도록, 필요한 경우 enum을 활용하면 좋을 것 같다고 느꼈다.
참고자료
'프로젝트 > 개인 프로젝트 V2' 카테고리의 다른 글
6) 파일 업로드 (0) | 2023.06.14 |
---|---|
5) Paging Query (1) | 2023.06.13 |
2) 도메인 모델과 테이블 설계 (0) | 2023.06.13 |
3) 요구사항 구현 & 계층형 구조 (0) | 2023.06.13 |
1) SpringBoot & Github 프로젝트 생성하기 (0) | 2023.06.13 |
댓글