인:향 - 리팩토링중중

김준석·2023년 11월 28일
0

향수 추천 서비스

목록 보기
16/21

프로젝트를 처음부터 다시 리팩토링하던 중 개선해야할 점을 발견하였습니다.

문제 코드

    private String selectScent(Long id) {
        Survey survey = surveyService.findSurveyById(id);
        return ScentType.getFeature(survey);
    }

    private String selectSeason(Long id) {
        Survey survey = surveyService.findSurveyById(id);
        return SeasonType.getFeature(survey);
    }

    private String selectMood(Long id) {
        Survey surveyId = surveyService.findSurveyById(id);
        surveyUtil.showMoodAnswer(surveyService.findSurveyById(id));

        Survey survey = Survey.builder()
                .moodAnswer(surveyUtil.showMoodAnswer(surveyId))
                .build();
        return MoodType.getMessage(survey);
    }

    private String selectMaintenance(Long id) {
        String maintenanceMessage = surveyService.findSurveyById(id).getPerfume().getMaintenance();
        return Maintenance.findMaintenance(maintenanceMessage);
    }

Scent와 Season과 Mood, Maintenance를 찾는 로직인데, 문제는 findSurveyById()를 각 메서드에서 사용하여 하나의 답변을 찾는데 Db를 총 4번 조회하고 있었습니다. 지금 다시보니 왜 이렇게 코드를 작성했는지....ㅎㅎ

따라서 조회 메서드를 전부 삭제하고 한번 조회할 수 있도록 하였습니다.

개선 1

    public FeatureResponseDto showFeatureDetails(Long id) {
        Perfume perfume = perfumeService.findPerfumeById(id);
        Survey survey = surveyService.findSurveyById(id);
        return FeatureResponseDto.builder()
                .perfume(perfume)
                .scentFeature(ScentType.getFeature(survey))
                .moodFeature(MoodType.getMessage(survey))
                .seasonFeature(SeasonType.getFeature(survey))
                .maintenanceFeature(Maintenance.findMaintenance(survey.getMaintenance()))
                .build();
    }

하고보니 문제점이 또 발견되었습니다. Survey와 Perfume은 같은 자원을 공유하고 있는데 두번 조회하고 있었습니다.

public class Survey {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "survey_id")
    private Long surveyId;

    ...중략
    
    @ManyToOne
    private Perfume perfume;

이미 Survey에서는 Perfume이랑 N:1 연관관계를 갖고 있었습니다. 이게 프로젝트 초기 가장 먼저 개발한 기능인데.. 지금 다시보니까 정말 ....안타까운 코드라고 느껴졌습니다.

개선 후

    public FeatureResponseDto showFeatureDetails(Long id) {
        Survey survey = surveyService.findSurveyById(id);
        return FeatureResponseDto.builder()
                .perfume(survey.getPerfume())
                .scentFeature(ScentType.getFeature(survey))
                .moodFeature(MoodType.getMessage(survey))
                .seasonFeature(SeasonType.getFeature(survey))
                .maintenanceFeature(Maintenance.findMaintenance(survey.getMaintenance()))
                .build();
    }

역시 꾸준히 리팩토링해야한다고 느꼈습니다.

profile
기록하면서 성장하기!

0개의 댓글