객체간의 책임과 역할


#컨트롤러의 책임

  • 객체지향의 사실과 오해에서 중요하게 다루는 내용 중 하나로
    '각 객체간의 책임과 역할을 명확히 하라' 라는 이야기를 강조한다.

  • 클라이언트로부터 넘어오는 데이터에 대한 검증은 컨트롤러에게 책임이 있다.

  • 검증로직이 서비스의 핵심로직으로 넘어가면 서비스로직이 오염된다.
    각 계층의 역할이 확실히 구분되지 않는 현상이 발생한다.

  • 따라서 검증 로직을 컨트롤러에서 처리하도록 리팩토링 하자.


#리팩토링

이미지 파일 여부 검증

@PostMapping("/gallery/create")
public String PCreateGallery(@RequestParam("file") List<MultipartFile> files,
                             @RequestParam("title") String title) throws IOException {
    galleryService.upload(files, "galleryImages", title);

    return "redirect:/gallery";
}
  • GalleryService
public void upload(List<MultipartFile> multipartFiles, String dirName, String title) throws IOException {
    User loginUser = userService.getLoginUser();

		for (MultipartFile uploadFile : files) {
        if (uploadFile.getContentType().startsWith("image") == false) {
            throw new CFileIsNotImageException();
        }
    }

    List<File> convertFiles = convert(multipartFiles);
    List<String> uploadImageUrls = uploadToS3(convertFiles, dirName);
		...
		}
...
  • 서비스 로직에서 파일들이 이미지 파일인지 아닌지 검증하고 있다.

  • 해당 검증을 컨트롤러에서 수행하도록 하자.


  • GalleryController
@PostMapping("/gallerys")
public String PCreateGallery(@RequestParam("file") List<MultipartFile> files,
                             @RequestParam("title") String title) throws IOException {
    
    for (MultipartFile uploadFile : files) {
        if (uploadFile.getContentType().startsWith("image") == false) {
            throw new CFileIsNotImageException();
        }
    }
		
    galleryService.upload(files, "galleryImages", title);

    return "redirect:/gallerys";
}
  • GalleryService
public void upload(List<MultipartFile> multipartFiles, String dirName, String title) throws IOException {
	User loginUser = userService.getLoginUser();
	
    	List<File> convertFiles = convert(multipartFiles);
	List<String> uploadImageUrls = uploadToS3(convertFiles, dirName);
	...
}
...
  • 클라이언트로부터 전달된 데이터의 검증을 컨트롤러에서 처리하면서
    서비스 로직이 깔끔해졌다.
💡 나머지 도메인에서도 위와 같이 리팩토링을 진행했으며, 대표적으로 하나의 케이스만 가져왔다.

좋은 웹페이지 즐겨찾기