모든 언어들의 Enum 의 장점은 아래와 같다
1. 문자열(String)과 비교해, IDE의 지원(자동완성, 오타검증, 텍스트 리팩토링)을 받을 수 있다
2. 허용 가능한 값에 대한 제한이 가능하다
3. 리팩토링의 변경 범위를 최소화할 수 있다
IDE(integrated Development Environment)란, 개발자가 소프트웨어를 개발할 때 사용하는 소프트웨어 어플리케이션을 말한다
코딩, 디버그, 컴파일, 배포등의 작업을 하나의 IDE 프로그램 안에서 처리할 수 있다
IDE 프로그램을 사용하면 소프트웨어 편집, 빌드, 테스트, 패키징과 같은 기능을 사용하기 쉽다
이는 개발자가 코드 짜는 데에만 집중하게 해 생산성을 높게 한다
많이 알려진 IDE 프로그램은 VS, InteliJ, Vim 등이 있다
Java의 enum은 C 또는 C++의 Enum 과 다른 모습을 보인다
C/C++의 경우 Enum이 int 값을 가진다
그러나 Java의 Enum은 .java 파일의 클래스로 분류된다
그렇다면, Java가 추가적으로 갖는 Enum의 장점은 무엇일까?
1. 데이터 간 연관관계를 표현한다
RDB(Relational DataBase)는 이름에서 볼 수 있는 바와 같이 table 간의 연관성을 부여할 수 있다
table들이 갖는 연관성을 모두 내부 코드에서 if문 등의 조건문으로 표현한다면 코드양이 증가하고, 반복성 코드가 발생한다
Enum을 생성해 table의 상태를 Enum 과 Enum 상수로 표현 할 수 있다
Enum 내부의 getter를 통해 외부로 enum 값을 가져와 if 문으로 경우의 수를 표현했던 것을 enum의 종류로 표현할 수 있다
2. 상태와 행위를 한 곳에서 관리한다
DB의 값이 A, B, C인 상태일 때마다 똑같은 메서드를 적용해야한다
이때 필요한 메서드는 DB의 값 체크 메서드와, 별개의 클래스에 제작해야 하는 코드 적용 메서드이다
그 때 코드 적용 메서드를 여러 개 만들게 되면서 메소드를 중복 생성할 수 있다
메서드를 중복 생성 하게되면 관리해야하는 메서드가 많아지면서 유지보수, 리팩터링이 어려워진다
추상메소드를 통해 각 enum값에서 재정의 하거나 함수를 추가해 인자값으로 계산식을 줄 수 있다(Java 8부터 람다 Lamda)식 가능)
보통 Enum은 DB에서 Enum name 이 아닌 1,2 등 Enum 클래스의 인덱스로 읽힌다
Entity 클래스의 경우 @Enumerated(EnumType.STRING)을 선언해 숫자값이 아닌 Enum 이름(Plus, Minus 등)을 저장할 수 있다
3. 데이터 그룹관리가 가능하다
결제 방법에 대해 그룹화를 하여 표현하면 더 다양한 종류의 상태들을 if문을 최소화하여 가독성이 좋고 유지보수, 리팩토링 하기 좋은 코드로 만들 수 있다
Enum 상수에 각 그룹의 상태들을 모두 Enum으로 전환한다
결제방식 Enum에 알맞은 결제종류 enum을 Array로 만들어 넣는다
Array의 stream과 람다식을 사용해 enum 상수들을 순회해 결제종류를 갖는 결제방식 enum 상수를 리턴한다


4. 관리주체를 DB에서 객체로 변경한다
매직 넘버를 조건문에서 기준으로 사용할 때 DB만 봐서는 알 수 없고, 코드를 살펴봐야한다
그런데 복잡한 코드 내에 매직넘버를 가리키는 변수를 찾기 어렵다
문서화했다고 해도 매번 문서 업데이트가 이루어지기 힘들다
따라서 코드 테이블 조회 쿼리를 실행해야했다
서비스 로직을 추가할 때 추가할 위치가 불분명했다
카테고리의 경우 추가가 잘 되지 않는 영역을 테이블로 관리하면 단점이 많다
Enum으로 관리하여 인터페이스를 통해 일관된 방식으로 관리하는 것이 좋다
아래 방법을 통해 구현할 수 있다
1) 클래스 생성자로 일관된 타입을 받기 위한 인터페이스를 생성한다
2) 값을 담을 value 클래스에 인터페이스를 생성자 매개변수로 받는다
(code,title getter 와 Json형식의 toString() 메서드 생성)
3) 인터페이스를 구현하는 Enum을 만든다(code, title getter 생성)
4) 스트림, 람다로 enum을 value 클래스로 변환해 전달한다
스프링의 @Bean 어노테이션 이용하면 value 인스턴스 생성의 반복을 막을 수 있다고 한다
value 클래스 담을 팩토리클래스를 생성하고 Class<? extends 인터페이스> enum를 매개변수 타입으로 지정한다
이를 통해 인터페이스를 구현한 enum만 리스트에 담을 수 있도록 제한한다
인터페이스를 Bean으로 등록해 클래스처럼 사용하고 get()함수 사용한다
아직 스프링과 DB에 대해 아는 내용이 많지 않은데 이번 공부를 통해서 Java와 내부적으로 연결되어 어떻게 사용하는지 대략적으로 살펴볼 수 있었다
앞으로 배워야 할 것들이 많은 것 같다 화이팅 ~
'[Kotlin&Spring] 5기 내일배움캠프' 카테고리의 다른 글
| [Kotlin&Spring] 5기 Java 부동소수점방식과 BigDecimal 타입 (0) | 2025.01.14 |
|---|---|
| [Kotlin&Spring] 5기 계산기 과제 트러블슈팅 - Java의 Optional 클래스 (0) | 2025.01.10 |
| [Kotlin&Spring] 5기 System.out.println() 메서드와 Logger (0) | 2025.01.07 |
| [Kotlin&Spring] 5기 Enum 열거형에 대해 (0) | 2025.01.06 |
| [Kotlin&Spring] 5기 얕은 복사와 깊은 복사 - 배열(Array) (2) | 2025.01.03 |