https://github.com/nyoongoon/practical-enum-app
"군자이행언 소인이설언"
무릇 군자란 행동으로 말한다고 하였습니다..
이넘을 일단 만들어 볼까요?
public enum DeleteType {
Y, N
}
@Getter
@AllArgsConstructor
public enum SomeCode {
SOME("12341234"),
THING("43214321");
private String code;
}
@Getter
@AllArgsConstructor
public enum CategoryCode {
CUSTOMER_INQUIRY("CT000001"),
FREE_BOARD("CT000002"),
REFUND_INQUIRY("CT000003"),
TECH_SUPPORT("CT000004"),
PRODUCT_REVIEWS("CT000005"),
DISCUSSIONS("CT000006"),
USER_MANUALS("CT000007");
private String code;
}
@Getter
@AllArgsConstructor
public enum ExpenditureCode {
FOOD("EC000001"),
TRANSPORTATION("EC000002"),
HOUSING("EC00000");
private String code;
}
@Getter
@AllArgsConstructor
public enum IndustryCode {
TECHNOLOGY("IC000001"),
FINANCE("IC000002"),
HEALTHCARE("IC000003");
private String code;
}
짠~ Enum 을 만들어 보았습니다.
위에서 볼 수 있듯, 두가지 경우의 Enum을 만들 수 있을 것 같은데요~
1. 상수명과 값이 일치하는 경우 (DeleteType)
2. 상수명과 값이 일치하지 않는 경우 (나머지 경우)
public enum DeleteType {
Y, N
}
-> 위처럼 값 자체로 의미를 가진 경우, 상수명과 값을 일치하여 심플한 Enum으로 사용해볼 수 있습니다.
그렇다면 일단, DeleteType을 사용하여 1번 상황에 대한 기존 코드를 리팩토링 해볼까요?
아래는 기존 레거시 코드입니다.
//..
@Entity
public class Post {
@Column(name = "delete_type")
private String deleteType;
//..
public void deletePost(){
this.deleteType = "Y";
}
}
//..
PostService{
//..
@Transactional
public void deletePost(PostId postId) {
Post foundPost = postRepository.findById(postId).orElseThrow();
foundPost.deletePost();
}
}
우선 테스트 코드를 작성해봅시다.
@Test
public void deletePostTest() {
Post post = Post.builder()
.someCode("12341234")
.title("테스트 제목")
.content("테스트 내용")
.createdAt(LocalDateTime.now())
.categoryCode("CT000001")
.deleteType(DeleteType.N)
.build();
Post savedPost = postRepository.save(post);
assertThat(savedPost.getDeleteType()).isEqualTo(DeleteType.N);
PostId savedPostId = new PostId(savedPost.getId(), savedPost.getSomeCode());
postService.deletePost(savedPostId);
Post foundPost = postRepository.findById(savedPostId).orElseThrow();
assertThat(foundPost.getDeleteType()).isEqualTo(DeleteType.Y);
}
-> deletePost()를 통해 DeleteType을 "Y"으로 바꾸고 있음을 볼 수 있습니다.
이제, 본격적으로 Enum 코드들을 적용해볼까요?
//..
@Entity
public class Post {
@Enumerated(EnumType.STRING)
@Column(name = "delete_type")
private DeleteType deleteType;
//..
public void deletePost(){
this.deleteType = DeleteType.Y;
}
}
- 엔티티에서 기존의 String 타입을 DeleteType으로 바꾸어주었습니다.
이로써, deleteType에 들어갈 수 있는 값을 어플리케이션단에서 보장할 수 있게 되었습니다!
cf) @Enumerated(EnumType.STRING) 설정을 해주지 않으면 Enumerated 기본 설정인 Ordinal로 상수명들의 순서값이 들어간다는 것을 조심하세요 ~
@Test
public void deletePostTest() {
Post post = Post.builder()
.title("테스트 제목")
.content("테스트 내용")
.createdAt(LocalDateTime.now())
.categoryCode("CT000001")
.deleteType(DeleteType.N)
.build();
Post savedPost = postRepository.save(post);
assertThat(savedPost.getDeleteType()).isEqualTo(DeleteType.N); //성공!
postService.deletePost(savedPost.getId());
Post foundPost = postRepository.findById(savedPost.getId()).orElseThrow();
assertThat(foundPost.getDeleteType()).isEqualTo(DeleteType.Y); //성공!
}
- 테스트 코드도 성공적으로 통과했는데요, 테스트 단에서도 Enum을 적용하여 한결 향긋한 코드가 되었습니다.
이번 게시물에선 가장 간단한 상황의 Y, N 타입의 Enum을 적용 해보았습니다.
다음 포스트에선 조금 더 복잡한 상황의 Enum을 적용해보도록 하겠습니다~
'백엔드 > Java' 카테고리의 다른 글
천사와 악마 사이 추상클래스... - 인터페이스 및 정적 유틸리티 클래스 비교 - 2 (5) | 2024.02.13 |
---|---|
천사와 악마 사이 추상클래스... - 인터페이스 및 정적 유틸리티 클래스 비교 - 1 (0) | 2024.02.01 |
이넘아 놀자 4 - 인터페이스 사용하여 Enum 공통화하기 (0) | 2023.09.03 |
이넘아 놀자 - 3. 코드값으로 되어있는 Enum의 경우 (0) | 2023.08.28 |
이넘아 놀자 - 1. 기존 하드코딩되어 있던 코드 문제점 분석 (0) | 2023.08.27 |