[아이티센 부트캠프] Servlet JSP 0

이언덕·2026년 4월 13일

아이티센 부트캠프

목록 보기
44/115
post-thumbnail

Servlet이 무엇인지

Servlet은 브라우저 요청을 받아서 서버에서 실행되는 Java 프로그램이다.
즉, 내가 직접 main() 메서드를 실행하는 방식이 아니라, 브라우저가 주소로 요청을 보내면 그 요청을 처리하고 결과를 다시 브라우저로 보내는 구조이다.
이번 실습은 Servlet을 처음 만들고, 브라우저에 내용을 출력하고, 주소창으로 전달한 값을 읽어 오는 가장 기본적인 흐름을 다룬다.


여기서 가장 먼저 잡아야 하는 핵심은 Servlet은 혼자 실행되는 프로그램이 아니라 요청이 들어와야 동작하는 프로그램이라는 점이다.
그래서 코드 작성도 중요하지만, 어떤 주소로 요청해야 하는지를 함께 이해해야 전체 흐름이 보인다.


일반 Java 실행과 다른 점

일반 Java 프로그램은 보통 main() 메서드부터 시작한다.
하지만 Servlet은 main()으로 시작하지 않는다.
웹 서버가 Servlet 객체를 관리하고 있다가, 사용자가 브라우저로 요청을 보내면 그에 맞는 메서드를 대신 호출한다.


이번 실습에서는 doGet()이 그 역할을 한다.
즉, 브라우저 주소창으로 요청을 보내면 서버가 doGet()을 실행하고, 그 안에서 만든 결과를 브라우저 화면에 보여 주는 것이다.


왜 브라우저에서 요청해야 하는지

Servlet은 화면 프로그램이 아니라 요청 처리 프로그램이다.
그래서 파일을 다 만들었다고 끝나는 것이 아니다.
브라우저에서 주소를 요청해야 실제 실행 결과를 볼 수 있다.


이번 실습의 실행 주소는 http://localhost:8088/edu/FirstServlet이다.
여기에 값을 더 전달하고 싶으면 ?guest=이현석처럼 query string을 붙여서 요청할 수 있다.
즉, 브라우저 요청이 있어야 Servlet이 동작하고, 그 뒤에야 응답 결과가 화면에 보인다.




첫 Servlet 만들기

Servlet을 만들 때는 먼저 웹 프로젝트 구조를 볼 줄 알아야 한다.
이번 실습에서는 edu 프로젝트 아래 src/main/java 위치에 FirstServlet.java 파일을 만들었다.
이 위치는 서버에서 동작할 Java 클래스를 두는 기본 위치라고 보면 된다.

위 화면처럼 src/main/java 아래에 Servlet 클래스를 만들고 있다는 점이 중요하다.
즉, 이번 실습은 일반 콘솔 Java 프로그램이 아니라 웹 애플리케이션 안에서 동작하는 서버 코드를 만드는 과정이다.


Create Servlet 첫 화면

Create Servlet 첫 화면에서는 Source folder, Java package, Class name, Superclass를 입력한다.
초보자 기준으로 여기서는 세 가지만 먼저 보면 된다.
Class name은 만들 클래스 이름이고, Superclass는 어떤 부모 클래스를 상속받을지 정하는 항목이고, Source folder는 파일이 저장될 위치이다.

이번 실습에서는 클래스 이름을 FirstServlet으로 만들고, 부모 클래스로 jakarta.servlet.http.HttpServlet을 사용했다.
이 뜻은 곧 이 클래스가 Http 요청을 처리하는 Servlet이 된다는 의미이다.


HttpServlet을 상속받아야 doGet(), doPost()처럼 웹 요청을 처리하는 메서드를 사용할 수 있다.
즉, 그냥 일반 클래스를 만드는 것이 아니라, 웹 요청을 받을 수 있는 형태의 클래스를 만드는 것이다.


URL mapping 설정

다음 화면에서는 Name과 URL mappings를 정한다.
여기서 URL mapping은 브라우저 주소와 Servlet 클래스를 연결하는 설정이다.

