MVC패턴 이해 및 동작의 이해
MVC 패턴
소프트웨어의 디자인 패턴
모델
어떠한 동작을 수행하는 코드들, 즉, 비즈니스 로직 및 데이터 처리 담당
- Model의 상태에 변화가 있을 때 Controller와 View에 이를 통보
- 이를 통해 View는 최신의 결과를, Controller는 해당 상태에 따른 명령(CRUD)을 제공
뷰
수행된 모델의 결과를 사용자에게 보여줌
컨트롤러 (Servlet)
사용자로 하여금 모델의 상태에 변화를 줄수 있게 해줌
- 웹 브라우저에서 컨트롤러에 요청
- 컨트롤러가 모델을 호출
- 모델은 결과를 컨트롤러에 반환
- 컨트롤러는 뷰에 화면을 요청
- 뷰는 컨트롤러에 결과화면을 반환
- 컨트롤러는 웹 브라우저에 결과화면을 반환
Servlet관련 객체 및 주요 메서드
Interface Servlet
- void init(ServletConfig config);
- ServletConfig getServletConfig();
- 서블릿 초기화에 이용된 ServletConfig를 반환
- void service(ServletRequest request, ServletResponse response);
- 파라미터로 들어온 request에 대해 response를 생성
- String getServletInfo();
- void destroy();
- Servlet Container가 종료 시 생성된 모든 서블릿에 대해 실행하여 GC에 의해 정리되는 메서드
Interface ServletConfig
- String getServletName();
- ServletContext getServletContext();
- 실행중인 caller가 참조하는 ServletContext를 반환
- String getInitParameter(String name);
- 초기화에 사용될 파라미터 이름 'name'에 해당하는 값을 반환 / 없다면 null
- Enumeration<String> getInitParameterNames();
- 초기화 할 파라미터들의 이름에 대한 Enumeration을 가져옴
Interface ServletContext
- 하나의 서블릿이 서블릿 컨테이너가 정의하고 관리하는 자원을 사용하기 위한 메서드들을 가지고 있는 Interface
- getAttribute, getContext, setAttribute등이 여기에
GenericServlet
- void init()
- void destroy()
- 서블릿의 객체가 메모리에서 사라질 때 호출되는 메서드
- void service(request, response)
- 서블릿의 요청이 있을 때 호출되는 메서드 (doGet, doPost모두)
HttpServlet
- void doGet(request, response)
- form의 method가 get일때 호출되는 메서드
- void doPost(request, response)
- form의 method가 post일때 호출되는 메서드
HttpServletRequest
- Enumeration<String> getParameterNames()
- 현재 요청에 포함된 매개변수 이름을 열거 형태로 넘겨줌
- String getParameter(String name)
- 문자열 name과 같은 이름을 가진 매개변수 값을 가져옴
- String[] getParameterValues(name)
- 문자열 name과 같은 이름을 가진 매개변수 값을 배열 형태로 가져옴
- Cookie[] getCookies()
- 모든 쿠키 값을 javax.servlet.http.Cookie의 배열 형태로 가져옴
HttpServletResponse
- void addCookie(Cookie cookie)
- void setContentType(String type) // (ServletResponse)
- 문자열 형태의 type에 지정된 MIME Type으로 Content Type을 지정
HttpSession
- getAttribute, setAttribute
Cookie
Servlet URL Mapping
- 서블릿의 @WebServlet("/URL") 어노테이션을 사용한 매핑
- web.xml을 통한 매핑
- 보안상 문제로 경로 노출을 방지하기 위해 사용
EX )
HttpServlet Life Cycle
- 클라이언트로부터 요청이 오면 Serlvet클래스가 로딩되어 Servlet객체가 생성
- init()메서드 호출, Servlet초기화
- service()메서드 호출, Servlet이 요청 처리
- service()메서드는 특정 http 요청을 처리하는메서드 호출 (doGet, doPost)
- destroy()메서드 호출, Servlet 제거
Page이동 관련 객체 및 메서드
Forwarding
ServletRequest.getRequestDispatcher(path)
ServletContext.getRequestDispatcher(path);
Redirect
- 응답하면서 방향을 틀기 때문에 response에 있음
- 웹브라우저의 header의 방향을 차즌 것이므로 ServletResponse에는 없음
- sendRedirect() 메소드는 HttpServletResponse에 있음. ServletResponse로부터 상속받은 것 아니고 http에 특화된 기능.
뭔차이?
Forward
- 요청이 들어왔을 때 서버상에서 바로 다른 컴포넌트, 다른 자원으로(서블릿->JSP) 이동하는 것(브라우저 안 거침)
- 포워드는 같은 서버사이드에서만 이동할 수 있음.
Redirect
- 요청이 들어왔을 때 일단 응답하고 다시 요청. 브라우저 거치고 가는 것. 브라우저를 거치면 어떤 서버사이드이든 다 연결될 수 있음.
- 리다이렉트는 다른 서버사이드로도 이동할 수 있음. 컨테이너가 달라도 이동 가능. 완전히 다른 서버사이드의 리소스에 접근 가능.
거의 대부분의 페이지가 포워딩을 씀. 그렇다면 신경 써야 할 부분은 언제 리다이렉트를 하는가?
- 정적인 문서로 가야 하는 경우 : 포워딩은 컨테이너 안에서 이루어짐. 동적인 프로그램만 해당된다! 정적인 문서로 이동할 때는 컨테이너 안에서 갈 수 없음. 컨테이너 밖에 있는 웹 서버로 가야 함!! 즉, 브라우저를 거쳐야 하는 경우 == 정적인 문서로 가야 하는 경우.
- 에러 페이지 404 : 에러 페이지 핸들링은 리다이렉트로 해야 함. 에러 페이지는 전부 다 정적인 문서이기 때문
JSP구성 요소별 기능 및 사용 방법
- 스크립트(Script) 요소
- 지시어 (디렉티브:directive)
- 내장객체 (Implicit Object)
- 액션태그(Action Tag)
- 표현언어 (Expression Language)
- 사용자 정의 태그, JSTL
스크립트(script)요소
- 스크립트릿 : <% .. %>
- JSP 페이지 내부에 자바(JAVA) 소스코드를 삽입한다.
- 표현식 : <%= ... %>
- 출력결과(HTML 요소내) 에 값(value) 를 넣기위해 사용한다.
- 선언 : <%! ... %>
- JSP 페이지 내부에 자바 메소드 (JAVA method) 를 선언한다
지시어(디렉티브:directive)
- <%@ page ... %>
- 스크립트언어 , 에러페이지 지정, 버퍼 설정 등 을 정의한다.
- <%@ include ... %>
- <%@ tablib ... %>
내장객체(Implicit Object)
- request
- 클라이언트에서 서버로 보내지는 요청과 관련된 객체
- response
- 서버에서 클라이언트로 보내지는 응답과 관련된 객체
- out
- session
- 서버측 웹컨테이너 에 사용자의 상태를 관리하는 객체
- application
- 어플리케이션 전반에 걸친 정보를 관리하는 객체
- config
- 페이지와 관련된 서블릿 설정 (servlet config) 객체
- pageContext
- page
- 페이지에 대한 실제 인스턴스 (자바클래스) 를 저장하고 있는 객체
- Exception
액션태그 (Action Tag)
- jsp:include
- 페이지가 요청될때 해당 태그가 위치한 곳에 파일을 포함시킨다.
- jsp:useBean
- jsp:setProperty
- jsp:getProperty
- jsp:forward
- 하나의 jsp 페이지 에서 다른 jsp 페이지 로 강제이동 시킨다.
- jsp:plugin
- javaBean 또는 Applet 을 현재 jsp 페이지 에 포함시킬때 사용한다.
- jsp:element
- jsp:attribute
- 동적으로 정의된 XML 태그의 속성을 정의한다.
- jsp:body
- 동적으로 정의된 XML 태그의 본문을 정의한다.
- jsp:text
- JSP 페이지와 문서에 템플릿 텍스트를 쓰는데 사용한다.
표현언어(Expression Language, EL)
스크립트 요소의 사용없이 JSP 페이지에 값을 표현할수 있는 태그 기반의 새로운 언어이다.
기본문법은 ${expr} 이며 표현언어의 포현식에는 정수, 부동수소점 수 , 문자열, 부울값,에 대한 참거짓, 내장null을 사용할수있다.
사용자 정의 태그 , JSTL
- JSP 가 제공해주는 태그 외에 사용자가 별도로 정의하여 사용할수 있는 태그이며 JSTL 또한 사용자 정의 태그에 속한다.
- JSTL (JSP Standard Tag Libary) 는 자바언어의 조건문, 반복문과 같은 프로그래밍 요소를 태그로 구현할수 있게 해준다.
선언 : <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <c:out>
- <%= .. %> 와 유사하며 표현식에 사용된다.
- <c:set>
- JSP 에 사용될 변수를 지정하며 범위를 설정할 수 있다.
- <c:remove>
- 변수를 제거한다. ( 범위를 설정한 경우 해당 범위내의 변수를 제거 )
- <c:catch>
- 에러 (Exception) 를 캐치하고 이를 처리한다.
- <c:if>
- <c:choose>
- 조건태그 이며 배타적인 조건부 연산에 사용된다.
- <c:when>
- choose 태그가 사실일경우 본문에 포함된다.
- <c:otherwise>
- choose 태그가 거짓일경우 본문에 포함된다.
- <c:import>
- <c:forEach>
- 컬렉션 또는 Map 과 같은 유형을 허용하고 이를 반복처리한다.
- <c:forTokens>
- <c:param>
- import 태그에 설정된 url 에 파라미터를 추가한다.
- <c:redirect>
- <c:url>