Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

일상

10주차 - Servlet 본문

교육

10주차 - Servlet

콜리/khgeung 2025. 7. 6. 11:06

1. HTTP

  • 웹 클라이언트 브라우저 동작 원리
    • 웹 어플리케이션 서버에 요청(Request)을 하여 응답(response)받으면 HTTP Response Message를 해석한다. 
    • HTML을 읽는다 -> HTML을 파싱한다 -> DOM Tree를 생성한다 -> Render Tree 가 생성된다.(CSS와 결합) -> 브라우저에 표시된다.
  • HTTP : HyperText Transfer Protocol 
  • HTTPS : HTTP Secure : 보안 http protocol, 암호화된 버전 

1-1. HTTP Request 메시지 구조

POST /user-login HTTP/1.1                                         ← 요청 라인 (Request Line) : 메소드  url http 버전
Host: localhost:8080                                                    ← 헤더 시작 : 이름:값 형태로 메타 데이터 전달
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
User-Agent: Mozilla/5.0 (Windows NT 10.0)
Accept: text/html,application/xhtml+xml
Cookie: sessionId=ABC123;
userName=홍길동                                                        ← 헤더 끝
                                                                                     ← 빈 라인 : 헤더와 본문 구분
username=hong&password=1234                               ← 요청 본문  : 실제 전송할 데이터 (get 요청에서는 보통 없다)

1-2. HTTP Response 메시지 구조

HTTP/1.1 200 OK                                                         ← 상태 라인 (Status Line) : HTTP 버전 상태코드, 상태 메시지
Content-Type: text/html;charset=UTF-8                       ← 응답 헤더 시작 : 응답에 대한 메타 데이터
Content-Length: 1234
Set-Cookie: sessionId=XYZ789; Path=/
Cache-Control: no-cache
Server: Apache-Tomcat/10.1                                         ← 응답 헤더 끝
                                                                                      ← 빈 라인 : 헤더와 본문 구분
<!DOCTYPE html>                                                        ← 응답 본문 : 실제 응답 데이터 (HTML, JSON 등)
<html>
<head><title>로그인 성공</title></head>
<body><h1>환영합니다!</h1></body>
</html>

1-3. HTTP Status Code

  • 클라이언트(브라우저) 와 서버(WAS)가 서로의 상태를 이해하는 약속으로, HTTP 상태 코드는 세 자리 숫자로 구성된다.
    • 200 OK : 요청이 성공적으로 처리됨, 가장 일반적인 성공 코드
    • 404 Not Found : 요청한 리소스를 서버에서 찾을 수 없습니다
    • 405 Method Not Allowed : 요청에 사용된 HTTP 메소드 (get, post 등)가 해당 리소스(서버 프로그램)에 대해 허용되지 않음을 의미한다.
      • 만약 post 방식으로 클라이언트가 요청했는데 doGet() 을 구현한 경우 발생 가능
    • 500 Internal Server Error : 서버에 예상하지 못한 오류가 발생하여 요청을 처리할 수 없음을 나타낸다. 가장 일반적인 서버 오류

2. WAS (Web Application Server)

2-1. Web Architecture

  • WAS (Web Application Server) : Web Server(ex: apache) + Web Container(ex: tomcat) 을 의미하며, 데이터베이스 서버 및 다른 서버와 연동하여 다양한 비즈니스 로직을 처리하고, 동적인 컨텐트를 클라이언트에게 서비스하는 웹 어플리케이션 서버이다. 
  • Web Server : HTTP 프로토콜에 의거해 HTML(html, css, javascript) 문서 document를 서비스하는 서버
  • Web Container : Servlet Container 라고도 하며, Servlet LifeCycle(생성, 초기화, 서비스, 소멸)을 관리한다. 요청 처리를 위한 스레드를 관리하며, JSP를 HTTPServlet 하위 Servlet 클래스로 생성하고 실행하는 JSP 엔진으로서의 역할을 한다.

