✨KB IT's Your Life✨ 5기 TIL 기자단 활동
KB IT's Your Life 5기에서 학습한 내용을 복습하고자 정리한 글
기간: 7/29 ~ 8/4
학습 내용: JSP & Servlet

웹 프로그램 구조(서버 위주)

Web Server

주로 정적인 파일(HTML, CSS, 이미지 등)을 제공하는 역할을 하는 서버

클라이언트의 요청을 받아들이고, 요청에 맞는 정적 파일을 응답으로 제공

HTTP(HyperText Transfer Protocol)

HTML(Hyper Text Markup Language)를 전송하기 위해 만든 규칙(Protocol)

특징

  • connectionless(비연결성)

    받은 요청에 대해 응답한 뒤 통신 끊어버림
    (요청하는 클라이언트 무수하기 때문)

    통신 시 연결을 유지하지 않고 데이터 주고받음

  • stateless(무상태성)

    클라이언트의 상태 정보를 유지하지 않음

    요청마다 독립적인 트랜잭션으로 취급하여 이전 연결했던 작업을 그대로 사용할 수 없음

⇒ 이러한 특징 때문에 상태 정보 유지가 필요한 작업에서는 쿠키, 세션 등의 기술을 통한 보완 필요

HTTP 요청(Request) 프로토콜 [브라우저 → 서버]

브라우저는 HTTP 요청 프로토콜을 웹 서버에 전달하고, 웹 서버가 전송한 HTTP 응답 프로토콜을 처리

가장 첫 번째 줄에(start-line) 요청 방식(GET/POST), 요청 URI, 프로토콜/버전 정보를 전달

HTTP 응답(Response) 프로토콜 [서버 → 브라우저]

서버는 브라우저로부터 전송받은 HTTP 요청 프로토콜에서 정보를 추출하여 요청을 처리한 뒤, HTTP 응답 프로토콜을 생성하여 처리 결과를 브라우저로 전송

가장 첫번째 줄에(status-line) HTTP 버전, 상태 코드(status code), 상태 메세지(status text)가 전달

상태 코드
브라우저 요청에 대한 처리 결과를 코드로 표현한 것
사용자는 상태 코드를 통해 요청의 성공 여부를 판단하거나 문제 발생 시 원인 확인이 가능

상태 메세지
상태 코드의 의미를 쉽게 설명하기 위한 간단한 메세지

GET 요청 방식

서버에 전달할 URI 뒤에 사용자가 입력한 정보를 ?와 key=value 형태로, 입력한 정보가 여러개인 경우 &로 연결하는 쿼리 문자열로 전달

→ 사용자가 입력한 정보가 외부에 노출되기 때문에 보안이 중요한 정보는 GET 요청방식으로 전달해서는 안됨!!

POST 요청 방식

GET 방식과 달리 쿼리 문자열이 message-body에 포함되어 전달

→ 보안이 중요한 정보는 반드시 POST 요청 방식으로 전달할 것!

WAS(Web Application Server)

동적인 콘텐츠를 생성하고 데이터를 처리하는 역할의 서버

다른 서버와의 통신을 통해 필요한 데이터를 가져와 동적인 응답을 생성

사용자의 요청에 따라 DB 조회, 비즈니스 로직 처리 등 다양한 작업을 수행

⇒ 다양한 작업 수행에 ServletJSP가 사용되는 것!


Servlet

서블릿(Servlet)이란?

Servlet = Server + let

let은 특정 분야에서 사용되는 작은 프로그램이라는 의미라고 한다!

즉, 서블릿 이란 서버에서 동작하는 작은 프로그램이라는 의미

서버에서 HTTP 응답과 요청 처리가 가능한 자바의 클래스 혹은 객체가 Servlet

Servlet 작성 규칙

  • javax.servlet, javax.servlet.http의 패키지의 API를 import
  • public 클래스로 선언
  • 반드시 기본 생성자 작성
  • 라이프 사이클과 관련된 콜백 메소드 오버라이딩

