역량 UP!/DesignPattern

이론만 공부했던 패턴을 적용해보자:)

태하팍 2024. 5. 22. 16:46
반응형

2024.02.29 - [OpenSource/Spring Boot] - springboot 배너변경..ㅋㅋ;;

2024.02.29 - [OpenSource/Spring Boot] - springboot logging설정

2024.03.03 - [OpenSource/Spring Boot] - springboot profiles

2024.03.08 - [OpenSource/Spring Boot] - springboot 예외처리(Exception Handler)

2024.03.08 - [OpenSource/Spring Boot] - springboot Swagger 설정

2024.03.09 - [OpenSource/Spring Boot] - 주저리) mvc에서 controller 분리 전략

2024.03.21 - [OpenSource/Spring Boot] - Field injection is not recommended

2024.03.21 - [OpenSource/Spring Boot] - springboot bootBuildImage

2024.04.07 - [OpenSource/Spring Boot] - springboot - RestTemplate 적용

2024.04.07 - [OpenSource/Spring Boot] - springboot-RestClient??

요구사항
- 범용적인 미들웨어를 만들자
- 도메인 마다 응답 템플릿이 다름
- 현재는 하나의 응답 템플릿만 제공

각 도메인마다 각자의 템플릿이 나와야하는 상황!
즉, if ~ else로 도배를 해야하냐 VS 패턴을 사용하냐였고
그래서 선택한 패턴은 "전략패턴" 입니다.

기존 코드를 건들이지 않고 전략적으로 추가할 수 있는 패턴! 개꿀~
이 밤의 끝을 잡고~솔리드 원칙중 하나를 잘 지키는 패턴~Open Closed Principle

도메인은 인물 도메인 / 방송 도메인 / 영화 도메인 등 다양하게 올수 있는데
도메인이라는것이 전략패턴에서는 Context에 해당합니다.

그리고 각각의 도메인 마다 가지고 있는 로직들이 전략에 해당 합니다.
인물과 방송 영화 등에서 필요한 로직들이 다르기 때문 입니다.

우선 Strategy Interface를 아래와 같이 만들어줍니다.

public interface DomainStrategy {
    void injectTemplateDataForBingo(ObjectNode body, Boolean isFeed, BingoTemplateList templateList);

}

각각의 도메인에 대한 구현은 아래와 같이각 도메인의 특징에 맞게 로직을 구현할 수 있습니다.
- People domain

@Service
@RequiredArgsConstructor
public class People implements DomainStrategy {
    
    @Override
    public void injectTemplateDataForBingo(ObjectNode originRespNode, Boolean isFeed, BingoTemplateList templateList) {
        String collectionName = "people";
        // people 관련 로직 블라블라~
        
    }
}

- Movie domain

@Service
@RequiredArgsConstructor
public class Movie implements DomainStrategy {
   
    @Override
    public void injectTemplateDataForBingo(ObjectNode originRespNode, Boolean isFeed, BingoTemplateList templateList) {
        String collectionName = "Movie";
        // 영화관련 로직 

    }

}

해당 도메인을 가지고 응답 템플릿을 만들 때 각 domain에 맞게 범용적으로 동작 합니다.

// domain에 따라서 전략 선택
if ("people".equals(domainName)) {                    
    bingoKgsdMiddleService.injectTemplateDataForBingo(peopleDomain, (ObjectNode) bodyNode, isFeed, templateList);
} else if ("movie".equals(domainName)) {
   bingoKgsdMiddleService.injectTemplateDataForBingo(movieDomain, (ObjectNode) bodyNode, isFeed, templateList);
}

 

전략패턴을 이론만으로만 학습하고나서 써먹어보지 못해서 자꾸만 까먹었었는데
물론 시간이 지나면 포스팅한 것도 가물가물...ㅠ 
간단하게 어떤 상황이라서 사용했는지와 어떻게 구현했는지 사용은 어떻게 했는지 정리를 통해
나중에 필요할때 보도록하자~:)

끝~

반응형