이번 실습에서는 /FirstServlet으로 연결했다.
그래서 브라우저에서 /edu/FirstServlet 주소를 요청하면 FirstServlet 클래스가 실행된다.


초보자가 여기서 자주 헷갈리는 부분은 클래스 이름과 요청 주소를 완전히 같은 것으로 보는 점이다.
둘은 연결되어 있지만 역할은 다르다.
클래스 이름은 Java 클래스 이름이고, URL mapping은 브라우저 요청 경로이다.


doGet() 메서드 생성 선택

생성 마지막 단계에서는 어떤 메서드 뼈대를 자동으로 만들지 선택할 수 있다.
이번 실습에서는 이 화면을 그냥 넘기면 안 되고, 어떤 항목을 남기고 어떤 항목을 체크 해제했는지까지 같이 봐야 한다.


첫 화면에서는 Constructors from superclass, Inherited abstract methods, doGet(), doPost()가 체크되어 있다.
즉, 처음에는 부모 클래스 생성자 관련 코드와 GET, POST 요청 처리 메서드까지 함께 만들도록 잡혀 있는 상태이다.



그다음 실제 실습에서는 여기서 두 가지를 체크 해제했다.
바로 Constructors from superclass와 doPost()이다.


Constructors from superclass를 해제한 이유는 이번 실습에서 부모 생성자를 따로 가져와서 사용할 일이 없기 때문이다.
지금은 Servlet을 처음 만들고 요청을 처리하는 흐름만 보는 단계이기 때문에, 생성자 코드까지 같이 만들 필요가 없다.
즉, 지금 당장 쓰지 않는 코드는 빼고 필요한 부분만 남긴 것이다.


doPost()를 해제한 이유도 같다.
이번 실습은 브라우저 주소창으로 요청을 보내는 가장 기본적인 예제이고, 이 방식은 GET 요청으로 처리된다.
그래서 POST 요청을 처리하는 doPost()까지 미리 만들지 않고, doGet()만 남겨서 구조를 더 단순하게 만든 것이다.


정리하면 이 단계에서는 처음 체크된 항목을 그대로 다 쓰는 것이 아니라, 이번 실습 목적에 맞게 Constructors from superclass와 doPost()를 빼고 doGet() 중심으로 단순화했다고 이해하면 된다.
즉, 지금은 브라우저 요청을 받으면 doGet()이 실행된다는 흐름만 정확히 잡는 것이 가장 중요하다.




자동 생성된 코드 구조 이해하기

Servlet을 생성하고 나면 기본 코드가 자동으로 만들어진다.
처음 보면 길어 보여도 실제로는 몇 개의 핵심 부품만 보면 된다.
이번에는 코드 사진 대신, 실습 흐름에 맞게 코드를 다시 정리해서 보면 된다.


클래스 선언부

// FirstServlet.java
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;

@WebServlet("/FirstServlet") // 이 주소로 요청이 오면 이 클래스가 실행된다
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L; // 클래스 버전 정보

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // GET 요청을 처리하는 자리
    }
}

이 코드에서 먼저 봐야 할 것은 @WebServlet("/FirstServlet")이다.
이 설정이 있기 때문에 브라우저 주소와 이 클래스가 연결된다.


그다음은 extends HttpServlet이다.
이 부분은 FirstServlet이 웹 요청을 처리할 수 있는 부모 클래스 기능을 물려받는다는 뜻이다.
즉, Servlet으로 동작하는 데 필요한 기본 구조를 HttpServlet이 제공한다고 이해하면 된다.


doGet() 안의 두 객체

doGet() 안에는 request와 response가 들어온다.
이 둘은 Servlet에서 가장 중요하다.


request는 브라우저가 보낸 요청 정보이다.
사용자가 어떤 주소로 들어왔는지, 어떤 값을 함께 보냈는지 같은 정보가 여기에 들어 있다.


response는 서버가 브라우저로 돌려보낼 응답 정보이다.
브라우저에 보여 줄 글자, HTML 코드, 문자 인코딩, 응답 형식 같은 것을 여기에 담는다.


