백엔드/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을 적용해보도록 하겠습니다!