최근 회사에서 매주 이슈 체크 및 코드 리뷰를 진행하기로 하여, 이때 전략 패턴에 대해 소개를 해주시고 공유를 받아 연습해볼 겸 한번 작성해 보았다.
취준 당시, 디자인 패턴에 대해 항상 나중에 해봐야지... 라고 생각했었는데 요즘이 적기라 생각이 들었고 추후에 도움을 많이 받을 것 같아 정리해보려고 한다.
정의부터 한번 알아보도록 하자
전략 패턴 ( Strategy pattern )
- 정책 패턴 (policy Pattern)이라고도 불리며, 실행중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이라고 위키백과가 말하고 있다.
- 객체의 행위를 직접 수정하지 않고 전략을 바꿔줌으로서 행위를 유연하게 확장한다는 장점을 가지고 있다.
나는 제공해주셨던 뉴스 예제를 최근 연습하고 있는 코틀린을 적용해 한번 연습해보았다.
구현하면서 느꼈던 핵심은 각 파라미터별로 구현이 다르기에, 이후 정책이 변경되었을때 유연한 수정이 가능할것 같다는 생각이 들었다.
또한 내가 참고했던 사수님이 설명해주신 내용도 첨부하고자 한다.
예제 구현에 대해 이제 살펴보도록 해보겠다.
예제의 구성은 다음과 같다.
해당 구조를 살펴보면 다음과 같이, 전략 클래스를 캡슐화 하기위해 Sort Strategy 인터페이스를 설정함을 알 수 있다.
다음과 같이 Controller를 하나씩 이야기해보겠다.
- RequestParam을 통해 값을 받았을 시, Service에 구현한 getNews 로직에 해당 값이 삽입된다.
- return String인 이유는, 각 전략 클래스마다 String으로 반환을 하였기 때문이다.
이제 해당 부분에서 각RequestParam을 통해 받은 값을 해당 인터페이스를 거쳐 return 값을 가져와준다.
다음과 같이 각 인터페이스를 설정한 후
다음과 같이 인터페이스의 내용을 override 해줌으로써, Latest라는 Parameter 값이 들어왔을 때 "최신순으로 정렬"을 return 시켜준다.
None, Oldset 또한 위와 내용이 같기에 따로 첨부하진 않으려고 한다.
해당 파라미터에 값이 들어왔을 때, 다음과 같은 Converter class를 통해 값이 들어올 경우, 해당 request에 맞는 전략 클래스 Bean으로 연결됨을 확인할 수 있습니다.
위 설정한 Converter를 WebMvcConfigure에 Overriding을 시켜준다.
다음과 같이 제공해주신 예제의 내용을 코틀린 연습도 할 겸 겸사겸사 연습을 해보았는데 아직까지 코틀린이 아직 익숙하지 않아 더 연습을 해야 할 것 같다... ㅠㅠ
결론
- 위에서 언급한 것과 같이, 각 전략별로 나눠져 있기에 추후 정책이 변경되거나 하였을 때 유연한 대처가 가능할 것 같았다.
- 현재는 간단하기 때문에 한눈에 보기가 쉬웠지만 해당 패턴을 이용해 구현을 진행하였을 때 코드 가독성이 과연 좋을까?라는 생각이 들었다.
- 코드 가독성 또한 매우 중요하긴 하지만, 아무래도 나는 유연함을 생각하였을 땐 좋은 전략으로 사용할 수 있지 않을까? 란 생각이 들었다.
- 다양한 디자인 패턴 공부를 더 해보고 글 쓰는 연습을 더해보자!
- 코틀린 열심히!
잘못된 내용이나 지적사항은 언제나 환영입니다 ! ㅎㅎ
참고
'Spring' 카테고리의 다른 글
분산락과 네임드락 그리고... 동시성 (1) | 2023.02.02 |
---|---|
Throttling과 debounce에 대해 알아보자 (0) | 2022.12.11 |
[DI,DIP] 의존성 주입에 대하여 (0) | 2022.10.12 |
[SpringBoot - 인프런] Batch Meta Data (0) | 2022.08.22 |
[SpringBoot - 인프런] EnableBatchProcessing (0) | 2022.08.20 |