728x90
반응형

목차

  1. 서블릿이란? (쉬운 비유)
  2. 서블릿의 핵심 특징
  3. 서블릿 컨테이너(예: Tomcat)의 역할
  4. 서블릿 동작 흐름(요청→매핑→doGet/doPost→응답)
  5. 서블릿 생명주기(init → service → destroy)
  6. JSP는 뭐고, 서블릿과 어떻게 다른가
  7. 실전 예제: HelloServlet (Annotation 기반)
  8. 자주 하는 실수 & 베스트 프랙티스
  9. 마무리 체크리스트(면접/시험 대비)

1) 서블릿이란? (쉬운 비유)

사용자(브라우저)가 “로그인해줘!”라고 부탁하면, 서블릿이 그 요청을 받아 DB를 확인하고 결과 페이지(응답)를 만들어 돌려주는 자바 클래스입니다.

  • “요청을 받아 응답을 만든다” = Controller 역할에 딱 맞음.

2) 서블릿의 핵심 특징

  • 동적 웹 컴포넌트: 요청 시점에 필요한 내용을 만들어 응답.
  • HttpServlet 상속: javax.servlet.http.HttpServlet(Jakarta EE에선 jakarta.servlet.http.HttpServlet)을 상속.
  • 스레드 기반 동작: 컨테이너가 요청마다 스레드를 재사용/관리.
  • MVC에서 Controller로 자주 사용.
  • (구)HTML을 자바 코드로 println 하던 시대 → 유지보수 어려워서 JSP/템플릿과 분리해서 씀.

3) 서블릿 컨테이너의 역할 (Tomcat 대표)

  • 웹 서버와 통신을 대신 처리(소켓, HTTP 파싱 등).
  • 생명주기 관리: 로딩→init()→요청 시 service()→종료 시 destroy().
  • 멀티스레드 처리: 요청마다 스레드 할당/관리.
  • 선언적 보안: 설정 파일/어노테이션 기반으로 인증·인가 처리.

4) 서블릿 동작 흐름

  1. 클라이언트가 URL 요청 → 컨테이너가 HttpServletRequest/Response 생성
  2. URL 매핑(web.xml 또는 @WebServlet)으로 대상 서블릿 찾기
  3. service()가 호출되어 메서드 분기(doGet/doPost 등)
  4. 서블릿이 응답을 만들어 HttpServletResponse로 전송
  5. 컨테이너가 마무리 정리

5) 서블릿 생명주기 (Life Cycle)

  • init(): 서블릿 최초 로딩 시 1회 호출(공유 리소스 초기화에 적합)
  • service(): 매 요청마다 호출되어 doGet()/doPost()로 분기
  • destroy(): 컨테이너 종료/교체 시 1회 호출(정리 작업)
[로딩] → init() → (요청 n번) service() → ... → destroy() → [언로드]

6) JSP는 무엇이고, 서블릿과 어떻게 다른가

  • JSP(Java Server Pages): HTML 안에 자바를 삽입해 화면 구성에 특화.
  • 최종적으로 JSP도 서블릿으로 변환되어 실행됨.
  • 일반적으로 서블릿=로직/제어, JSP=뷰 로 분리해서 MVC 구조를 만든다.

7) 실전 예제: HelloServlet (Annotation 기반)

// jakarta.servlet-api를 사용하는 최신 톰캣 기준 예시
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html; charset=UTF-8");

        PrintWriter out = resp.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><head><meta charset='UTF-8'><title>Hello</title></head>");
        out.println("<body><h1>안녕하세요, Servlet!</h1>");
        out.println("<p>요청 URI: " + req.getRequestURI() + "</p>");
        out.println("</body></html>");
    }
}

Tip: 구형 프로젝트는 web.xml 매핑을 쓰지만, 요즘은 @WebServlet("/path") 어노테이션 매핑이 간편합니다.

8) 자주 하는 실수 & 베스트 프랙티스

  • 인스턴스 변수에 상태 저장 금지: 서블릿은 다중 스레드가 공유합니다.
  • 문자 인코딩 설정: resp.setContentType("text/html; charset=UTF-8") 등 필수.
  • 비즈니스 로직 분리: DAO/Service로 분리하고 서블릿은 흐름 제어만.
  • 에러/예외 처리: 공통 에러 페이지, 필터/인터셉터로 로깅과 인증 처리.
  • JSP에서 스크립틀릿 최소화: EL/JSTL, 템플릿 엔진(Thymeleaf 등)로 표현만 담당.

9) 마무리 체크리스트 (면접/시험 포인트)

  • 서블릿과 JSP의 관계 설명 가능?
  • 컨테이너 역할(생명주기·스레드·보안) 술술 말할 수 있는지?
  • Life Cycle 순서/용도 정확히 아는지?
  • URL 매핑(@WebServlet vs web.xml) 차이 이해했는지?

SEO용 FAQ

Q1. 서블릿은 왜 필요한가요?
A. HTTP 요청을 자바로 처리해 동적 페이지를 만드는 표준 컨트롤러이기 때문입니다.

Q2. JSP랑 뭐가 달라요?
A. JSP는 화면 템플릿, 서블릿은 로직/흐름 제어. JSP도 결국 서블릿으로 변환돼 실행됩니다.

Q3. 스프링 MVC랑 관계는?
A. 스프링 MVC도 내부적으로 서블릿(DispatcherServlet)을 사용합니다. 서블릿 개념을 알면 스프링이 쉬워집니다.

728x90
반응형
728x90
반응형