서블릿 컨테이너(Servlet Container)

Servlet을 처리하여 동작하게 하는 프로그램(Servlet 엔진이라고도 함)

주요 기능

  • 서블릿의 생명주기 관리
  • 요청과 응답 처리
    HTTP 프로토콜을 기반으로하여 클라이언트로부터 들어오는 HTTP 요청을 받아 해당 서블릿으로 전달하고, 서블릿이 생성한 응답을 클라이언트에게 반환
  • 멀티 스레딩 지원
  • 보안 관리
  • 세션 관리
    세션 ID를 통해 클라이언트와 서버 간의 상태를 유지
  • JSP 지원
    JSP 파일을 서블릿으로 변환하여 실행

Apache Tomcat은 대표적 서블릿 컨테이너 중 하나

Tomcat 설치시 Servlet과 Servlet 컨테이너도 함께 설치됨

Tomcat은 내부적으로 TCP 소켓 사용하여 클라이언트와 통신 처리

HTTP/HTTPS가 TCP 위에서 작동하기 때문에 TCP 통신을 기본으로 사용

Servlet 실행 순서

서블릿은 서블릿 컨테이너에 의해 실행

Servlet 생명주기

  1. 서블릿 로드 및 인스턴스 생성

    서블릿 클래스가 처음으로 요청될 때 또는 서버가 시작될 때 서블릿 클래스를 메모리에 로드하고 인스턴스를 생성
    일반적으로 서블릿이 처음 요청될 때 발생

  2. 초기화(Initialization)

    init() 메서드: 서블릿이 초기화될 때 한 번만 호출

  3. 서비스(Request Handling)

    service() 메서드: 클라이언트의 요청의 HTTP 메서드 종류에 따라 적절한 메서드(doGet(), doPost() 등) 호출

  4. 소멸(Destruction)

    destroy() 메서드: 서블릿이 소멸될 때 한 번만 호출

    주로 서블릿이 사용한 자원(resource) 해제에 사용

Servlet 등록 방식

웹 어플리케이션 프로젝트 구조

src/main/java

서블릿을 비롯한 일반적인 자바 클래스 파일 작성하는 위치


src/main/webapp # 가장 중요한 폴더!

HTML, 이미지, CSS, JavaScript 및 JSP 파일을 작성하는 위치


webapp
└─ WEB-INF
		└─ web.xml

WEB-INF

브라우저에서 직접 요청할 수 없는 특수한 디렉터리

web.xml파일과 컴파일된 클래스 파일들, 애플리케이션 실행에 필요한 외부 라이브러리 파일들을 포함

web.xml 파일

웹 애플리케이션 배치 기술 문서(tomcat 서버가 가장 처음 읽는 파일)

서블릿 컨테이너와 web.xml

서블릿 컨테이너는 디폴트로 WEB-INF 폴더에 있는 web.xml 파일을 로딩하도록 프로그래밍 되어있기 때문에 web.xml 파일에 오류가 있다면 서블릿 컨테이너는 정상적으로 생성되지 않는다!

web.xml로 등록하는 방식

<welcome-file-list>
	<welcome-file>프로젝트 실행 시 처음으로 실행 될 파일 지정</welcome-file>
</welcome-file-list>

<servlet>
	<servlet-name>서블릿 등록 이름</servlet-name>
	<servlet-class>등록할 서블릿 클래스(java 디렉토리 하위 패키지이름 전부 작성 필요)</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>서블릿 등록 이름</servlet-name>
	<url-pattern>url 패턴 매핑(해당 url 패턴에 대한 요청을 등록해 둔 서블릿이 처리)</url-pattern>
</servlet-mapping>

lazy-loading
컨테이너가 서블릿 객체를 생성하는 시점을 클라이언트가 요청하기 전까지 늦추는 것

web.xml 파일에 등록된 서블릿 클래스의 객체는 브라우저가 서버에 요청을 전달할 때 생성됨!

@WebServlet 어노테이션으로 등록하는 방식