2-2. Servlet 기본 개념

  • Servlet : Java Web Programming 을 위한 기술 (Servlet + Let) 로, Web Container 위에서 개발 및 실행된다. 
    • MVC의 Controller 역할을 담당한다.
      • Model : 비즈니스 로직과 데이터 액세스 로직을 담당한다. (java(java beans: Dao, Service...))
      • View : 클라이언트 응답(response)을 전담한다. (jsp or thymeleaf or json ...) 
      • Controller : 제어자 역할, 요청을 분석하여 Model과 연동, 연동 결과를 View 에 공유해 응답(request)하게 한다. (java 기반 Servlet ex) Spring or SpringBoot 의 DispatcherServlet)  
    • HTTP Servlet Request : HTTP 요청 메시지를 자바 객체로 추상화한 것으로, 복잡한 형태의 HTTP 메시지를 편리한 메소드로 접근할 수 있게 한다.
      • get 방식 : 정보 조회용, url에 정보가 노출되며 전송 용량에 제한이 있다. Servlet의 doGet() 메소드가 실행한다.
      • post 방식 : 정보 전송용, url에 정보가 노출되지 않으며 전송 용량에 제한이 없다. Servlet의 doPost() 메소드가 실행한다.
    • Web Application 설정 정보 (메타 데이터) : web module version 3 이상, 현재는 5 이상 (가장 높은 버전은 6) 에서 지원하는 Annotation 기반 웹 설정이다.
    •  web.xml : 아래 설정에 의거해 클라이언트는 xmlConfigTest url로 요청한다.
<servlet>
<servlet-name>xmlConfigTestServlet</servlet-name>
<servlet-class>test.xmlConfigTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xmlConfigTestServlet</servlet-name>
<url-pattern>/xmlConfigTest</url-pattern>
</servlet-mapping>
  • @ Annotation : 자바의 의미있는 주석으로, 컴파일 또는 런타임에 영향을 주는 주석이다. 메타 데이터를 기술한다.
  • @WebServlet : 해당하는 웹 프로그램을 클라이언트가 실행하기 위한 url을 제공하는 역할
    • Servlet을 구현하기 위해서는 일반적으로 HTTP Servlet class를 상속받는다. (만약 다른 프로토콜(ex-FTP)을 위해서는 GenericServlet 을 상속받을 수도 있다.)
    • HTTP Servlet : HTTP 기반의 자바 웹 어플리케이션을 잘 개발할 수 있도록 지원하는 abstract class

2-3. Servlet method

  • get 방식 : html link 를 사용한다.
    • doGet() : 클라이언트의 Get 요청을 처리하는 메소드
    • 클라이언트(브라우저)에서 직접 url을 명시하거나 링크, 폼 등을 이용해 호출 실행
    •  <a href="helloServlet?postNo =7&userName=sample123"> : Annotation으로 정의한 (@WebServlet("/helloServlet")) url에 postNo = 7 과 userName = sample123을 받는다.
  • post 방식 : 정보 전송용으로 http requesst message body에  저장되어 전송한다. url에 그 내용이 노출되지 않으며, 대용량이 가능하다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>step1 request method</title>
</head>
<body>
<h2>Http Request Method Study</h2>
	<form method="get" action="RequestMethodServlet">
	<input type="search" name="searchKeyword" placeholder="검색어 입력하세요" required="required">
	<button type="submit">검색</button>
	</form>
	<!-- 
		method 가 get 방식 이므로 서블릿 프로그램의 doGet() 실행될 것을 예상할 수 있다
		action이 RequestMethodServlet 이므로 서블릿 프로그램의 url이 RequestMethodServlet 임을 알 수 있다.
		서버 측 RequestMethodServlet 은 doGet 메소드에서 request 의 파라미터 정보를 얻기 위해 getParameter 메소드를 실행할 것이다.
		getParameter(name) ==> searchKeyword
	 -->
	 <hr>
	 <form method="post" action="RequestMethodServlet">
	 <lable for ="foodName">음식명</lable>
	 <input type="text" id ="foodName" name="foodName"><br>
	 <input type="radio" name ="tasteType" value="매운맛">매운맛<br>
	 <input type="radio" name ="tasteType" value="중간맛">중간맛<br>
	 <input type="radio" name ="tasteType" value="싱거운맛">싱거운맛<br>
	 <button type="submit">주문</button>
	 </form>
	 <!-- 
	 		post 방식 요청에 대한 응답
	 		음식명 : 진라면
	 		맛타입 : 매운맛
	  -->
</body>
</html>

