4-2. 동적 HTML 전달 (2세대)

박은서's avatar
Jan 28, 2026
4-2. 동적 HTML 전달 (2세대)

1. 동적 HTML 전달 (2세대)

1️⃣ Servlet 동적 전달

1) Servlet

파일 1개로 html을 사용하여 여러 개의 내용을 응답

2️⃣ 필기

notion image

2. 그림으로 2세대 이해하기

1️⃣ 그림

notion image

2️⃣ 등장인물

1) 웹 브라우저 (WS)

  • 크롬, 엣지, 사파리 같은 것
  • 할 수 있는 것
    • HTML, CSS, JavaScript 해석
  • 못 하는 것
    • ❌ Java 코드 해석/실행
➡️ 웹 브라우저는 자바코드를 바로 읽을 수 없음

2) 웹 서버 (Web Server)

예: Apache, Nginx, Live Server
  • 역할
    • 정적인 파일 제공
      • .html, .css, .js, 이미지 등
  • 특징
    • ❌ 자바 코드 실행 안 함
    • 그냥 파일 그대로 전달
➡️ 라이브 서버 : 웹 서버 / 자바 코드 해석 불필요 (정적 HTML만 다룸)

3) WAS (Web Application Server)

예: Tomcat
  • 역할
    • 자바 코드 실행
    • 요청(request)을 받아서
    • 자바 로직 실행 후
    • HTML을 만들어서 응답(response)
➡️ WAS : 자바 코드를 실행(컴파일/인터프리트 포함)하는 곳

3️⃣ 그림 해석 (왼쪽 → 오른쪽)

1) 웹 브라우저

사용자 ↓ 브라우저 ↓ http 요청
  • 주소창에 입력
    • http://localhost:8080/test.do
  • HTTP 요청 발생

2) 웹 서버 / 포트 8080

  • 8080 포트는 보통 톰캣(WAS)이 사용
  • 요청이 톰캣으로 전달됨

3) WAS (Tomcat) 🔥핵심🔥

요청 흐름
request → Servlet → response
  • @WebServlet("*.do")
    • .do로 끝나는 요청은 서블릿이 처리
  • 서블릿은 자바 클래스
    • doGet()
    • doPost()
    • doPut()
    • doDelete()

4) 자바 코드 실행 → HTML 생성

서블릿 내부에서:
response.setContentType("text/html"); out.println("<html>"); out.println("<h1>안녕하세요</h1>"); out.println("</html>");
자바 코드로 HTML을 만들어냄
✔ 이게 바로 동적 HTML

5) 웹브라우저로 응답

  • 브라우저가 받는 것:
    • Content-Type: text/html <html> <h1>안녕하세요</h1> </html>
  • 브라우저는
    • “아 HTML이네?”
    • 그대로 화면에 렌더링
👉 자바는 이미 WAS에서 끝났음

4️⃣ “동적 HTML (2세대)”란 말의 의미

🔹 1세대

  • 정적 HTML
  • 파일 그대로 전달
  • 사용자마다 같은 화면

🔹 2세대 (이 그림)

  • 서블릿 / JSP
  • 자바 코드 실행
  • 사용자·시간·조건에 따라
    • HTML 내용이 달라짐
👉 그래서 동적 HTML

3. 실습

1️⃣ 2세대 파일 만들기 (기본)

v2 폴더 생성

1) MyServlet

package com.example.v2; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("*.do") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // localhost:8080/hello.de?cmd=a String cmd = req.getParameter("cmd"); System.out.println(req.getQueryString()); System.out.println(cmd); } }

2) V2Application

package com.example.v2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.server.servlet.context.ServletComponentScan; @ServletComponentScan @SpringBootApplication public class V2Application { public static void main(String[] args) { SpringApplication.run(V2Application.class, args); } }

3) 브라우저

notion image

4) 콘솔

notion image

2️⃣ 2세대 파일 만들기 (추가)

1) MyServlet

package com.example.v2; import java.io.IOException; import java.io.PrintWriter; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("*.do") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 요청 받기 // localhost:8080/hello.de?cmd=a String cmd = req.getParameter("cmd"); System.out.println(req.getQueryString()); // cmd = a System.out.println(cmd); // a // 2. 요청 받은 논문 찾기 String html = """ <h1>${data} 논문입니다</h1> """; // Route (길 안내자) if (cmd.equals("a")) { html = html.replace("${data}", "a"); } else if (cmd.equals("b")) { html = html.replace("${data}", "b"); } else { html = "찾는 문서가 없습니다."; } // 3. 응답해주기 resp.setHeader("Content-Type", "text/html; charset = utf-8"); PrintWriter pw = resp.getWriter(); pw.println(html); } }

※ [참고] PrintWriter pw = resp.getWriter();

➡️ “HTML을 브라우저로 출력하는 펜” 같은 존재
PrintWriter는 BufferedWriter처럼 버퍼를 가지고 있으면서도, 더 편하게 출력할 수 있게 만든 클래스
① PrintWriter
➡️ 출력에 최적화된 고수준 도구
✔ 버퍼를 사용
  • 내부적으로 Buffered 기능 있음
  • 성능 OK
✔ 문자열 변환
  • int, boolean 등도 바로 출력 가능
pw.println(100); pw.println(true);
✔ 줄바꿈 자동
pw.println("<h1>Hello</h1>");
✔ 출력 스트림 연결
  • response랑 바로 연결됨
  • 브라우저로 직행
✔ 예외 처리 편함
  • IOException 거의 안 보임
⏩ 서블릿에서는 거의 표준처럼 PrintWriter 사용
② BufferedWriter
➡️ 범용 저수준 도구
  • 문자 출력 가능
  • 버퍼 있음
  • 줄바꿈 직접
  • flush() 직접
  • try-catch 필수
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(resp.getOutputStream()) ); bw.write("<h1>Hello</h1>"); bw.newLine(); bw.flush();
✔ 할 수는 있는데
❌ 서블릿에서 쓰기엔 너무 번거로움

2) V2Application

package com.example.v2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.server.servlet.context.ServletComponentScan; @ServletComponentScan @SpringBootApplication public class V2Application { public static void main(String[] args) { SpringApplication.run(V2Application.class, args); } }

3) 브라우저

notion image
notion image

4. 동적 HTML 전달의 단점

  • 자바 코드 안에서 HTML 작성
  • 가독성 최악
  • 프론트/백엔드 분리 불가능
Share article