컨틀롤러와 서비스간 값을 전달할 때 어떤 형식으로 보내야 하는가
1. 고민시작
졸업작품 프로젝트를 진행을 끝내고 시간적 여유가 있는 다음달부터 코드 정리를 하기 위해서 기능적인 부분 수정이나 명칭 변경과 같이 TODO목록을 작성하던 도중 가장 코드가 많은 Service
계층과 Controller
계층 사이에 데이터 전달되는 형식이 어느것은 DTO를, 어느것은 Entity를 사용하면서 일관적이지 않은 것을 보고 정말 많은 고민이 시작되게 되고 방안들을 생각해 봤다.
선행 기준
방안을 생각하기에 앞서 무조건 선행된 기준은 있었다. Controller
는 client로 부터 Entity가아닌 DTO로 값을 받고 DTO를 넘겨주게된다
DTO란
프로세스간 데이터를 전달하는 객체
마틴 파울러가 정의한 내용
첫번째 고민
- 컨트롤러에서 client로부터 받은 DTO를 Entity로 변환해서 전달
이 방안에 대해서는 생각만 해봤을 뿐 나에게 있어서는 그렇게 좋게 느껴지지는 않았다 우선 controller에서 반환값조차 DTO로 반환을 하게 되는데 전송을 위해 변환하는 것 때문에 Entity에 의존을 한다는 것이 크게 다가오지 않았었던 것 같다
controller에서 받지 않은 값에 대해서는 null값으로 Entity를 생성을 해야하는데 이러한 것으로 만의하나 문제가 생기는 것을 방지하고자 하는 것도 있었다
User loginUser = new User(loginForm.getUserId(), loginForm.getPassword(), null);
이런 기준이면 service -> controller로 값을 보낼때도 service계층에서 변환을 한다
1번 결정
- DTO -> Entity, Entity -> DTO 변환과정은 Controller가아닌 Service계층에서 실시
두번째 고민
- client -> controller DTO랑 controller -> service DTO의 분리
@PostMapping("/{location}/update")
public String modifyLocation
(@PathVariable(name = "location") Long locationId, @Validated @ModelAttribute UpdateLocationForm updateLocationForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "location/updatelocationform";
}
/*
updateLocationForm.setLocationId(locationId);// 이 경우 할당을 까먹으면 null값으로 넘어갈 위험 있음
locationService.updateLocation(updateLocationForm);
*/
/*
UpdateLocationRequst request = updateLocationForm.toRequestDto(locationId);
locationService.updateLocation(request);
*/
locationService.updateLocation(locationId, updateLocationForm);
return "redirect:/";
}
위 코드와 같은 경우 DTO에 변수는 선언을 해두고 값을 나중에 할당을 해서 사용을 할지 아니면 Service계층으로 전송하는 DTO와 client로부터 Controller가 받는 DTO를 다르게 분리를 할지에 대해 고민을 가졌다
이것에 관해서는 너무 쉽게 결론이 섰다
받은 DTO를 바로 넘기는 것은 크게 문제가 되지 않았지만 추가적인 값을 더 보내야 하는 경우에는 null
값을 절대로 가지게 하지 않겠다라는 생각하나로 무조건 분리를 하게 되었다 물론 이렇게 되면 추가적인 작업이 생겨 귀찮게 되겠지만 나중에 null 예외가 발생할 수도 있을 것을 생각하면 작은 고생이라 생각한다
이렇게 하는 이유중 하나가 나중에 메소드에 매개변수가 많아질 경우 어떤 값이 무슨 역할을 하는지 확인하기가 어렵기 때문에 1개 정도는 괜찮지만 2가지 이상 추가 값을 넘길때에는 DTO를 새로 만들어 넘기는게 맞다고 생각한다
2번째 결정
추가적인 값(2개 이상)을 함께 넘길때는 controller에서 새로운 DTO를 만들어 전달
3번째 결정
위의 결론과 약간 직결되는 것인데 package위치는 client->controller 전달에서만 사용되는 DTO를 제외한 나머지 모든 DTO들은 service계층 밑에 두는 것
추가적 결정
DTO -> Entity변환시 DTO 클래스 내부에 toEntity()
메서드 생성
DTO -> DTO변환시 DTO 클래스 내부에 toServiceDto()
메서드 생성
'공부기록 > Spring' 카테고리의 다른 글
Spring-Rest Docs(1) (0) | 2022.08.09 |
---|---|
Spring boot CORS 설정 (0) | 2022.08.03 |
Spring - 예외처리 (0) | 2022.02.06 |
Spring-filter interceptor (0) | 2022.02.03 |
Spring - 로그인 처리 세션쿠키 (0) | 2022.01.28 |