2. (실습) HttpServlet

박은서's avatar
Jan 28, 2026
2. (실습) HttpServlet

1. HttpServlet

1️⃣ HttpServlet이란?

Java로 웹 서비스를 만들 때, HTTP 요청/응답을 처리하기 위한 클래스(기반 클래스)
HttpServlet은 **서버(웹 서버 or WAS)**에서 실행되며
GET, POSTHTTP 요청을 받아 처리하는 자바 클래스의 부모 클래스

2️⃣ 어디에 쓰나?

웹은 기본적으로 클라이언트 ↔ 서버 구조로 동작해
  • 클라이언트: 브라우저(Chrome, Edge 등)
  • 서버: 코드 실행 + 응답 보내기
이때 서버 쪽에서:
  • 요청 받고
  • 내부 로직 실행하고(DB 처리 등)
  • 결과를 HTML, JSON 등으로 응답하는
핵심 역할을 맡는 게 HttpServlet!

3️⃣ HttpServlet의 동작 방식

HttpServlet은 아래 메서드를 제공해 우리가 필요한 것만 override해서 사용
메서드
의미
doGet()
GET 요청 처리 (URL로 요청, 조회 등)
doPost()
POST 요청 처리 (폼 제출, 데이터 추가)
doPut()
수정 요청
doDelete()
삭제 요청

4️⃣ 예시 코드

@WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); response.getWriter().println("<h1>Hello Servlet!</h1>"); } }
/hello로 GET 요청 들어오면 브라우저에 <h1>Hello Servlet!</h1> 출력

5️⃣ HttpServlet의 역할 요약

역할
설명
요청 수신
브라우저/클라이언트 요청 받음
처리
필요한 내부 로직 실행 (DB, 계산 등)
응답 생성
HTML/JSON/Text 등의 응답 작성
HTTP 프로토콜 처리
GET/POST 등 종류별 처리 지원

6️⃣ Servlet → HttpServlet → Spring까지 연결

  • Servlet: 웹 요청/응답을 다루는 Java 기술
  • HttpServlet: 그 중에서 HTTP 기반 웹 처리를 위한 클래스
  • Spring MVC : HttpServlet을 내부에서 활용하며 더 편하게 사용하도록 만든 프레임워크
HttpServlet = 웹 개발의 기초
Spring은 이를 더 쉽게 쓰도록 만든 도구

2. 실습

1️⃣ doGet()

1) 기본

alt + insert
alt + insert
notion image
package com.example.demo; 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; /** * HttpServlet => Socket 서버에 http 프로토콜이 적용된 클래스 (우리가 socket 서버나 버퍼 만들 필요도 없고, * 프로토콜 생각할 필요도 없음) */ @WebServlet("*.do") // url에 localhost:포트번호/????.do 아무거나 적고 끝에 .do만 입력하면 연결됨 public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloWorld"); } }
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.server.servlet.context.ServletComponentScan; @ServletComponentScan @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
notion image
notion image
notion image
notion image

2) getWriter() (BufferedWriter)

package com.example.demo; 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; /** * HttpServlet => Socket 서버에 http 프로토콜이 적용된 클래스 (우리가 socket 서버나 버퍼 만들 필요도 없고, * 프로토콜 생각할 필요도 없음) */ @WebServlet("*.do") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloWorld"); PrintWriter out = resp.getWriter(); out.println("HelloWorld"); } }
notion image
notion image
notion image
notion image
notion image
서블릿 - 자바가 소켓에 http 프로토콜을 얹혀주는 것
그걸 우리는 갖다 쓰는 것

3) Content-type 미입력

package com.example.demo; 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; /** * HttpServlet => Socket 서버에 http 프로토콜이 적용된 클래스 (우리가 socket 서버나 버퍼 만들 필요도 없고, * 프로토콜 생각할 필요도 없음) */ @WebServlet("*.k") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloWorld"); PrintWriter out = resp.getWriter(); out.println("<h1>GoodBye</h1>"); } }
content-type 없음 → html로 인식
content-type 없음 → html로 인식

4) Content-type 임의로 입력