2-4. Servlet 계층 구조

  • 최상위 인터페이스 Servlet : init(), service(), destroy()와 같은 abstract method가 선언되어 있다.
    • 모든 자바 웹 프로그램은 Servlet Interface의 하위 클래스이다. 
  • 추상 메소드 Generic Servlet : 프로토콜에 독립적인 서버 프로그램을 위한 클래스이다.
    • 일반적인 서버 차원에서 가져야 하는 기능을 자식에게 물려주고 프로토콜에 특화된 자식 차원에서 구현해야 하는 service(request, response) 메소드는 abstract method로 선언해 구현을 강제한다.
  • HTTP Servlet : 웹 프로그래밍을 위한 HTTP 프로토콜에 특화된 클래스이다. 웹서비스에 필요한 기능을 자식에게 물려준다.
    • 자바 웹 프로그램의 모든 Servlet과 JSP는 HTTPServlet을 상속받아야 한다. (예: Spring의 DispatchServlet 또한 HTTPServlet의 자식이다.)
    • 동작 원리 : 부모 Generic Servlet의 추상 메소드인 service(request, response)를 implements 구현하여 웹 컨테이너가 service  메소드를 호출하면 구현한 service 메소드가 HTTP Request Method 에 따라 개발자가 구현한 doGet 또는 doPost 등의 메소드로 dispatch(위임) 하여 실행되고 응답한다.
  • Form 과 Servlet (또는 JSP) 연동
client --- request ---> Web Server -- Web Container -- MyServlet
                                                          service 호출 --> service() --> dispatch --> doGet() or doPost()
                                                          <-- response --
  • Micro Service Architecture(MSA) : 이러한 Web Server을 여러 대 두어 하나의 서비스처럼 동작하도록 한다.

2-5. Servlet Architecture

  • 자바 웹 응용 프로그램 개발자(인터페이스 기반 개발) - 표준 Servlet API 제정 (인터페이스를 구현) - WAS Vendor
    • 표준화된 Servlet API (인터페이스 기반 개발) : 자바 웹 응용프로그램 개발자는 Servlet API (Servlet, ServletRequest, ServletResponse interface 등) Jakarta EE (Java EE) 표준으로 정의된 인터페이스 기반으로 일관되게 웹 어플리케이션을 개발한다. 이 표준화된 서블릿 API 덕분에 특정 WAS 제품에 종속되지 않고 일관된 방식으로 웹 어플리케이션을 구현할 수 있다.
    • WAS(Web Application Server)의 구현 및 추상화 : Apache Tomcat, JBoss, WebLogic, Jetty 등과 같은 WAS 제품들은 표준화된 Servlet API 인터페이스들을 각자의 방식으로 최적화되게 구현한다. 자신의 구현체들을 업그레이드를 하여도 Servlet 표준 인터페이스(API)로 응용 프로그램 개발자들은 개발하므로 업그레이드가 용이해 유지보수성이 높다.
    • Vender 독립성 및 이식성 : 이러한 Servlet 웹 아키텍처 구조 덕분에 특정 WAS에서 개발된 웹 어플리케이션은 다른 WAS 에서도 큰 수정 없이 동작할 수 있는 높은 이식성(Portability)을 가진다. 기업은 특정 Vender에 종속되지 않고, 필요에 따라 다양한 WAS 제품을 선택하거나 변경할 수 있는 유연성을 확보할 수 있다.
    • 웹 응용 프로그램 개발 생산성 향상 : 다양한 WAS 제품군들과 관계없이 표준화된 방법으로 웹 개발이 가능하다.