// LoginServlet.java
@WebServlet(name = "loginProcess", value = "/loginProcess")
//@WebServlet("/loginProcess") // 이러한 방식으로 작성해도 동작(대신 name은 클래스명과 동일하게 자동생성)
public class LoginServlet extends HttpServlet {
    public LoginServlet() {
        System.out.println("LoginServlet 객체 생성됨");
    }
    // 파라미터 생성자는 사용 X
    // 서블릿 초기값 지정은 다른 메소드 사용하기 때문

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("GET 요청 들어옴");
        String id = req.getParameter("id");
        String password = req.getParameter("password");
        System.out.println("id : " + id + " password : " + password);
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head></head>");
        out.println("<body>");
        out.println("<h1>id >> " + id + " pw >> " + password + "</h1>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.out.println("POST 요청 들어옴");
    }
}

⚠️주의사항⚠️

등록 방식 두 가지를 중복으로 적용할 경우 같은 주소에 매핑은 허용할 수 없다는 오류가 발생하므로 주의할 것!!

// Error Message
java.lang.IllegalArgumentException: 이름이 [loginProcess][com.example.jsp01.LoginServlet]인 두 서블릿들 모두 url-pattern [/loginProcess]에 매핑되어 있는데, 이는 허용되지 않습니다.

Servlet 핵심 객체

HttpServletRequest 객체

HTTP 요청 프로토콜과 관련된 객체

HTTP 프로토콜이 서버에 전달되면 요청을 받은 서블릿 컨테이너는 HttpServletRequest 객체를 생성하고 HTTP 요청 프로토콜에 설정된 정보들을 추출하여 HttpServletRequest 객체에 설정한다

이렇게 생성된 HttpServletRequest 객체는 service(), doPost(), doGet() 메소드가 호출될 때 인자로 전달된다

HttpServletResponse 객체

HTTP 응답 프로토콜과 관련된 객체

HttpServletRequest 객체와 마찬가지로 서블릿 객체의 service() 메소드 매개변수로 선언되며, 서블릿 컨테이너가 생성하여 전달한다

화면 이동

서블릿에서 제공하는 화면 이동 방법은 redirect와 forwarding 2가지 방식

리디렉트(redirect)

HttpServletResponse가 제공하는 메소드

현재 실행 중인 서블릿을 중지하고 브라우저로 응답을 보내고, 브라우저에게 redirect로 지정한 경로를 다시 요청하도록 한다

→ 브라우저의 URL이 redirect한 URL로 변경

서블릿이 새로 생성되기 때문에 기존 객체가 가지고있던 정보는 따로 처리해두지 않는 이상 저장되지 않는다!

포워딩(forwarding)

redirect 방식이 두 번의 요청과 응답으로 화면을 이동하는 방식이라면, 포워딩은 한 번의 요청과 응답으로 화면 이동

→ 서버 안에서 화면 이동이 이뤄짐

서블릿 간 이동 = 서블릿 컨테이너 안에서의 이동이므로 브라우저 URL은 변경되지 않음

상태정보 유지(State Management)

사용자의 활동 및 애플리케이션의 현재 상태를 기억하고 유지하는 것을 상태 정보 유지라고 한다!

사용자가 페이지 간 이동 또는 새로고침을 해도 웹 애플리케이션이 그 이전의 상태를 잃지 않도록 하는 중요한 기능

상태 정보를 유지하기 위한 기법들이 쿠키와 세션!

HTTP 프로토콜의 비연결성(Conectionless)과 무상태성(Stateless) 특징으로 브라우저가 서버에 전달한 상태 정보가 지속적으로 유지되지 않음

쿠키(Cookie)

상태 정보를 브라우저가 설치된 컴퓨터(로컬)에 저장하는 기술

텍스트 형태의 상태 정보만 저장 가능

저장 가능한 데이터의 개수와 크기 제한적

setMaxAge() → 쿠키의 유효기간 설정

setDomain() → 도메인별로 쿠키 설정