package com.example.demo; 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; /** * HttpServlet => Socket 서버에 http 프로토콜이 적용된 클래스 (우리가 socket 서버나 버퍼 만들 필요도 없고, * 프로토콜 생각할 필요도 없음) */ @WebServlet("*.k") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloWorld"); resp.setHeader("Content-Type", "text/plain"); PrintWriter out = resp.getWriter(); out.println("<h1>GoodBye</h1>"); } }
notion image

2️⃣ doPost()

1) 기본

notion image
package com.example.demo; 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; /** * HttpServlet => Socket 서버에 http 프로토콜이 적용된 클래스 (우리가 socket 서버나 버퍼 만들 필요도 없고, * 프로토콜 생각할 필요도 없음) */ @WebServlet("*.k") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloWorld"); resp.setHeader("Content-Type", "text/plain"); PrintWriter out = resp.getWriter(); out.println("<h1>GoodBye</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post ~~~"); PrintWriter out = resp.getWriter(); out.println("<h1>Post</h1>"); } }
notion image
notion image
notion image
다시 ‘보내기’ 클릭
notion image

※ 전체 코드 분석

0️⃣ 원본

1) 코드

package com.example.demo; 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; /** * HttpServlet => Socket 서버에 http 프로토콜이 적용된 클래스 (우리가 socket 서버나 버퍼 만들 필요도 없고, * 프로토콜 생각할 필요도 없음) */ @WebServlet("*.k") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloWorld"); resp.setHeader("Content-Type", "text/plain"); PrintWriter out = resp.getWriter(); out.println("<h1>GoodBye</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post ~~~"); PrintWriter out = resp.getWriter(); out.println("<h1>Post</h1>"); } }

2) 이 파일이 하는 일

브라우저에서 요청이 들어오면
자바 코드가 실행되고
텍스트(또는 HTML)를 응답으로 보내는 역할
즉, 말 그대로 “웹 서버 역할을 하는 자바 코드”
MyServlet은 *.k로 끝나는 주소로 요청이 오면 GET/POST 요청을 구분해서 결과를 되돌려주는 클래스

1️⃣ 코드 분석

1) @WebServlet("*.k")

@WebServlet("*.k")
  • 브라우저 주소가 .k로 끝나면 호출되라는 뜻
  • 예)
    • http://localhost:8080/test.k → 실행됨
    • http://localhost:8080/hello.k → 실행됨
    • /abc.jsp 같은 건 실행 ❌
즉, URL 매핑 규칙

2) extends HttpServlet

public class MyServlet extends HttpServlet
이 클래스가 HttpServlet을 상속 받았다 = HTTP 요청을 처리할 수 있는 “웹 클래스”가 된다는 뜻

3) doGet() = GET 요청 처리

@Override protected void doGet(...)
  • 주소 입력하거나
  • 링크 클릭하거나
  • 웹에서 기본 요청 → GET
➡️ 브라우저에서 주소 입력할 때 실행
System.out.println("HelloWorld");
  • 서버 콘솔에 메시지 출력 (브라우저에는 안 보임)
resp.setHeader("Content-Type", "text/plain");
  • 응답 형식을 지정
  • 지금은 텍스트로 보낸다고 표시
PrintWriter out = resp.getWriter(); out.println("<h1>GoodBye</h1>");
  • 브라우저에 보내는 내용
  • 텍스트지만 HTML 태그 문자열 그대로 출력됨
    • (브라우저는 <h1>을 태그로 인식 안 함, 그냥 글자로 보는 형식)

4) doPost() = POST 요청 처리

@Override protected void doPost(...)
  • 폼 제출
  • Ajax 요청
  • 데이터 전송
➡️ 같은 POST 요청이 들어올 때 실행됨
System.out.println("post ~~~");
  • 서버 콘솔 출력
out.println("<h1>Post</h1>");
  • 브라우저에 <h1>Post</h1> 출력

3️⃣ 흐름 요약

URL
GET 요청
POST 요청
/anything.k
<h1>GoodBye</h1> 출력
<h1>Post</h1> 출력

4️⃣ 중요한 포인트

HttpServlet웹 요청 처리 클래스
doGet()GET, doPost()POST 요청
resp.getWriter().println()브라우저로 텍스트 보내기
System.out.println()서버 콘솔 로그
@WebServlet("*.k")주소 매핑 조건
Share article