이슈의 발단
이슈의 발단은 다음과 같습니다.
@qoxogus 님이 getRefreshToken
메서드가 HttpServletRequest
객체를 인자로 받고 있어 Test코드작성이 어렵다고 하셨습니다.
하지만 그 말은 HttpServletRequest
객체 대신 순수 JWT값을 getRefreshToken
메서드에 DTO와 같은 형식으로 넘겨주면 해결 될 문제일거 같아 getRefreshToken
로직에 대한 분석을 진행했습니다.
그러면서 해당 구조적인 문제를 발견하게 되었습니다.
Service가 controller에 의존하게 되는 문제
Controller
에서 생성되는 HttpServletRequest
를 Service로직(getRefreshToken
)에서 사용한다는 것은
Service(RefreshTokenServiceImpl
)는 Controller(RefreshTokenController
)에 대한 의존성을 가지고 있다는 의미를 담고 있습니다.
HttpServletRequest
은 톰켓과 같은 WAS
에서 관리하므로 개발자는 순수 비즈니스 로직에 집중해야 합니다.
RefreshTokenServiceImpl
가 RefreshTokenController
에 의존하게 되어 생기는 문제점은 다음과 같습니다.
RefreshTokenServiceImpl
로직에 대한 불안정성이 높아지게 됩니다.
참고 레퍼런스 입니다. https://techblog.woowahan.com/2561/
RefreshTokenServiceImpl
이 RefreshTokenController
에 높은 결합도(high coupling)이 생깁니다.
직접적인 의존관계는 아니지만 getRefreshToken
매서드는 RefreshTokenController
에서 생성되는 HttpServletRequest
가 없으면 로직을 수행할 수 없으므로 높은 결합이 생겼다고 할 수 있어요
해결 방안
controller에서 Header에 저장되어있는 JWT값을 추출 후 순수한 데이터를 service에 넘겨주기
RefreshTokenServiceImpl
는 좀 더 POJO에 가까워질 수 있어요
getRefreshToken
메서드는RefreshTokenController
의 HttpServletRequest
이 아닌 순수한 값에 의존하기 때문
- 결합도가 줄어들어 재사용성, 확장성이 증가합니다.
결론
RefreshTokenServiceImpl
의 getRefreshToken
매서드는 HttpServletRequest
객체 대신 순수 데이터를 전달받아야 합니다.
documentation good first issue Fix-todo Opinion