2-6. Servlet LifeCycle

  • IOC(Inversion Of Control) : 객체가 필요로 하는 다른 객체(의존성)를 생성해서 사용하는 것이 아니라 외부(컨테이너, 프레임워크) 등에서 객체를 대신 생성하여 필요할 때 주입해주는 방식
    • 웹 컨테이너가 Servlet 객체의 클래스 로딩, 객체 생성, 초기화, 서비스 실행, 소멸을 담당한다.
    • Servlet(자바 웹 프로그램)은 개발자가 직접 객체를 생성하거나 소멸시키지 않고 웹 컨테이너에 의해 그 생명 주기가 전적으로 괸리된다.
  • Servlet LifeCycle : Spring의 Bean LifeCycle 에 동일한 개념이 적용된다.
    1. public LifeCycleServlet() : Servlet 클래스 로딩 및 객체를 생성한다.
      • WAS(Web Container)가 생성자를 호출하여 객체를 생성한다.
      • 단 한번 생성한다. (Singleton Pattern)
    2. init() : WAS가 객체 생성 후 단 한번 호출한다. 초기화 작업 (설정 정보 입력, 데이터베이스 연결, 파일 로딩 등)을 진행한다.
    3. service() : WAS가 호출하며 클라이언트가 요청할 때마다 매번 실행한다. 다양한 웹서비스(로그인, 회원 가입, 상품 검색, 구매 등)를 제공한다.
      • 멀티 스레드 환경에서 동시 실행이 가능하다.
  1. destroy() : WAS가 단 한번 호출하며 Servlet 언로드, Servlet 컨테이너 종료 직전에 호출한다. (데이터베이스 연결 해제, 캐시 정리, 파일 닫기 등)
  • loadOnStartup = 1 : 웹 어플리케이션이 실행이 시작되는 시점에 가장 우선적으로 이 옵션이 명시된 Servlet을 초기화한다. Servlet LifeCycle 구조 상 클라이언트의 첫 요청 시점에 Servlet 이 초기화 작업을 하므로 웹 어플리케이션에서 중요한 역할을 하는  Servlet (초기화 작업이 많은 Servlet 포함)은 이 옵션이 유용하다.
    • Servlet LifeCycle 상에 객체 생성 및 초기화는 첫번째 요청 시 실행되는 구조이다. 따라서 첫 번째로 요청하는 클라이언트는 초기화 작업을 기다려야 하고 초기화 단계에서의 예외 상황도 대비해야 한다. 따라서 미리 로딩을 초기화하겠다는 의미로 load on startup = 1 을 사용한다.
    • 웹 어플리케이션이 시작될 때 위 옵션이 설정되어 있으면 해당 Servlet은 시작과 함께 초기화된다. 이후 init()까지 실행한다.

2-7. Servlet Config와 Context

  • ServletConfig : Servlet 설정 정보 객체로, Servlet 객체 당 하나만 생성한다.
    • ServletContext의 주소값을 저장하고 있다.
    • 웹 컨테이너에 의해 Servlet 초기화 init(ServletConfig config)시점에 호출되어 ServletConfig 객체가 전달된다.
    • 설정 정보 : Spring MVC에서 DispatcherServlet이 초기화되는 시점에 init 메소드를 웹 컨테이너가 호출하여 Spring 설정 정보가 저장된 ServletConfig 객체를 전달한다.
  • ServletContext : 웹 어플리케이션 당 하나 생성, 웹 어플리케이션 내 모든 Servlet과 JSP들이 공유하여 사용할 수 있는 객체이다.
    • 웹 어플리케이션이 시작 지점에 ServletContext 객체를 생성하고 웹 어플리케이션 소멸 직전에 ServletContext 객체는 소멸된다. 
    • 사용처 : 웹 어플리케이션 전체 설정 관리, 각각의 Servlet(JSP 포함) 간 데이터 공유 지원
ServletConfig ServletContext
개별 Servlet 당 하나 웹 어플리케이션 당 하나
개별 Servlet 전용 웹 어플리케이션 내의 웹 프로그램(Servlet or JSP)
@Annotation 또는 web.xml web.xml
Spring과 연관성, 개별 Bean 설정 ApplicationContext
  • ServletContextListener : Application LifeCycle Listener 로, 웹 어플리케이션 시작 시점과 종료 시점의 이벤트를 감지하여 시작 시점에 필요한 초기화 작업(예: 보안)과 contextInitialized() 종료 시점에 필요한 작업(예:백업, 로깅)을 정의해 실행시킬 수 있다. - contextDestroyed()

3. Cookie 와 Session

3-1. Cookie와 Session의 필요성

  • HTTP는 서버의 서비스를 받는 사용자 정보를 유지하지 않는 속성인 Stateless 속성을 가진다. 따라서 사용자 정보를 필요 시에 유지하기 위한 기술이 필요하다.
  • Cookie와 Session이 필요한 사례 : 인증 기반 서비스, 쇼핑몰 장바구니, 주문 또는 결제 등
    • 세션 관리 : 사용자 정보를 일정 조건 동안 유지
    • 상태 정보 : 사용자의 자격 또는 의사를 저장하고 있는 정보
  • 사용자 상태 정보를 유지하는 방식
  Cookie Session
저장 위치 클라이언트 서버
보안성 낮음 높음 (서버에서 관리)
데이터 타입 문자열로 제한 타입의 제한 없음
저장 용량 제한적(4K) 제한 없음 (서버 상황에 따라)
생명 주기 설정 (유효 기간) 서버 메모리 상황에 따라
네트워크  매 요청 시 전송 최초 1회만 ID를 전송  

