백엔드/Java
[이넘아 놀자] 2. 일단 만들까 이넘
꾸준함의 미더덕
2023. 8. 28. 07:08
안녕하세요~ 꾸준함의 미더덕입니다.
"군자이행언 소인이설언"
무릇 군자란 행동으로 말한다고 하였습니다..
이넘을 일단 만들어 볼까요?
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();
}
}
이제, 본격적으로 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() {
//given
Post post = Post.builder()
.categoryCode("CT000001")
.someCode("12341234")
.title("테스트 제목")
.content("테스트 내용")
.createdAt(LocalDateTime.now())
.deleteType(DeleteType.N)
.build();
Post savedPost = postRepository.save(post);
PostId savedPostId = new PostId(savedPost.getId(), savedPost.getSomeCode());
//when
postService.deletePost(savedPostId);
//then
Post foundPost = postRepository.findById(savedPostId).orElseThrow();
assertThat(foundPost.getDeleteType()).isEqualTo(DeleteType.Y);
}
테스트 코드도 성공적으로 통과했는데요, 테스트 단에서도 Enum을 적용하여 한결 향긋한 코드가 되었습니다.
이번 게시물에선 가장 간단한 상황의 Y, N 타입의 Enum을 적용 해보았습니다.
다음 포스트에선 조금 더 복잡한 상황의 Enum을 적용해보도록 하겠습니다!