쿠키 저장할 때: 브라우저에 저장하는 개념 → response 객체 사용

쿠키 가져올 때: 브라우저에서 받아오는 개념 → request 객체 사용

/* 쿠키 정보 저장하기 */

// 텍스트 형태의 상태 정보만 저장 가능 -> 문자열만 허용
Cookie c1 = new Cookie("name", "honggildong"); // 키-값 형태인 name-value로 저장됨(key인 name은 중복 불가 - unique해야함)
Cookie c2 = new Cookie("age", "100");

// 브라우저에게 쿠키를 심으라고 명령
response.addCookie(c1);
response.addCookie(c2);
/* 쿠키 정보 가지고 오기 */

// 브라우저에 저장되는 쿠키는 항상 배열로 저장되는 점에 유의할 것!
Cookie[] cookies = request.getCookies();

// 배열 길이로 쿠키 갯수 확인 가능
for (Cookie c : cookies) {
	out.println(c.getName() + ", " + c.getValue() + "<br>");
}

세션(Session)

두 가지 의미의 세션 구분할 것!

  1. 브라우저와 서버 간 연결 상태
  2. 서버에 저장되는 상태정보

쿠키와 세션 비교할 때는 두 번째 의미!!

세션은 서버에 연결된 클라이언트 단위로 생성되며, 생성 시 세션 아이디가 부여된다

세션 아이디는 클라이언트의 브라우저에 쿠키로 저장 → 도난 당하지 않도록 HTTPS 사용 권장

(tomcat은 JSESSIONID라는 이름의 쿠키로 세션 아이디를 브라우저 컴퓨터에 저장)

상태 정보를 서버에 저장하는 기술

모든 타입의 데이터 저장 가능(객체 형태도 저장 가능!)

서버 메모리가 허용하는 범위 내에서 얼마든지 저장 가능

서블릿 컨테이너가 브라우저 별로 저장되기 때문에 브라우저 종료(모든 브라우저 탭이 종료)되지 않는 이상 살아있음

/* 세션 정보 저장하기 */
session.setAttribute("apple", 1); // Object로 자동 형변환됨
/* 세션 정보 가지고 오기 */
String userId = (String)session.getAttribute("apple"); // Object 타입이므로 String으로 강제 형변환 필요
out.print(userId);

세션 메소드

setAttribute(String name, Object value) : 세션에 저장할 때 사용
값이 Object 타입이기 때문에 모든 타입 저장 가능(업캐스팅되어 들어감)

getAttribute(String name) : 세션에 저장된 정보 이름으로 가져옴
값 Object로 들어가있기 때문에 다운캐스팅해서 타입캐스팅 해야 원활하게 사용 가능(강제형변환 필요)

removeAttribute(String name) : 세션에 저장된 정보 중 해당하는 이름의 정보를 삭제
⇒ 이름으로 세션 정보 구분하기 때문에 이름은 유일해야함

setMaxInactiveInterval(int interval) : 세션의 최대 유효시간 설정

invalidate() : 세션 연결 아예 종료 = 모든 데이터 삭제

쿠키와 세션 비교

서버가 브라우저에 세션 번호를 부여 → 재접속했을때 인식 가능해짐

브라우저가 계속 사이트 사용할 생각 있는 동안

  • 상태 정보를 브라우저 측에 정보 심어두는 것 = 쿠키
  • 서버 측에서 여러개의 작업 누적해서 서버 ram에 저장 = 세션
쿠키세션
저장 위치클라이언트(브라우저)서버
생명주기설정된 만료 날짜 또는 브라우저의 완전 종료 시 소멸브라우저의 완전 종료 또는 타임아웃 발생 시 소멸
크기 제한약 4KB서버 메모리/저장 공간에 따라 다름
보안성비교적 취약비교적 안전
전송 방식HTTP/HTTPS 요청 시 마다 전송세션 ID만 전송
사용 예시로그인 정보, 사용자 설정, 광고 추적로그인 상태, 장바구니, 일시적인 사용자 정보

