기존의 전략 패턴 : 2022.07.12 - [프로그래밍/JPA Project - sparta] - 카페 검색, 정렬 기능을 구현 - 전략패턴 사용

 

카페 검색, 정렬 기능을 구현 - 전략패턴 사용

전략 패턴을 사용한 코드 구현이 처음이라 아주 재미있는 작업이었다 검색창의 value와 option filer의 value 값을 서버로 전송하여 페이징 처리된 카페 리스트를 반환 받음 html 정렬 : -선택- 높은 가

ncodingdiary.tistory.com

 

기존의 전략패턴은 사용 시 정렬 기준이 늘어날 때마다 sort폴더에 계속해서 클래스가 늘어나는 구조로 짜여 있었습니다.

예를 들면, 정렬 기준이 10개라고 가정했을 때 asc, desc로 나눠야 해 클래스가 20개가 되는 것이죠.

북마크수 순 한가지의 정렬기준을 늘렸을 뿐인데 벌써부터 클레스가 많아보입니다. 

이는 전략패턴을 잘못사용하고 있음을 깨닫게 해주었고 리팩토링을 하기로 하였습니다.

 

이 문제를 해결하기 위해 asc와 desc만을 전략패턴에 사용하고 정렬 기준은 value로 사용하여 코드를 깔끔하게 만들기로 하였습니다.

 

 

리팩토링 한 코드

html

<select id="sorting" onchange="getCafeList()">
    <option value="createdDate-desc">-선택-</option>
    <option value="cafeWeekdayPrice-desc">높은 가격순</option>
    <option value="cafeWeekdayPrice-asc">낮은 가격순</option>
    <option value="cafeBookmarkCount-desc">인기 높은순</option>
    <option value="cafeBookmarkCount-asc">인기 낮은순</option>
</select>

 

js

선택된 value를 split을 이용하여 key와 value 값으로 구분하여 서버로 전달해줍니다.

let sortVal = $("#sorting option:selected").val();
let sortStrategyKey = sortVal.split("-")[1];
let sortStrategyValue = sortVal.split("-")[0];

 

service

private final Map<String, SortStrategy> sortStrategyMap;

# key값에 따라 필요한 의존관계를 가져옴
SortStrategy sortStrategy = sortStrategyMap.get(sortStrategyKey);
Sort sort = sortStrategy.sort(sortStrategyValue);

 

sort class

@Component
public class Asc implements SortStrategy{

    @Override
    public Sort sort(String sortValue) {
        return Sort.by(Sort.Direction.ASC, sortValue);
    }
}

 

폴더 구조

깔끔해졌습니다!

 

복잡한 분기처리를 전략패턴을 이용하여 효율적인 코드를 구현할 수 있어 재미있는 구현 작업이었습니다.

다른 디자인 패턴들도 코드에 적용할 수 있도록 공부해볼 예정입니다.

+ Recent posts