즉, 아주 단순하게 정리하면 이렇다.
request는 들어온 것, response는 내보낼 것이다.




브라우저에 HTML 출력하기

Servlet은 response를 이용해서 브라우저에 보여 줄 내용을 직접 만들 수 있다.
이번 실습에서는 PrintWriter를 꺼내서 HTML 태그를 문자열 형태로 응답에 넣는 방식으로 화면을 만들었다.
이때 가장 중요한 것은 response.setContentType()이다.


이 설정이 왜 중요하냐면, 브라우저가 받은 문자열을 어떤 형식으로 해석할지 정해 주기 때문이다.
같은 문자열이라도 text/html로 보내면 태그로 해석하고, text/plain으로 보내면 일반 문자 그대로 보여 준다.


text/html로 보낼 때

// FirstServlet.java
import java.io.PrintWriter;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html; charset=utf-8"); // HTML 문서로 해석하게 설정
    PrintWriter out = response.getWriter(); // 브라우저에 출력할 통로 준비

    out.print("<h1>첫 번째 Servlet 수행</h1>"); // 큰 제목 출력
    out.close(); // 출력 마무리
}

response.setContentType("text/html; charset=utf-8")는 응답 내용을 HTML 문서로 처리하라는 뜻이다.
그리고 charset=utf-8은 한글이 깨지지 않게 하기 위한 문자 인코딩 설정이다.


PrintWriter out = response.getWriter();는 브라우저에 내용을 써 보낼 출력 도구를 가져오는 코드이다.
그다음 out.print()로 문자열을 보내면, 그 문자열이 브라우저 화면의 내용이 된다.

// 출력결과
// 첫 번째 Servlet 수행

위 결과처럼 h1 태그가 실제 제목처럼 크게 보인다.
이것은 브라우저가 이 응답을 일반 문자열이 아니라 HTML 문서로 해석했기 때문이다.


text/plain으로 바꾸면 왜 다르게 보이는지`

// FirstServlet.java
import java.io.PrintWriter;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/plain; charset=utf-8"); // 일반 문자로 해석하게 설정
    PrintWriter out = response.getWriter(); // 출력 도구 준비

    out.print("<h1>첫 번째 Servlet 수행</h1>"); // 태그도 그냥 문자로 전달됨
    out.close(); // 출력 마무리
}

이번에는 응답 형식을 text/plain으로 바꿨다.
그러면 브라우저는 이 내용을 HTML 문서로 해석하지 않고, 그냥 일반 글자라고 생각한다.

// 출력결과
// <h1>첫 번째 Servlet 수행</h1>


그래서 화면에 태그가 적용되지 않고 <h1> 문자열까지 그대로 보인다.
여기서 꼭 기억해야 할 것은 브라우저 화면은 문자열 그 자체가 아니라, Content-Type 설정에 따라 해석된 결과라는 점이다.


즉, 같은 out.print()라도 응답 형식이 다르면 결과 화면이 완전히 달라진다.




주소창으로 값 전달하기

Servlet은 브라우저가 보낸 값을 읽어서 응답에 반영할 수도 있다.
이번 실습에서는 주소창 뒤에 ?guest=이현석을 붙여서 이름을 전달했고, request.getParameter("guest")로 그 값을 꺼내서 화면에 출력했다.
이때 주소창의 ?guest=이현석 부분을 query string이라고 한다.


이 구조를 이해하면 입력 폼이 없어도, 주소만으로 서버에 값을 전달할 수 있다는 점이 보인다.
즉, 사용자가 보낸 요청값을 읽어서 서버가 다른 응답을 만들 수 있게 되는 것이다.


request.getParameter() 사용하기`

// FirstServlet.java
import java.io.PrintWriter;