세션/쿠키 역할 잘 나눠서 분산 저장시키는게 좋다!

Filter & Listner

필터(Filter)

웹 프로젝트에서 요청을 받기 전 전처리 역할

POST 방식의 데이터 한글 처리 → 필터 만들어서 처리하는 편

한글처리, 시큐리티 처리 등 필터로 만들어서 사용하는 편

필터 = 인터페이스로 제공(클래스로 구현 필요)

등록

  • web.xml에서 등록(<filter>, <filter-mapping>)
  • @WebFilter 어노테이션 통해서 등록

필터 메소드

init(FilterConfig config) : 필터 객체 생성시 호출, 초기화 담당

doFilter(ServletRequest request, ServletResponse response, FilterChain ch) : 필터 실행시 호출

해당 필터에서 처리할 내용을 메소드 내부에 작성하면 됨

destroy() : 필터 객체 삭제시 호출

리스너(Listner)

리스너 = 이벤트 발생을 기다렸다가 자동호출되게 하는 클래스

이벤트 핸들러 = 지정한 이벤트가 발생하면 처리하는 클래스

리스너 종류

  • ServletContextListener: 웹 애플리케이션(서버) 시작/종료 시점
  • ServletRequestListener: 클라이언트 서비스 요청 시점, 요청 처리 완료 시점
  • HttpSessionListener: 세션 설정(새로운 세션 생성 시점)/종료 시점(기존 세션 소멸 시점)

⇒ 인터페이스(implements하여 클래스에서 구현 필요)

등록

  • web.xml에서 등록(<listener>, <listener-class>)
  • @WebListener 어노테이션으로 등록

JSP

Servlet의 단점

정해진 규칙에 맞춰 작성 필요
web.xml 파일 또는 어노테이션을 통해 요청 URL에 대한 매핑 설정 필요
소스 수정 후에는 반드시 재컴파일하고 리로딩 대기 필요

Servlet 작성 규칙

  • javax.servlet, javax.servlet.http의 패키지의 API를 import
  • public 클래스로 선언
  • 반드시 기본 생성자 작성
  • 라이프 사이클과 관련된 콜백 메소드 오버라이딩

이러한 서블릿의 단점을 극복하고자 JSP가 등장!

JSP(Java Server Pages) = HTML 베이스 + 약간의 JAVA를 자바 Servlet으로 자동 변환

JSP가 변경되거나 서버 재시작되지 않는 한 JSP가 서블릿으로 컨버팅 되고 지속적으로 호출되는 방식으로 동작

웹 프로그램의 구조 → 풀스택(3티어)
웹 프로그램 프로토콜 → HTTP
자바 웹 프로그램 → Servlet(내부적 처리), JSP(출력)
자바 웹 프로그램의 위치 → root가 webContent/webapp(개발 시)
개발, 배포 위치 다름 - 배포 시에는 tomcat 밑에 넣어둬야함

Servlet과 JSP 동작 방식 → 최초 호출 시 객체 생성(처음부터 생성되는 것 X)

JSP 주요 문법

주석

<%-- 이것은 주석입니다 --%>

지시자(Directive)

페이지 전반에 걸쳐 적용되는 설정을 지정

코드 최상단에 위치해야 함!!

<%@ page language="java" %>

page

페이지 속성 설정, 서블릿 환경 구성(인코딩 설정, 오류 페이지 지정 등)

  • import 등 page 지시자 내에 포함

include

다른 페이지 또는 컴포넌트 포함(공통 헤더, 푸터 등)

taglib

스크립트릿으로 for, if 등 사용하려면 태그 작성 시 가독성 떨어지고 불편

→ 자바 문법을 태그로 사용할 수 있도록 만든 게 JSTL!

taglib 지시자 사용하여 JSTL 라이브러리 불러올 수 있음

스크립틀릿(Scriptlet)

서버 측에서 실행되는 코드 블록

Script + let = 작은(짧은) 스크립트 코드

