back/Servlet

Servlet) DTO 활용 HTML 응답을 Servlet에서 직접 생성하기

pogun 2025. 2. 28. 01:52

코드 설명


1. DTO (Data Transfer Object) 클래스 정의

: 데이터를 담아 전달할 DTO 클래스를 정의

: 여기서는 HumanDto 클래스를 생성하여 이름(name)나이(age) 정보를 저장하도록 한다.

HumanDto.java

package com.mulcam.edu.dto;

public class HumanDto {
    private String name;
    private int age;
    
    public HumanDto() {
    }
    public HumanDto(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }    
}

데이터 저장: name, age 정보를 저장

데이터 이동: Servlet 간 데이터를 전달하는 객체 역할 수행


2. HelloSvl (HelloServlet) - 데이터 설정 및 이동

HelloSvl.java

package com.mulcam.edu.servlet;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mulcam.edu.dto.HumanDto;

public class HelloSvl extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doProc(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doProc(req, resp);
    }

    public void doProc(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet doProc");

        // 데이터 설정
        String memo = "나는 오늘도 보람찬 하루였다.";
        req.setAttribute("memo", memo);  // request 객체에 데이터 저장
        
        // DTO 객체 생성 및 데이터 설정
        String name = "성춘향";
        int age = 16;
        HumanDto human = new HumanDto(name, age);
        req.setAttribute("human", human);  // request 객체에 DTO 저장

        // WorldServlet으로 이동 (RequestDispatcher 사용)
        RequestDispatcher dispatch = req.getRequestDispatcher("world");
        dispatch.forward(req, resp);  // forward 방식으로 이동
    }
}

: memo는 단순 문자열 → request 객체에 바로 저장

: name과 age는 DTO 내부 멤버 변수에 먼저 저장 →  DTO 객체를 request 객체에 저장 

1. 데이터 설정

    - memo 문자열을 request 속성(attribute)에 저장

    - HumanDto 객체를 생성하여 request 속성(attribute)에 저장

2. RequestDispatcher를 이용한 이동

    - req.getRequestDispatcher("world"): /world로 이동 설정

    - dispatch.forward(req, resp): forward 방식으로 이동

    - forward 방식은 클라이언트의 url을 변경하지 않고 내부에서 이동

    - 즉, 브라우저 주소창은 여전히 /hello가 남아있지만 실제 실행된 서블릿은 worldServlet

 

sendRedirect : 데이터를 전송하는 것이 아닌 단순 이동이나 간단한 데이터를 전송 시 사용

resp.sendRedirect("world") : 가고싶은 링크 입력

resp.sendRedirect("world?name=KimTuTa&age=25") : 이런식으로 긴단한 데이터 전송


2. WorldServlet - 데이터 수신 및 출력

WorldServlet.java

package com.mulcam.edu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mulcam.edu.dto.HumanDto;

public class WorldServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doProc(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doProc(req, resp);
    }

    public void doProc(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        // request 객체에서 데이터 가져오기 (짐 풀기)
        String memo = (String) req.getAttribute("memo");
        HumanDto human = (HumanDto) req.getAttribute("human");

        // HTML 응답 전송
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter pw = resp.getWriter();

        pw.println("<html>");
        pw.println("<head><title>WorldServlet</title></head>");
        pw.println("<body>");
        pw.println("<h1>World Servlet</h1>");
        pw.println("<p>welcome</p>");

        // request에서 전달받은 데이터 출력
        pw.println("<p>" + memo + "</p>");
        pw.println("<p>" + human.getName() + "</p>");
        pw.println("<p>" + human.getAge() + "</p>");

        pw.println("</body>");        
        pw.println("</html>");

        pw.close();
    }
}

1. request 객체에서 데이터 추출

    - req.getAttribute("memo") → memo 데이터 받기

    - req.getAttribute("human") → HumanDto 객체 받기

2. HTML 응답 생성 및 데이터 출력

    - memo 내용 및 HumanDto 객체의 name, age 정보 출력


4. Servlet 매핑 (Web.xml)

web.xml

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.mulcam.edu.servlet.HelloSvl</servlet-class>
</servlet>       

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>world</servlet-name>
    <servlet-class>com.mulcam.edu.servlet.WorldServlet</servlet-class>
</servlet>       

<servlet-mapping>
    <servlet-name>world</servlet-name>
    <url-pattern>/world</url-pattern>
</servlet-mapping>

web.xml의 역할

: /hello 요청 → HelloSvl 실행

: /world 요청 → WorldServlet 실행


실행 흐름

1. 클라이언트에서 /hello 요청

 

2. helloSvl 실행

    - memo 데이터 설정

    - HumanDto 객체 생성 및 설정

    - /world로 forward 이동

 

3. WorldServlet 실행

    - request에서 memo, human 데이터를 꺼냄

    - HTML로 데이터를 출력

[ 클라이언트 요청 (/hello) ] 
        ↓
[ HelloSvl 실행 ]  
        ↓ (forward)
[ WorldServlet 실행 ]  
        ↓
[ 클라이언트에게 HTML 응답 ]

실행화면 (index.html에서 클릭 시 서블릿 실행)

: forward로 설계하여 주소는 hello에 남아있음

: 실제 실행된 서블릿은 world임!!