1. 동적 HTML 전달 (2세대)
1️⃣ Servlet 동적 전달
1) Servlet
파일 1개로 html을 사용하여 여러 개의 내용을 응답
2️⃣ 필기

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

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) 브라우저

4) 콘솔

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) 브라우저


4. 동적 HTML 전달의 단점
- 자바 코드 안에서 HTML 작성
- 가독성 최악
- 프론트/백엔드 분리 불가능
Share article