웹 서버 : HTTP 기반으로 동작, 정적 리소스 제공
WAS: 웹 서버 기능 포함 + 프로그램 코드를 통해 애플리케이션 로직 수행
웹서버 정적 리소스만 제공하므로 잘 죽지 않음. WAS는 애플리케이션 로직이 동작하므로 죽을 가능성이 높음
web.xml로 요청 uri 와 서블릿 객체를 매핑
→ 서블릿 컨테이너에서 서블릿 객체들을 관리해줌
→ web.xml에 모든 서블릿을 매핑하고 작성하는 등 넘나 귀찮띠
→ 프론트 컨트롤러 패턴을 도입
프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아 호출
서블릿으로 동적 처리를 위해 아래와 같이 문자로 작성
w.write("<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
"</head>\n"
에바다.. 자바 코드로 html을 만드는 것 보다 html에 변경해야 하는 부분에만 자바 코드를 넣자
해서 나온게 탬플릿 엔진 (JSP, 타임리프…)
→ JSP가 너무 무거워짐
→ HTML과 자바가 한 파일에 있어 동시 작업이 불가..
컨트롤러: HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
모델: 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
뷰: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 여기서는 HTML을 생성하는 부분을 말한다.
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/
members")
public class MvcMemberListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
String viewPath = "/WEB-INF/views/members.jsp"
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
→ 중복되는 코드가 너무 많고, 필요없는 코드까지 껴있다.
→ view path, 포워드 중복, 공통 처리 많음
컨트롤러 호출 전에 공통 기능을 처리하는 프론트 컨트롤러 패턴 도입
/WEB-INF/views + .jsp
핸들러 매핑의 우선순위
0 = RequestMappingHandlerMapping
핸들러 어댑터의 우선순위
0 = RequestMappingHandlerAddapter
둘 다 @RequestMapping 에서 사용함
@RequestParam
@ModelAttribute
요청 파라미터를 바인딩 받을 객체 : HelloData를 미리 만들어줌
@Data
class HelloData {
private String username;
private int age;
}
public String modelAttributeV1(@ModelAttribute HelloData hellodata)
→ HelloData 객체가 생성, 요청 파라미터 값도 모두 들어가 있다
@RequestBody
를 통해 HTTP 메시지 바디 정보를 편하게 조회 가능@RequestHeader
를 통해 헤더 정보 조회 가능@RequestBody
를 통해 JSON 데이터도 간단하게 받을 수 있다