SNS 서비스를 만들 당시.. 시간 제한을 놓고 만들다보니 다시 소스코드를 보는데 매우 당연하지만 수정이 코드가 있었습니다..
스프링 서버를 만들 때 Layered Architecture를 참고하여 크게 3가지 계층으로 나눌 수 있습니다.
Presentation layer : View
사용자로부터 데이터를 입력 받거나, 데이트를 출력해 보이는 계층입니다.
Control layer : Controller
View에서 사용자의 요청을 받아 응답을 처리하는 계층입니다. 주로 비즈니스 로직을 결정하는 역할을 수행합니다.
사용자의 요청을 검증, 로직에 요청을 전달, 로직에서 반환된 응답을 적절한 뷰로 연결 합니다.
Business layer : Service
비즈니스 로직 처리와 비즈니스와 관련된 도메인 모델의 적합성을 검증하고 트랜잭션을 관리합니다.
프레젠테이션 계층과 데이터 엑세스 계층 사이를 연결하는 역할로서 두 계층이 직접적으로 통신하지 않게합니다.
계층을 분리하는 이유
이러한 방식으로 계층을 분리하는 이유는 한 곳에서 모든 작업이 이루어진다면 코드의 복잡성이 올라가 유지보수가 어렵고 중복코드가 발생하고 한 곳에 코드가 모여있어서 확장성, 유연성 등이 부족하게 됩니다.
그리고 Controller에서 Repository를 참조하는 것은 위험합니다.
정보를 직접 CRUD하고 가공하는 과정에서 테이블에 저장된 원본의 정보가 손상될 우려가 큽니다. 그렇기 때문에 DTO와 Entity를 나눠서 계층간 데이터를 교환하게 하는 것입니다.
따라서 정보 변동의 위험이 큰 로직은 Service에서 진행하는 것입니다.
추가로 이때도 원본의 데이터를 사용하는 것이 아니라 데이터베이스에서 추출한 정보의 복사본인 DTO를 만들어서 로직을 조작하는 것입니다.
---------------------------
수정 부분
FeedController
@GetMapping("feedIndex")
public String facebookFeed(Model model){
Sort sort1 = Sort.by("createdTime").descending();
Pageable pageable = PageRequest.of(0,100, sort1);
Long owner = (Long) httpSession.getAttribute("owner");
Page<Feed> result = feedService.getFeed(pageable);
// 컨트롤러에서 바로 Repository에 접근..하면 안된다...
// Page<Feed> result = feedRepository.findAll(pageable);
model.addAttribute("feeds",result);
return "feedIndex";
}
Controller에서 Repository에 직접 접근하면서 DB 정보를 받아오는 코드를 Service 계층을 통하여 받아오도록 수정하였습니다.
'Spring > SNS통합 피드 서비스' 카테고리의 다른 글
SNS 통합 피드 서비스 (0) | 2022.10.12 |
---|