반응형
컨트롤러와 서비스 레이어 간 파라미터 의존성 관리를 어떻게 해야할까?
고민한 내용은 간단하다. Controller → Service로 파라미터를 넘길 때 의존도를 어떻게 할지이다.
Controller
@GetMapping(value = "/members/me", produces = MediaType.APPLICATION_JSON_VALUE)
public MemberResponse findMemberOfMine(@Login LoginMember loginMember) {
Member member = memberService.findMemberOfMine(loginMember.getEmail());
return new MemberResponse(member);
}
Service
@Transactional(readOnly = true)
public Member findMemberOfMine(String email) {
return memberRepository.findByEmail(email);
}
- 위와 같은 코드는 컨트롤러에서 LoginMember를 받아 Service로 getEmail()을 보내주고 있다.
이 경우 Service는 LoginMember에 의존하지 않게된다. - 반대로 LoginMember를 Service로 넘기고 service에서 getEmail()을 하는 경우이다.
이 경우 Service는 LoginMember에 의존이 생긴다.
그렇다면 어떻게 해야할까?
우리 팀은 규칙을 정했다.
- 만약 커스텀 객체를 넘겨야 한다면, 커스텀 객체에서 실행할 행위가 있어야 한다.
- 행위는 반드시 복잡한 로직이 아니고, DTO → Entity로 변환하는 행위도 모두 포함이다.
- 컨트롤러에서 DTO → Entity로 변환해서 보낼 수도 있지만, 이 결정은 Service가 하는 것이다.
Service에서 Entity 변환 메서드르 사용하지 않을 수도 있기 때문이다.
- 그렇지 않다면, getEmail()과 같이 추출해서 넘겨준다.
- getEmail()과 같이 단 하나의 필드만 존재하고 행위도 없는 경우는 Service에서 선택의 여지가 없다.
그렇기 때문에 추출해서 넘겨준다.
- getEmail()과 같이 단 하나의 필드만 존재하고 행위도 없는 경우는 Service에서 선택의 여지가 없다.
이런 규칙을 정한 이유는 유연한 코드를 만들기 위함이다. 아마 대부분은 DTO 자체를 넘기겠지만,
이런 상황에는 의존을 줄여 LoginMember의 이름이 바껴도 Service에는 전혀 영향이 없도록 하는 것이다.
반응형
'Spring' 카테고리의 다른 글
JPA Auditing으로 생성시간, 수정시간 자동화하기 (0) | 2022.04.19 |
---|---|
스프링에서 Enum과 Bean Validation으로 예외 관리하기 (0) | 2022.04.18 |
@NotNull vs @Column(nullable = false) (0) | 2022.04.15 |
@Configuration과 @TestConfiguration (0) | 2022.04.15 |
로그인 처리는 Filter와 Interceptor중 무엇을 선택해야 할까? (1) | 2022.04.11 |