→ HTML 내에서 자바 코드 작성 및 실행을 가능하게 해준다!

<% System.out.println("Hello"); %>

표현식(Expression)

값을 계산하고 그 결과를 출력하는 데 사용

Servlet의 out.println();과 동일한 역할

<%= "Hello" %>

선언문(Declaration)

변수나 메서드를 선언

<%! int a = 0; %>

JSTL & EL

JSTL(JSP Standard Tag Library)

조건문, 반복문, 포맷팅, 데이터베이스 접근 등을 위한 태그를 제공하여 JSP 페이지의 java 코드 사용을 최소화하고 보다 효율적으로 작성

⇒ 자바 문법 사용했음을 인식시키기 위해 지시자(taglib)로 알려주는 것

build.gradle의 dependencies에 implementation group: ‘javax.servlet’, name: ‘jstl’ 추가

코어 태그 라이브러리접두어 c 권장

변수 선언, 조건문, 반복문, url 처리 등

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
	<title>JSTL Example</title>
</head>
<body>
	<h2>조건문 예제</h2>
	<c:if test="${5 > 2}">
		<p>5는 2보다 큽니다.</p>
	</c:if>
	
	<h2>반복문 예제</h2>
	<ul>
		<c:forEach var="i" begin="1" end="5">
			<li>번호 ${i}</li>
		</c:forEach>
	</ul>
</body>
</html>

포맷팅 태그 라이브러리접두어 fmt

날짜, 시간, 숫자 포맷팅 및 국제화

<!-- 날짜 포맷팅 -->
<%@ page import="java.util.Date" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%
	Date now = new Date();
	request.setAttribute("now", now);
%>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" />

<!-- 숫자 포맷팅 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<fmt:formatNumber value="${price}" type="currency" />

EL(Expression Language)

JSP 페이지 내에서 자바 코드를 사용하지 않고도 간단한 표현식을 사용하여 데이터 처리하고 출력하는 기능

주로 속성값의 처리, 조건부 로직의 간소화 및 JSP 페이지 내에서의 데이터 표현을 목적으로 함

<%= %> 표현식 확장해서 ${} 속성값으로 변수 접근(속성으로 지정해야 ${}로 접근 가능)

  • 변수 접근: ${variableName}
  • 속성 접근: .(점) 또는 [](대괄호) 사용하여 객체의 속성이나 맵의 키에 접근 ${user.name} 또는 ${user[”name”]}
  • 컬렉션 접근: 배열이나 리스트의 요소에는 인덱스를, 맵의 경우에는 키를 사용하여 접근 ${numbers[0]} 또는 ${map[”key”]}
  • 조건 표현: ? 조건 연산자를 사용하여 간단한 조건을 처리 ${empty user ? “Guest” : user.name}

내장 객체

내장 객체 = JSP가 변환된 서블릿에서 자동으로 선언되고 초기화되는 객체

JSP에서는 스크립틀릿과 표현식에서 사용가능한 내장 객체를 지원

대표적 내장 객체

→ 정보 공유와 관련된 객체들

  • request 객체
    클라이언트 요청 정보를 처리하는 객체
  • response 객체
    사용자별 세션 데이터를 저장하고 관리하는 객체
    브라우저 종료 전까지는 세션 값이 브라우저에 종속되어 관리됨
  • session 객체
    애플리케이션 범위의 데이터를 저장하고 초기화 파라미터를 읽는 객체 서버가 죽기 전까지 항상 유지되는 값

정보 공유 범위

  • pageScope: 페이지 스코프에 저장된 속성에 접근
  • requestScope: request 스코프에 저장된 속성에 접근
  • sessionScope: 세션 스코프에 저장된 속성에 접근
  • applicationScope: 애플리케이션 스코프에 저장된 속성에 접근

내장 객체 이름을 생략하는 경우, 내장 객체 전체 설정 중 이름으로 찾음!

MVC 방법론

소프트웨어 엔지니어링에서 널리 사용되는 아키텍처 패턴

