자바

그로잉맘 검사에 디자인 패턴 적용하기

_soboro 2022. 9. 7. 13:48

글을 읽기 전에 한번 봐주세요!

- 주니어 개발자라 미숙한점이 있을 수 있습니다.

- 피드백 환영합니다. 다만 디엠으로 해주시면 감사하겠습니다. 상처받아요

개요

저는 그로잉맘에서 백엔드 개발자로 일하고 있는 김영석이라고 합니다.

그로잉맘에서는 육아를 하시는 부모님들을 위해 각종 검사를 제공하고 있습니다. 

 

- 아이의 발달 수준을 알 수 있는 발달검사

- 아이의 언어 발달 수준을 알 수 있는 언어 발달검사

- 아이의 기질을 알 수 있는 아이 기질검사

 

해당 검사들은 두가지 과정을 통해 진행 됩니다

 

 

1. 아래 이미지와 같이 아이에 대한 설문을 하면!

 

2. 그로잉맘의 전문 상담사 분들이 직접 작성하신 육아 관련된 글(멘트)들을 추천 해주게 됩니다!

 

문제점

제가 만든 기존 검사 멘트 추출 로직의 문제점은 아래 두가지와 같습니다.

 

1. 가독성이 떨어짐

2. 결합도가 높음

 

해당 두가지 문제는 단위 테스트가 어렵고, 유지보수 및 기능 추가를 매우 어렵게 만들었습니다.

저는 이 문제 때문에 멘트 추출 로직은 더이상 변경 되어서는 안된다는 망언을 기획팀에게 한적도 있습니다.. (반성 중)

 

한마디 말보다는 코드로 보여드리는게 이해가 편할것 같습니다.

느낌 오시죠?..

문제 해결

저는 이 스파게티 코드를 어떻게 하면 가독성을 높이고 결합도를 낮출 수 있을지 고민 해봤습니다.

그런데 문득 디자인 패턴 중 하나인 책임 연쇄 패턴이 생각났습니다.

 

이유는 멘트 로직이 Spring Filter처럼 같이 하나 하나의 필터를 거쳐가면서 사용자에게 제공할 필요가 없는 멘트들을 걸러나가는 과정이라고 생각 했기 때문입니다. 마치 뜰채에 비빔면의 면을 넣어서 물기를 빼내는것 같은 느낌...?

 

책임 연쇄 패턴도 비슷합니다.

출처 (https://heebeom.me/posts/chain-of-responsibility-pattern/)

책임 연쇄 패턴은 말 그대로 책임들을 여러 로직에 분배하고 로직들이 책임을 차례대로 처리할 수 있도록 도와주는 패턴입니다.

저는 여기서 책임을 멘트 추출 조건 집합으로 생각했습니다.

 

예를들어 부모의 스트레스 수치가 2.6보다 아래라면 상담사님이 지정해주신 3-1번 멘트를 추출한다, 2.6이상 85미만이라면 3-2를 추출한다 같이 처리가 될 수 있습니다.

 

위와 같이 멘트 추출 조건의 집합을 하나의 책임으로 보고 Chain으로 분리 하였습니다. 만약 해당 조건에 충족되지 않는다면 다음 Chain으로 넘어가지 않게 설계 했습니다.

 

메소드에 대해 설명드리자면 setNextChain은 다음 체인이 로직을 처리할 수 있도록 도와주고 addMent는 말 그대로 조건에 맞는 멘트를 찾아서 멘트 리스트에 넣는 역할을 합니다.

 

책임 연쇄 패턴을 통해서 얻을 수 있었던 것은 코드 가독성, 낮은 결합도, 유지보수 및 기능 추가의 용이성 입니다.

 

이전 코드와는 다르게 멘트에 대한 조건 집합들이 클래스로 정의되기 때문에 코드를 읽기가 수월합니다.

또한 결합도가 낮아졌기 때문에 단위테스트를 하기 용이합니다. 기능을 추가하려고 한다면 기존 로직을 수정할 필요 없이 Chain 클래스를 하나 더 만들면 됩니다!