3-2. Cookie

  • 클라이언트 측 상태 정보를 저장한다. 저장 용량은 4kb로 제한되어 있으며, 작은 상태 정보를 이용해야 한다.
  • Cookie 생성 시에는 유효시간을 설정한다. 유효시간을 설정하지 않으면 해당 브라우저 실행 시까지만 유효하다. 
  • Cookie의 동작 :
    1. 클라이언트가 접속하면 SetCookieServlet이 쿠키를 생성해 응답 시에 전달하며 클라이언트 측에 저장시킨다.
    2. 클라이언트가 접속하면 GetCookieServlet이 실행된다. 

3-3. Session

  • 서버 측에 사용자 상태 정보를 저장한다. 저장 용량 및 데이터 타입에 제한이 없으며, 로그인/로그아웃 시 주로 사용된다.
  • 세션 유효 시간 : 
    1. WAS에 설정된 지정 유효 시간 내 재접속이 없으면 세션 만료
    2. 브라우저 종료 시 세션 만료
    3. 로그아웃 실행 세션 만료
  • 세션 관련 주요 메소드
    • reqeust.getSession() or request.getSession(true) : 기존 세션이 있으면 기존 세션을 반환하고 없으면 새로 생성해서 반환
    • session.setAttribute(name, value) : 세션에 저장할 정보를 name과 value 쌍으로 저장
    • session.getAttribute(name) : Object - 세션에 저장된 정보를 name 으로 찾으면 value object를 반환
    • session.invalidate() : 세션을 무효화
  • Session의 동작 원리 : 세션은 내부적으로 jsessionid 라는 쿠키를 사용한다.
    1. client browser의 request 를 받는다.
    2. response.getSession() 메소드 내부에서 클라이언트가 전달한 Cookie 정보 중 jsessionid Cookie를 확인해서 존재하면 세션이 있는 것으로 판단해 기존 세션을 리턴하고 없으면 새로 생성한다.
    3. reqeust.getSession(false) : 클라이언트가 보낸 HttpRequest Message 중에 jsessionid가 존재하지 않으면 null을 반환하고, 존재하면 기존 세션을 반환한다.
      • JSP와 같은 경우 request.getSession()이 기본적으로 내장되어 있어 정확하게 인증 여부를 판단할 때는 session 유무와 로그인 검증 시 저장한 setAttribute() 인증과 함께 비교하는 것을 권장한다.
        • if (세션이 존재하고 인증 정보가 있으면 로그인 되어 있다) { }

4. JSP(Java Server Page)

  • 서버 측에서 웹 페이지를 동적으로 생성하는 기술이다.(Template Engine)
  • HTML에 자바 코드를 삽입하는 형식으로 개발한다. 따라서 동적인 웹 페이지를 구현하는 데 적합하다.
  • Template Engine : 서버 사이드 웹 페이지 생성 기술로, jsp, thymeleaf 등 MVC의 View 역할을 담당한다.

4-1. JSP 기본 문법

  • JSP 주석 : <%-- --%>
  • 스크립틀릿(Srciptlet) <% %> : java 코드 삽입 시 사용하며, service 메소드 내 코드로 삽입한다.
  • 출력(Expression)<%= %> : out.println() 로 생성하며, 출력 시 사용한다.
  • 선언(Declaration) <%! %> 멤버 변수 또는 메소드를 정의할 때 사용한다.
  • 지시(Directive) : <@% %> 웹 컨테이너에게 현 페이지 메타 정보를 기술한다. (import, encoding, errorPage)

4-2. JSP LifeCycle

  • JSP는 HTTPServlet의 자식 클래스로 생성되므로 Servlet LifeCycle과 동일하다.
Client -> is loaded? (한번이라도 실행된 적이 있는지?) -> 실행한 적 없는 경우 : hello.jsp -> hello-jsp.java 웹 컨테이너가 생성, HttpServlet임 -> hello-jsp.class 컴파일 후 클래스 로딩 -> init()-jspinit() -> service(req, res)-jspService() -> destroy() -> 다른 클라이언트 접속 시 service() 만 실행

'교육' 카테고리의 다른 글

12주차 - Spring  (0) 2025.07.20
11주차 - Design Pattern  (0) 2025.07.13
9주차 - Web  (0) 2025.06.29
6, 7, 8주차 - DB와 JDBC  (0) 2025.06.14
5주차 - Java 객체 지향 프로그래밍 (끝)  (0) 2025.05.25