본문 바로가기

백엔드 개발 노트

[디자인 패턴] 확장성에 용이한 코드 짜기

졸업 프로젝트에서 문장의 형태소를 분석해 특정 형태소가 들어가는지 checkList를 만드는 API를 구현해야 했다.

 

외부 API를 통해 형태소 List를 가져는 왔는데...

제일 중요하게 생각한 것은 언제 어떤 checkList가 확장될지 모르기 때문에 확장성이 좋아야 한다는 점이다.

이를 위해 ENUM으로 체크해야할 모든 체크리스트를 만들었다.

 

NP

JKG
NNG 이름
JX
NNP 홍길동
VCP
EF ㅂ니다

- 이런식으로 가져왔습니다

Response에 필요한 정보는 필요한 정보는 "check해야하는 항목", 어떤 나이대에 아이들이 필요한지가 필요하다.

 

제일 중요하게 생각한 것은 언제 어떤 checkList가 추가될지 모르기 때문에 확장성이 좋아야 한다는 점이다.

 

이를 위해 ENUM으로 체크해야할 모든 체크리스트를 만들었다.

 

 

@Getter
public enum MorphemeCheckEnum {
    USE_ENDING_1("-야, -자 같은 종결어미를 사용한다", AgeGroup.TWO),
    USE_ENDING_2("복잡한 종결어미를 사용했다", AgeGroup.THREE),
    USE_ENDING_3("종결어미에 높임말을 사용한다", AgeGroup.AFTER_FIVE),

    USE_NOUN("명사를 사용한다", AgeGroup.TWO),
    USE_VV_VA_1("간단한 동사/형용사를 사용한다", AgeGroup.TWO),
    USE_VV_VA_2("복잡한 동사/형용사를 사용한다", AgeGroup.FOUR),
    USE_VA_1("‘이렇게’, ‘저렇게’ 등의 의문사를 사용한다", AgeGroup.FOUR),
    USE_JKS_1("주격조사 '-가'를 사용한다", AgeGroup.TWO),
    USE_JKS_2("복잡한 주격조사를 사용한다", AgeGroup.THREE),
    USE_NP_1("대명사로 자신을 지칭할 수 있다", AgeGroup.TWO),
    USE_NP_2("복잡한 대명사를 사용한다", AgeGroup.THREE),
    USE_NNB_1("의존명사 '-것'을 사용한다", AgeGroup.TWO),
    USE_NNB_2("복잡한 의존명사를 사용한다", AgeGroup.THREE),
    USE_EC_1("'-고' 등 간단한 연결어미를 사용한다", AgeGroup.THREE),
    USE_EC_2("복잡한 연결어미를 사용한다", AgeGroup.AFTER_FIVE),
    USE_MA_1("간단한 부사를 사용한다", AgeGroup.THREE),
    USE_MA_2("복잡한 부사를 사용한다", AgeGroup.AFTER_FIVE),
    USE_J_1("보조사를 사용할 수 있다", AgeGroup.THREE),
    USE_J_2("2가지 사물, 사람을 표현할 때 ‘-랑’, ‘-하고’, ‘-와’, ‘-고’를 사용한다", AgeGroup.AFTER_FIVE),

    ;
    private final String content;
    private final AgeGroup ageGroup;

    MorphemeCheckEnum(String content, AgeGroup ageGroup) {
        this.content = content;
        this.ageGroup = ageGroup;
    }

    public static Map<MorphemeCheckEnum, Boolean> createDefaultCheckList() {
        Map<MorphemeCheckEnum, Boolean> map = new HashMap<>();

        for (MorphemeCheckEnum checkEnum : MorphemeCheckEnum.values()) {
            map.put(checkEnum, false);
        }

        return map;
    }
}

이를 통해 모든 checkList가 늘어날 때마다 ENUM 속 value를 다 가져오는 방식으로 checkList를 만든다. (createDefaultCheckList 메소드)

 

Map<MorphemeCheckEnum, Boolean> checkList = MorphemeCheckEnum.createDefaultCheckList();

 

이를 바탕으로 Response는 만들었다

 

public record MorphemeCheckListResponse(
        List<MorphemeCheckListInfo> checkList
) {
    public record MorphemeCheckListInfo(
            String checkInfoContent,
            AgeGroup ageGroup,
            boolean isUsed
    ) {

    }