@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html; charset=utf-8"); // HTML 형식으로 응답
        PrintWriter out = response.getWriter(); // 출력 도구 준비

        out.print("<h1>첫 번째 Servlet 수행</h1>"); // 제목 출력
        out.print("<hr />"); // 구분선 출력
        out.println("<h2>반가워요 %s님!!</h2>".formatted(request.getParameter("guest"))); // 전달받은 guest 값 출력

        out.close(); // 출력 마무리
    }
}

이 코드에서 가장 중요한 부분은 request.getParameter("guest")이다.
이 코드는 요청 주소에서 guest라는 이름으로 전달된 값을 꺼내 온다.


예를 들어 주소가 http://localhost:8088/edu/FirstServlet?guest=이현석이면 guest의 값은 이현석이 되고, 그 값이 화면에 들어간다.
즉, 주소창으로 전달한 값이 Servlet 안으로 들어와서 응답 내용에 사용되는 것이다.

// 출력결과
// /edu/FirstServlet 요청 시
// 첫 번째 Servlet 수행
// 반가워요 null님!!
//
// /edu/FirstServlet?guest=이현석 요청 시
// 첫 번째 Servlet 수행
// 반가워요 이현석님!!

위 두 화면을 비교하면 차이가 분명하다.
값을 전달하지 않았을 때는 null이 보이고, 값을 전달했을 때는 실제 이름이 출력된다.


값이 없으면 왜 null이 나오는지

request.getParameter("guest")는 guest라는 이름의 값을 찾아서 돌려준다.
그런데 주소에 guest가 없으면 꺼낼 값도 없다.
그래서 결과가 null이 된다.


여기서 null은 빈 문자열과 다르다.
빈 문자열은 값은 있지만 내용이 비어 있는 상태이고, null은 애초에 가져올 값 자체가 없다는 뜻이다.


즉, 이번 결과에서 반가워요 null님!!이 나온 이유는 guest라는 요청값이 전달되지 않았기 때문이다.
이 차이를 알아야 나중에 입력값 검사도 제대로 할 수 있다.




이번 실습의 전체 흐름 정리

Servlet 실습은 코드만 따로 보면 어렵게 느껴질 수 있다.
하지만 전체 흐름을 순서대로 보면 구조가 단순하다.
이번 예제는 Servlet 생성 → URL mapping 설정 → doGet() 작성 → 브라우저 요청 → 응답 화면 확인이라는 한 줄 흐름으로 정리할 수 있다.


브라우저 요청부터 화면 출력까지

  1. src/main/java에 FirstServlet 클래스를 만든다.
  2. HttpServlet을 상속받고 @WebServlet("/FirstServlet")로 요청 주소를 연결한다.
  3. doGet() 안에서 response에 보낼 내용을 작성한다.
  4. 브라우저에서 http://localhost:8088/edu/FirstServlet 주소를 요청한다.
  5. 서버가 doGet()을 실행하고, 작성한 응답을 브라우저에 보낸다.
  6. 브라우저는 받은 응답을 text/html 또는 text/plain 규칙에 따라 화면에 보여 준다.


    이 흐름이 보이면 Servlet이 왜 서버 프로그래밍의 시작인지 이해하기 쉬워진다.
    사용자가 요청을 보내고, 서버가 그 요청을 처리해서 결과를 돌려준다는 웹의 기본 구조가 그대로 들어 있기 때문이다.


이번 실습에서 꼭 기억할 핵심

Servlet은 직접 실행하는 파일이 아니라, 브라우저 요청을 받아 동작하는 서버 코드이다.
그래서 요청 주소와 URL mapping을 함께 이해해야 한다.


request는 사용자가 보낸 정보이고, response는 서버가 돌려보내는 결과이다.
이 둘의 역할 차이를 정확히 잡는 것이 가장 중요하다.


또한 response.setContentType()에 따라 브라우저가 같은 문자열도 다르게 해석한다.
text/html이면 태그가 적용되고, text/plain이면 태그가 글자 그대로 보인다.


마지막으로 request.getParameter("guest")는 요청값을 꺼내는 기본 방식이다.
값이 없으면 null이 나오기 때문에, 앞으로는 요청값이 있는지 먼저 확인하는 습관도 필요하다.

0개의 댓글