프로젝트를 처음부터 다시 리팩토링하던 중 개선해야할 점을 발견하였습니다.
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번 조회하고 있었습니다. 지금 다시보니 왜 이렇게 코드를 작성했는지....ㅎㅎ
따라서 조회 메서드를 전부 삭제하고 한번 조회할 수 있도록 하였습니다.
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();
}
역시 꾸준히 리팩토링해야한다고 느꼈습니다.