MVC 컴포넌트 역할
Controller
클라이언트의 요청을 받았을 때 요청에 대한 실제 업무를 수행하는 Model Component를 호출한다
클라이언트가 보낸 데이터가 있다면, 모델을 호출할 때 전달하기 쉽게 적절히 가공하는 일을 한다
Model이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달한다.
즉, 클라이언트 요청에 대해 모델과 뷰를 결정하여 전달하는 일을하며, 일정의 조정자라고 할 수 있다
Model
데이터 저장소(예: DB, 디렉토리서비스 등)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다룬다.
특히 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶은 트랜잭션을 다루는 일도 한다
View
모델이 처리한 데이터나 그 작업 결과를 가지고, 사용자에게 출력할 화면을 만든다. 만든 화면은 웹 브라우저가 출력한다
즉, 뷰는 HTML, CSS, Javascript를 사용하여 웹 브라우저가 출력할 UI를 만든다
+) MVC 아키텍쳐에서 View Component를 만들 때 보통 JSP를 사용하며, JSP는 화면 생성을 쉽게 해주는 기술이라고 볼 수 있다. 서블릿
MVC 구동 원리
웹 브라우저가 Web Application 실행을 요쳥하면, 웹서버가 그 요청을 받아서 Servlet Container(예:톰캣 서버)에 넘겨준다.
Servlet Container는 URL을 확인하여 그 요청을 처리할 Servlet을 찾아서 실행한다서블릿은 실제 업무를 처리하는 Model 객체의 메서드를 호출한다
만약 웹 브라우저가 보낸 데이터를 저장하거나 변경해야 한다면 그 데이터를 가공하여 VO를 생성하고, Model의 메소드를 호출할 때 인자값으로 넘긴다Model은 JDBC를 사용하여 매개변수로 넘어온 VO를 DB에 저장하거나, DB로부터의 Query 결과를 가져와서 VO로 만들어 반환한다
이렇게 VO는 객체와 객체 사이에 데이터를 전달하는 용도로 사용하기 때문에 '데이터 전송객체(DTP, DataTransfer Object)'라고 부르기도 한다서블릿은 Model로부터 반환받을 값을 JSP에 전달한다
JSP는 서블릿으로부터 전달받은 VO를 참조하여 웹 브라우저가 출력할 결과 화면을 만든다
그리고 웹 브라우저에 출력함으로써 요청 처리를 완료한다웹 브라우저는 서버로부터 받은 응답 내용을 화면에 출력한다
JSP 구동 원리
JSP 기술의 중요한 목적은 컨텐츠를 출력하는 코딩을 단순화하는 것이다
JSP를 사용하면 Java로 출력문을 작성할 필요가 없다. JSP 엔진이 자바 출력문을 만들어주기 때문이다.
즉, JSP는 서블릿 자바 파일을 만들기 위한 템플릿을 사용된다.
아래는 JSP 실행 과정이다
- 개발자가 서버에 JSP 파일을 작성해 둔다
- 클라이언트가 JSP 실행을 요청하면, Servlet Container가 JSP에 대응하는 자바 서블릿을 찾아서 실행한다
- 만약 JSP에 대응하는 서블릿 파일이 없거나, JSP가 변경되었다면, JSP 엔진을 통해 JSP 파일을 해석하여 서블릿 자바 소스를 생헝한다
- 서블릿 자바 소스는 자바 컴파일러를 통해 서블릿 클래스 파일로 컴파일된다. (JSP 파일을 변경할 때마다 이 과정이 반복된다)
- JSP로부터 생성된 서블릿은 서블릿 구동 방식에 따라 실행된다. 즉, 서블릿의 service() 메소드가 호출되고, 출력 메소드를 통해 서블릿이 생성한 HTML 화면을 웹 브라우저로 보낸다.
JSP의 주요 구성 요소
JSP를 구성하는 요소는 크게 두가지로 나눌 수 있다
템플릿 데이터
클라이언트로 출력되는 콘텐츠이다. HTML, 자바스크립트, CSS, JSON형식 문자열, XML, 일반 텍스트 등을 말한다
템플릿 데이터를 작성하기 위한 별도의 문법은 없으며, 서블릿 코드를 생성할 때 출력문으로 바뀐다.
JSP 전용 태그
특정 자바 명령문으로 바뀌는 태그이다
지시자 : <%@ %>
- page, taglib, include
- <%@ 지시자 속성="값" 속성="값" %>
스크립트릿 : <% %>
- JSP 페이지 안에 자바코드를 넣을 때 scriptlet Elements 태그<% %> 안에 작성한다
JSP 내장객채
- JSP 페이지에서 스크립트릿이나 표현식<%= %>을 작성할 때 별도의 선언없이 사용하는 자바 객체
- 이런 객체를 JSP 내장 객체(Implicit Objects)라고 한다
선언문 : <%! %>
- 서블릿클래스의 멤버(변수나 메소드)를 선언할 때 사용하는 태그
표현식 : <% =%>
- 문자열을 출력할 때 사용한다. 표현식 안에는 결과를 반환하는 자바 코드가 와야한다
데이터 보관소
서블릿이 서로 협력하여 작업을 수행할 때, 데이터를 공유하는 방법을 알아보자.
서블릿 기술은 데이터를 공유하기 위한 방안으로 4가지 종류의 데이터 보관소를 제공한다.
각각의 데이터 보관소는 공유 범위를 기준으로 구분된다.
ServletContext 보관소
- 웹 어플리케이션이 시작~ 종료까지 유지된다.
- 모든 서블릿이 사용할 수 있다.
- JSP에서는 application 변수를 통해 이 보관소를 참조한다.
- 예) 데이터베이스 connection
ServletContext sc = this.getServletContext(); sc.setAttribute("conn", conn);
HttpSession 보관소
- 클라이언트 최초 요청 시 생성되어 브라우저 닫을 때까지 유지된다
- 보통 로그인할 때, 이 보관소를 초기화하고 로그아웃하면 이 보관소에 저장된 값을 비운다
- JSP에서는 session 변수를 통해 이 보관소를 참조할 수 있다
- 활용 예시 : 로그인
- HttpSession 객체는 클라이언트 당 한 개가 생성된다
- 웹 브라우저로 요청이 들어오면, 그 웹 브라우저를 위한 HttpSession 객체가 있는지 검사하고, 없다면 새로 만든다
- 이렇게 생성된 객체는 웹 브라우저로부터 일정시간 동안 Timeout 요청이 없으면 삭제된다
HttpSession session = request.getSession(); session.setAttribute("member", member);
ServletRequest 보관소
- 클라이언트의 요청이 들어올 때 생성되어, 클라이언트에게 응답할 때까지 유지된다
- 이 보관소는 포워딩이나 인클루딩 하는 서블릿들 사이에서 값을 공유할 때 유용하다.
- JSP에서는 request 변수를 통해 이 보관소를 참조할 수 있다.
@Override protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher rd = request.getRequestDispatcher("/auth/LogInForm.jsp"); // forward()를 호출할 때, request와 reponse를 그대로 넘겨준다! rd.forward(request, response); }
JSPContext 보관소
- JSP 페이지를 실행하는 동안만 유지된다.
- JSP에서는 pageContext 변수를 통해 이 보관소를 참조할 수 있다.
- 활용) JSP 페이지의 로컬변수와의 차이점 : 태그 핸들러가 데이터에 접근할 수 있으면 jspContext인데 자세한 내용은 PASS
JSP 액션태그
useBean
도서: 자바 웹 어플리케이션 [엄진영 지음, 프리렉]