Spring 177

SpringMVC 구조 정리

직접 만든 MVC 프레임 워크 구조를 살피면서 SpringMVC 구조와 비교해보자. SpringMVC 구조는 고객의 요청이 오면(HTTP 요청) FrontController 역할을 하는 DispatcherServlet이 핸들러 매핑에게 핸들러 조회를 하고 여러개의 핸들러를 스프링 부트가 등록을 해놓는다. 핸들러 어댑터 목록에 던지면 핸들러 어댑터가 얘를 처리할 수 있는데 하고 핸들러 어댑터가 튀어나온다. 핸들러 어댑터를 통해서 실제 핸들러를 호출하고(컨트롤러) 반환을 해준다. 그리고 View가 렌더가 되면서 실제 HTTP 고객의 응답에 나가게 된다. HandlerMapping은 2개가 있다. 0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapp..

Spring/SpringMVC 2022.04.28

스프링 MVC를 시작과 컨트롤러 통합 & 실용적인 방식

@RequestMapping @RequestMapping 애노테이션 컨트롤러가 등장하면서, MVC 부분도 스프링의 한 부분이다. @RequestMapping RequestMappingHandlerMapping RequestMappingHandlerAdapter 이제 본격적으로 컨트롤러를 @RequestMapping 기반의 스프링 MVC 컨트롤러로 변경해보자. 회원 등록 폼을 만들어보자. SpringMemberFormControllerV1 package hello.setvlet.web.springmvc.v1; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping..

Spring/SpringMVC 2022.04.28

뷰 리졸버

뷰 리졸버에 대해서 알아보자. View를 사용할 수 있도록 아래 코드를 추가해주고 return new ModelAndView("new-form"); 원래 만들었던 OldController에서 return 값을 new-form으로 설정해준다. package hello.setvlet.web.springmvc.old; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servle..

Spring/SpringMVC 2022.04.28

핸들러 매핑과 핸들러 어댑터

springmvc 패키지를 만들고 OldController 클래스를 만들어보자. 이게 과거 버전 스프링 컨트롤러이다. 실행하여 @Component에 적혀있는 url로 들어가게 되면 http://localhost:8080/springmvc/old-controller package hello.setvlet.web.springmvc.old; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import..

Spring/SpringMVC 2022.04.28

스프링 MVC 전체 구조

직접 만든 MVC 프레임워크 개발해 나갈 SpringMVC 구조는 이렇다. 위와 완전 비슷하다. 직접 만든 프레임워크 스프링 MVC 비교를 해보면 FrontController =>DispatcherServlet handlerMappingMap => HandlerMapping MyHandlerAdapter => HandlerAdapter ModelView => ModelAndView viewResolver => ViewResolver MyView => View로 되어있다. DispatcherServlet 구조를 보면 org.springframework.web.servlet.DispatcherServlet 스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다. 동작 순서 핸들러 조회: 핸들러 매핑을 통해 ..

Spring/SpringMVC 2022.04.25

유연한 컨트롤러1 - v5

이제 어댑터 패턴을 써보자 V3 V4에서 개발한 프론트 컨트롤러는 한가지 방식의 컨트롤러 인터페이스만 계속해서 사용했다. `ControllerV3`, `ControllerV4`는 완전히 다른 인터페이스이고 호환이 불가능하다. 어댑터 패턴을 사용해서 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리하도록 변경하자. V5 구조를 만들어서 보자. 중간에 핸들러 어댑터를 두자. 그러면 FrontController가 직접 Controller를 호출하는 것이 아니고 어댑터를 통해서 호출을 한다. FrontController가 어댑터한테 handler 파라미터를 넘겨서 어댑터가 컨트롤러한테 다른 걸 호출해준다. 그러면 핸들러 어댑터가 대신 호출해주고 핸들러한테 결과 받고 FrontController한테 ModelVi..

Spring/SpringMVC 2022.04.25

단순하고 실용적인 컨트롤러 - v4

단순하고 실용적인 컨트롤러 - v4를 만들어 보자. v3 컨트롤러는 서블릿 종속성을 제거하고 뷰 경로의 중복을 제거하는 등, 잘 설계된 컨트롤러이지만 컨트롤러 인터페이스를 구현하는 입장에서 항상 ModelView 객체를 생성하고 반환해야 하는 부분이 번거롭다. 프레임워크가 좋다는 거는 아키텍져도 좋지만 실제 개발자가 편리하게 사용하고 실용성이 있어야 한다. v3를 조금 변경해서 개발자들이 편리하게 개발가능한 v4 버전을 개발해보자. v4 package에서 ControllerV4를 만들어주자. package hello.setvlet.web.frontcontroller.v4; import java.util.Map; public interface ControllerV4 { /** * * @param param..

Spring/SpringMVC 2022.04.25

Model 추가 - v3

서블릿 종속성을 제거하고 구현 코드를 단순화 해보자. 요청 파라미터 정보는 자바의 Map으로 대신 넘기도록 하면 지금 구조에서 컨트롤러가 서블릿 기술을 몰라도 동작할 수 있다. 또 request 객체를 Model로 사용하는 대신 별도의 Model 객체를 만들어서 반환하면 된다. public MyView process(HttpServletRequest request, HttpServletResponse response) request, response 코드가 없어도 되는 것이다. 구현하는 컨트롤러가 서블릿 기술을 사용하지 않도록 변경 해보면 구현코드와 테스트 코드 둘 다 작성이 쉬워진다. HttpServletRequest request, HttpServletResponse response 뷰 이름 중복 제..

Spring/SpringMVC 2022.04.24

View 분리 - v2

컨트롤러 모든 부분에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않았다. String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); 이 부분을 분리하기 위해 뷰를 별도로 처리해서 객체를 만들자. 컨트롤러가 JSP 포워딩에 대해서 고민하지 않고 MyView만 생성해서 호출만 해주면 된다. MyView를 만들어보자. package hello.setvlet.web.frontcontroller; import javax.servlet.RequestDispatcher; import ja..

Spring/SpringMVC 2022.04.24