목적

  • 애플리케이션의 데이터 로직(Model), 사용자 인터페이스(View), 데이터 입력 처리(Controller) 분리

  • 유지보수와 확장이 용이한 코드 구조 만드는 것

  • 한 부분의 변경이 다른 부분에 미치는 영향을 최소화(결합도 낮추기)하고 개발 프로세스를 보다 체계적으로 관리


Model

어플리케이션의 데이터와 관련된 로직 처리

데이터의 상태 변화에 대해 View와 Controller에 통지할 수 있는 기능 담당

View

화면에 보여지는 부분 중심 = 사용자 인터페이스(UI)

Model에서 전달 받은 데이터를 기반으로 사용자에게 정보를 표시하는 방법을 정의

일반적으로 HTML/CSS, JavaScript 등을 사용하여 구현

Controller

사용자의 입력을 처리하고 그에 따라 Model을 업데이트 하고 View를 선택하는 역할

사용자의 행동에 따라 Model에서 데이터를 요청하거나 데이터를 업데이트하고, 그 결과를 바탕으로 적절한 View를 응답으로 제공

사용자 입력 정보 추출, 화면 이동(내비게이션) 등의 기능 담당

도메인별로 따로 처리


MVC1

Controller와 View의 기능이 혼합된 형태

초기 웹 애플리케이션에서 사용된 패턴

JSP, ASP와 같은 서버 페이지 기술을 사용하여 데이터 처리와 사용자 인터페이스를 동시에 담당하기 때문에 비즈니스 로직과 프리젠테이션 로직이 혼재

결과적으로 애플리케이션의 유지보수와 확장성 저하

MVC2

MVC1의 단점을 개선하기 위해 등장!

Controller 역할 = 서블릿과 같은 서버 측 컴포넌트가 담당

View 역할 = JSP 또는 다른 템플릿 기술을 사용하여 순수하게 사용자 인터페이스만을 처리

Model, View, Controller가 MVC1보다 명확하게 분리되어있어 각각 독립적으로 개발 및 관리가 가능

전체적인 애플리케이션의 테스트와 유지보수 용이

MVC1 VS MVC2

MVC1MVC2
구조Controller와 View 혼합Model, View, Controller가 명확히 분리
기술적 측면JSP, ASP 등 페이지 중심서블릿, JSP 등을 사용한 분리된 처리
유지보수성낮음(로직 혼재)높음(로직 분리)
확장성제한적높은
적용 분야간단한 웹 어플리케이션복잡한 웹 및 엔터프라이즈 어플리케이션

MVC2 - Spring framework

프론트 컨트롤러

앞에서 모든 요청 받음

어떤 요청인지 판단해서 세부적인 서블릿으로 데이터 전달하며 세부적 처리 요청

프론트 컨트롤러는 하나만 존재

(클래스 생성시 dispatcher 라는 이름으로 생성되는 편 → DispatcherServlet)

멤버 컨트롤러

프론트 컨트롤러로부터 요청 전달받는 컨트롤러

여러개 존재 가능

컨트롤러에 있는 메소드 호출하여 기능 처리하게 됨

View

처리 이후 화면에 보여지는 부분

JSP로 만들게 됨

View Resolver

프론트 컨트롤러에게 어떤 view를 호출할지 정해줌

Service

비즈니스 로직에 의해 처리 필요한 부분 처리 담당한 뒤 DAO에 데이터 넘김

DAO

Service에서 전달받은 것과 DB 간 연동 처리만 담당

Dispatcher Servlet

요청 분배용 서블릿 = 프론트 컨트롤러

Spring 프레임워크 MVC에서 매우 중요한 역할을 하는 핵심 구성 요소 중 하나

클라이언트로부터 들어오는 모든 HTTP 요청은 Dispatcher Servlet이 수신하고, 적절한 핸들러(Controller)로 전달하고 응답 생성하여 클라이언트에게 돌려줌

요청(request)과 응답(response)을 처리하는 중앙 허브 역할

profile
256의 우연

0개의 댓글