일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- DI
- 비정적중첩클래스
- 인수테스트
- 싱글톤패턴
- 정적중첩클래스
- IoC
- SOLID
- java
- 9기
- 클라이언트사이드렌더링
- 자바의정석
- 더티채킹
- 서버사이드렌더링
- refreshtoken
- Velog
- 스파르타코딩클럽
- publicapi
- Spring
- 스프링컨테이너
- github actions
- 항해99
- privateapi
- 다형성
- 지네릭스
- 인프콘
- 항해99 9기
- bean
- 변경감지
- 일급컬렉션
- 애너테이션
- Today
- Total
멈재
[JAVA/Spring] 07. MVC 패턴 (추가 예정) 본문
MVC 패턴이 나오게 된 배경
- 기존에 Servlet과 JSP으로 개발할 당시, Servlet으로 개발할 때는 뷰(View)화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡하고, JSP로 개발할 때는 절반은 비지니스 로직이고, 나머지 절반은 HTML로 보여주기 위한 뷰 영역이었다.
- 이후에 MVC Model 1이 적용되면서 서블릿이나 JSP로 처리하던 것을 서블릿을 컨트롤러로 사용하고, JSP를 뷰로 사용해서 컨트롤러 / 뷰 라는 영역으로 역할을 나누었다.
- 그러나, MVC Model 1은 컨트롤러에 비지니스 로직을 두었지만 이렇게 되면 컨트롤러가 너무 많은 역할을 담당하게 되었고, 몇 가지 단점들도 존재하게 되었다.
1. MVC Model 1의 단점1 - ViewPath와 포워드 중복
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response)
2. MVC Model 1의 단점2 - 사용하지 않는 코드
다음 코드들을 사용할 때도 있고, 사용하지 않을 때도 있다.
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response)
즉, 공통 처리의 어려움이 존재하게 되고, 이 문제를 해결하려면 컨트롤러 호출 전에 공통 기능을 처리해야 하는 무언가가 필요하다.
그래서 이 공통 기능에 대한 처리를 하나로 두는 “프론트 컨트롤러(Front Controller)패턴”을 적용시킨 지금의 MVC 패턴이 등장하게 되었다.
스프링 MVC 구조
프론트 컨트롤러(FrontController)의 특징은 다음과 같다.
- 프론트 컨트롤러 하나로 클라이언트의 요청들을 받고, 요청에 맞는 컨트롤러를 찾아 호출한다. 즉, 요청을 처리하는 입구가 하나가 되기 때문에 공통 처리가 가능하게 된다.
- 프론트 컨트롤러가 서블릿 요청을 전부 다 받기 때문에 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.
- 스프링 웹 MVC의 DispacherServlet이 FrontController패턴으로 구현되어 있다.
그래서 기존에 가지던 문제점들을 보완하여 나온 것이 MVC Model 2 패턴이고, 이 패턴이 스프링 웹 MVC에 적용되어 있다.
아래 이미지가 스프링 MVC 프레임워크의 구조이다.
Dispatcher Servlet이 추가되고, Adapter 패턴이 적용됨으로써 Dispatcher Servlet이 다양한 방식의 핸들러(Controller)를 처리할 수 있게 되었다.
스프링 MVC 프레임워크의 동작 순서는 다음과 같다.
- 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회해서
- 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 찾고,
- 핸들러 어댑터 실행: 핸들러 어댑터를 실행시켜서
- 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행(호출)한다.
- ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- viewResolver 호출: 뷰 리졸버를 찾고 실행한다. (JSP의 경우: InternalResourceViewResolver 가 자동으로 등록되고, 사용된다.)
- View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. JSP의 경우 InternalResourceView(JstlView) 를 반환하는데, 내부에 forward() 로직이 있다.
- 뷰 렌더링: 뷰를 통해서 뷰를 렌더링 한다.
MVC 프레임워크로는 Java의 Spring, php의 Laravel, python의 Django, Ruby의 Ruby on Rails, 함수형 언어 Scala의 Play등이 존재한다.
특이하게 몇몇 프레임워크에서는 MVC라고 안하고, MTV(T,Template)라고 한다.
https://youngminieo1005.tistory.com/m/84
결론적으로 MVC 패턴을 사용하게 될 경우 다음과 같은 이점을 가질 수 있다.
- 동시다발적으로 개발할 수 있다.
- 백엔드와 프론트엔드가 독립적으로 개발할 수 있다. 백엔드는 또 세부적으로 독립적으로 개발할 수 있게 된다.
- 책임 영역이 구분되기에(모델, 뷰, 컨트롤러) 높은 응집도를 가지게 된다.
추가로 참고할만한 사이트
https://velog.io/@ljinsk3/MVC-패턴
우아한 테크 -MVC 패턴 리뷰- [레이어, MVC 패턴, 5레이어]
*참고*
'JAVA & Spring & JPA' 카테고리의 다른 글
[Spring/JPA] 14. AttributeConverter로 코드의 가독성을 높여보자 (0) | 2022.12.20 |
---|---|
[JAVA] 13. JAVA의 HashSet은 어떻게 동작할까? (1) | 2022.12.19 |
[JAVA/Spring] 10. CQS 패턴 (Command Query Separation) (0) | 2022.12.17 |
[JAVA] 08. 일급 컬렉션(First Class Collection) (0) | 2022.10.19 |
[JAVA/Spring] 04. DI & IoC & Bean - 1 (0) | 2022.10.09 |