(Spring) 취향 기반 향수 추천 서비스 - 객체 분리에 대한 고민

김준석·2023년 9월 19일
0

향수 추천 서비스

목록 보기
14/21
post-thumbnail

Recommend 기능은 메인 기능에 필요한 5가지 질문 (성별, 향, 분위기, 계절, 옷스타일 등)을 로그인한 상대방이 응답하여 추천되는 방식입니다.

따라서 SurveyRequestDto와 RecommendRequestDto의 차이점은 추천인, 추천받은 사람의 id, comment이고, 그 외의 것은 SurveyRequestDto와 같습니다.

@Getter
public class RecommendRequestDto {

    private String genderAnswer;
    private String moodAnswer;
    private String scentAnswer;
    private String seasonAnswer;
    private String styleAnswer;
    private String recommender;
    private String comment;

    public RecommendRequestDto() {
    }
    
    public RecommendRequestDto(String recommender, String comment, String genderAnswer, String moodAnswer, String scentAnswer, String seasonAnswer, String styleAnswer) {
        this.recommender = recommender;
        this.comment = comment;
        this.genderAnswer = genderAnswer;
        this.moodAnswer = moodAnswer;
        this.scentAnswer = scentAnswer;
        this.seasonAnswer = seasonAnswer;
        this.styleAnswer = styleAnswer;
    }

처음 Dto는 다음과 같이 설계했습니다. 리팩토링을 진행하면서 들은 생각은 RecommendRequest가 하는 일은 SurveyRequest가 하는 일과 크게 다를 것이 없는데 불필요하게 코드의 중복만 발생한 것 아닐까? 였습니다.

따라서 객체를 분리하게 되었습니다.

@Getter
public class Recommender {

    private String recommender;

    private Long recommendedMemberId;

    private String comment;

    public Recommender(String recommender, Long recommendedMemberId, String comment){
        this.recommender = recommender;
        this.recommendedMemberId = recommendedMemberId;
        this.comment = comment;
    }
}

우선 추천인과 관련된 변수들은 Recommender에 따로 관리하기로 결정했습니다.
또한,

@Getter
public class RecommendRequestDto {

    private SurveyRequestDto surveyAnswers;

    private Recommender recommender;

    public RecommendRequestDto() {
    }

    public RecommendRequestDto(Recommender recommender, SurveyRequestDto surveyAnswers) {
        this.recommender = recommender;
        this.surveyAnswers = surveyAnswers;
    }
}

5가지 질문에 대한 항목들은 SurveyRequest와 동일하기 때문에 재사용하기로 결정했습니다.

이렇게 리팩토링 함으로써 추천과 설문에 대한 로직이 덜 의존적으로 바뀌었습니다. 로직이 변경되어도 RecommendRequest 객체는 영향을 덜 받게 될 것입니다. SurveyRequest의 확장이나 축소 시에도 변경해야 할 사항이 줄었습니다. 또한 객체를 분리함으로써 각각의 역할을 명확하게 파악할 수 있게 되었습니다.

하지만, 프론트 입장에서 요청 보낼 때 Json의 Depth 때문에 구조가 복잡해질 수 있습니다. 이에 대한 균형을 찾기 위해 Recommender 객체는 따로 분리하지 않기로 결정했습니다!

@Getter
public class RecommendRequestDto {

    private String recommender;

    private Long recommendedMemberId;

    private String comment;
    
    private SurveyRequestDto surveyAnswers;

중략
   }
}
profile
기록하면서 성장하기!

0개의 댓글