[본 포스팅은 스프링 MVC 1편 백엔드 웹 개발 핵심 기술 편을 기반으로 작성하였습니다.]
MVC 패턴을 알아보기 전에 왜 MVC가 나왔는지 알아보자.
- MVC 패턴 이전
- 너무 많은 역할
기존의 서블릿이나 JSP로 비즈니스 로직과 뷰 렌더링까지 처리하게 되면 너무 많은 역할을 하게 되고 유지보수가 어려워진다.
(하나의 기능을 수정하려면 여러 부분에서 수정이 필요함 심지어 코드도 너무 길어 가독성이 어려움)
- 변경의 라이프 사이클
진짜 문제는 둘 사이에 변경의 라이프 사이클이 다르다.
예를 들어 UI를 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 매우 높고 서로에게 영향을 주지 않는다.
이렇게 변경의 라이프 사이클이 다른 부분의 하나의 코드로 관리하는 것은 유지 보수하기 좋지 않다.
그래서 위의 불편함을 없애기 위해 현재 사용이 되고 있는 패턴은 MVC(Model View Controller)다.
- MVC
MVC 패턴은 지금까지 학습한 것처럼 하나의 서블릿이나 JSP로 처리하던 것을 컨트롤러와 뷰라는 영역으로 서로 역할을 나눈 것을 말한다.
- 컨트롤러(C): HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
- 모델(M): 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
- 뷰(V): 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다.
- MVC 패턴 1(좋지 않은 방법: 하단 글 참조)
- MVC 패턴 2
위 그림처럼 MVC 패턴 이전의 모습과 다르게 컨트롤러, 모델, 뷰를 나눠 개발한다.
순서로 예시를 들자면
1. 클라이언트가 localhost:8080/basic/items/add 를 통해 아이템 등록을 하려고 한다.
그러면 아래의 컨트롤러 코드(addItemV6)가 실행된다.
아이템을 등록하는 것이니 리포지토리에 접근하기 위해 itemRepository.save(item);을 한 것을 볼 수 있다.
(역할을 나누는 것이 MVC 패턴에서 중요한 점이다.)
@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/{itemId}";
}
2. 1번에서 접근된 itemRepository의 save 함수의 코드는 다음과 같고 item을 저장하게 된다.
public Item save(Item item) {
item.setId(++sequence);
store.put(item.getId(), item);
return item;
}
3. 다시 addItemV6 함수로 돌아와 addAttribute로 아이템을 모델에 넣게 된다.
(데이터 전달)
4. 그리고 이 예시에선 타임리프를 사용하기 때문에 html 파일을 return 값으로 호출한다.
5. 호출된 html에서는 3번에서 addAttribute를 해준 모델을 참조한다.
6. 마지막으로 사용자에게 뷰(html)의 모습을 보여준다.
MVC 패턴 1과 MVC 패턴 2의 차이점은 패턴 1에서 컨트롤러에 비즈니스 로직을 둘 경우 컨트롤러에서는 너무 많은 역할을 담당한다.
따라서 일반적으로는 비즈니즈 로직은 서비스(Service)라는 계층을 별도로 만들어 처리한다.
그리고 컨트롤러는 비즈니스 로직이 있는 서비스를 호출하는 담당을 한다.
'JAVA > Spring' 카테고리의 다른 글
[Spring] Bean Validation의 한계, 해결하기 위한 방법 두 가지(groups, Form 나누기) (0) | 2022.09.19 |
---|---|
[Spring] Bean Validation이란? / 사용해보기 (0) | 2022.09.19 |
[Spring] Bean 스코프의 종류와 사용법 (싱글톤, 프로토타입) (1) | 2022.09.02 |
[Spring] 롬복(Lombok) 설치 및 간단하게 사용 (feat. 최신 트렌드) (0) | 2022.09.02 |
[Spring] 스프링 컨테이너가 싱글톤을 보장해주는 이유 (0) | 2022.09.01 |