자바 개발을 하다 보면 JAR, WAR, EAR 같은 단어를 많이 듣게 됩니다.
“이게 대체 뭐고 언제 뭘 써야 하지?”
아래 이미지와 함께 구조적 차이Spring Boot에서의 선택 기준을 쉽게 설명드릴게요.


📦 JAR / WAR / EAR 구조 한눈에 보기

위 그림을 보면 구조를 직관적으로 알 수 있어요:

  • JAR: 클래스 파일과 설정이 들어간 기본 단위
  • WAR: 웹 애플리케이션 배포용, WEB-INF, web.xml 포함
  • EAR: 여러 WAR + JAR 묶은 엔터프라이즈 통합 패키지

🔍 각 파일의 의미

✅ JAR (Java ARchive)

  • 자바 클래스와 메타정보를 하나로 압축한 파일
  • 애플리케이션이나 라이브러리를 배포할 때 사용
  • .class, META-INF/manifest.mf 포함

✅ WAR (Web Application Archive)

  • 웹 애플리케이션을 위한 구조
  • JSP, Servlet 기반 웹 프로젝트를 배포하는 데 사용
  • WEB-INF/web.xml, classes, lib 등 구조 고정

✅ EAR (Enterprise ARchive)

  • 기업용 대규모 시스템 통합 배포에 사용
  • 여러 WAR, JAR 모듈을 하나로 묶은 컨테이너
  • WebLogic, JBoss 같은 Java EE 서버 환경에 최적화

🚀 Spring Boot에서의 JAR vs WAR

항목                                          JAR (기본값)                                                             WAR
WAS 포함 ✅ 내장 Tomcat 내장 ❌ 외부 WAS 필요
실행 방식 java -jar로 바로 실행 Tomcat, WebLogic 등에서 배포
설정 편의성 간단한 구조, 빠른 실행 web.xml, 복잡한 디렉토리 구조
JSP 지원 ❌ JSP 미지원 (공식 비권장) ✅ JSP 사용 가능
활용 예시 REST API, 간단한 마이크로서비스 JSP/Servlet 중심 웹 프로젝트, 전통 웹앱

 

🧩 JSP + Spring Boot = WAR 필요?

Spring Boot에서 JSP를 사용하려면 아래 조건이 필요합니다:

  1. 프로젝트를 WAR로 패키징
  2. application.properties에 아래 설정 추가:
properties
복사편집
spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp
  1. JSP 파일은 src/main/webapp/WEB-INF/views/에 위치

📌 JAR로 배포할 경우 JSP는 작동하지 않음!
→ Thymeleaf, Mustache 등 템플릿 엔진 사용을 권장합니다.


✅ 정리 요약

구분                                                           JAR                                     WAR                                    EAR
내장 Tomcat ✅ 있음 ❌ 없음 ❌ 없음
실행 단독 실행 가능 WAS 필요 Java EE 서버 필요
JSP ❌ (제한적)
구조 단순 정형화 필요 매우 복잡
Spring Boot 기본
 

🏁 마무리

  • 개인 프로젝트, 마이크로서비스, REST API → JAR 추천
  • JSP, 레거시 웹앱 → WAR 필요
  • 대규모 엔터프라이즈 시스템 → EAR (하지만 요즘은 잘 안 씀)

Spring Boot는 기본적으로 JAR 중심 구조이며,
WAR는 외부 WAS와 JSP 기반 웹앱에 한정해서 사용하는 경우가 많습니다.

728x90
반응형
728x90
반응형

✍️ 서론 개요 (도입부)

웹 시스템을 처음 배우는 사람부터 실무자까지 혼동하기 쉬운 개념이 바로 웹 서버(Web Server) 와 **WAS(Web Application Server)**입니다.
두 용어는 유사하게 들리지만, 역할과 목적은 분명히 다릅니다.

이 글에서는:

  • 웹 서버의 정의와 역할
  • WAS의 구조 및 동작 과정
  • 웹 서비스 아키텍처 흐름
  • 왜 Web Server와 WAS를 분리해서 써야 하는지

를 실제 흐름도와 함께 명확하게 정리합니다.


📌 핵심 내용 정리

✅ 웹 서버(Web Server)

  • HTTP 요청을 받아 HTML, CSS, JS, 이미지 등의 정적 콘텐츠를 즉시 제공
  • 동적 요청은 WAS로 전달하고 결과를 중계
  • 대표 소프트웨어: Apache, Nginx

✅ WAS (Web Application Server)

  • Servlet, JSP 등의 동적 콘텐츠를 처리하는 미들웨어
  • DB 연동, 비즈니스 로직 처리 등 핵심 로직 담당
  • 대표 소프트웨어: Tomcat, WebLogic, JBoss

✅ 웹 서비스 아키텍처 구조

구조설명
클라이언트 → Web Server → DB 정적 요청에 적합
클라이언트 → WAS → DB 단독 구조지만 부하 위험
클라이언트 → Web Server → WAS → DB 실무에서 가장 효율적인 분리 방식
 

✅ 클라이언트 요청의 실제 처리 흐름

  1. 클라이언트가 HTTP 요청을 보냄
  2. Web Server가 정적 콘텐츠는 즉시 응답,
    동적 요청은 WAS로 전달
  3. WAS는 Servlet 생성 → Thread 실행
  4. 요청에 따라 doGet() 또는 doPost() 실행
  5. 결과 페이지를 Web Server → 클라이언트로 반환

✅ 왜 Web Server와 WAS를 분리해야 할까?

  • WAS가 정적 요청까지 처리하면 자원 낭비
  • 비즈니스 로직이 느려지고 전체 서비스 지연 발생
  • 정적 콘텐츠는 Web Server가 처리 → 부하 분산 & 속도 개선
728x90
반응형

+ Recent posts