05 Servlet(서블릿)

p53 - ./build.gradle

plugins {
	id 'java'
	id 'war'
	id 'org.springframework.boot' version '3.2.8'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'education'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
	implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
	implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	implementation 'jakarta.servlet:jakarta.servlet-api'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
	implementation 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
}

tasks.named('test') {
	useJUnitPlatform()
}

p57

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
public class StartApplication {

	public static void main(String[] args) {
		SpringApplication.run(StartApplication.class, args);
	}

}

p58, 61 - src/main/java/boot/start/servlet/ServletInit

@WebServlet(name = "servletInitServlet", urlPatterns = "/request")
public class ServletInit extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("request");
        super.service(req, resp);
    }

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

p62, 64, 72, 73, 74, 76, 81, 82, 83, 84, 85, 86, 93(주석제거해야함 line127부근), 94, 95 - src/main/java/boot/start/servlet/RequestServlet

@WebServlet(name = "requestServlet", urlPatterns = "/method")
public class RequestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 서블릿 경로 반환
        // 클라이언트가 요청한 서블릿 경로 반환
        System.out.println("Servlet Path: " + req.getServletPath());

        // 웹 애플리케이션 컨텍스트 경로 반환
        System.out.println("Context Path: " + req.getContextPath());

        // 요청이 보안 프로토콜(HTTPS) 통해 이루어졌는지 여부 반환
        System.out.println("is request secure: " + req.isSecure());

        // 클라이언트 사용자 이름 반환
        System.out.println("Remote User: " + req.getRemoteUser());

        // 요청의 프로토콜 스킴(예: http, https)을 반환 클라이언트가 사용한 프로토콜 스킴을 확인
        System.out.println("Request scheme: " + req.getScheme());

        // 클라이언트의 인증 방식을 반환 클라이언트가 인증된 경우, 기본, 다이제스트 또는 폼 기반 인증 방식이 반환
        System.out.println("Authentication Type: " + req.getAuthType());

        // 요청 메서드 출력 (GET, POST, PUT, DELETE 등의 HTTP 메서드 확인)
        System.out.println("Request Method: " + req.getMethod());

        // 요청 URL 정보 출력 (전체 URL을 반환, 프로토콜부터 서버명, 포트, URI까지 모두 포함)
        System.out.println("Request URL: " + req.getRequestURL().toString());

        // 요청 URI 정보 출력 (요청된 리소스의 경로만 반환, URL에서 도메인 및 프로토콜을 제외한 부분)
        System.out.println("Request URI: " + req.getRequestURI());

        // 쿼리 스트링 출력 (URL 뒤에 붙은 파라미터 값을 반환, 예: ?user=abc에서 "user=abc" 반환)
        System.out.println("Query String: " + req.getQueryString());

        // 프로토콜 버전 출력 (요청에서 사용된 HTTP 프로토콜 버전을 반환, 예: HTTP/1.1)
        System.out.println("Protocol: " + req.getProtocol());

        // 요청 헤더 정보 출력
        System.out.println("---- Headers ----");
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = req.getHeader(headerName);
            System.out.println(headerName + ": " + headerValue);
        }

        System.out.println("일반적인 for loop를 통해 데이터 호출");
        System.out.println("복수 파라미터 조회");
        String[] userIds = req.getParameterValues("userId");
        if(userIds != null) {
            for (String userId : userIds) {
                System.out.println("userId" + " = " + userId);
            }
        }
        System.out.println("단일 파라미터 조회");
        String userId = req.getParameter("userId");
        System.out.println("userId = " + userId);

        // 클라이언트 정보 확인
        System.out.println("---- Client Info ----");
        System.out.println("Remote Addr: " + req.getRemoteAddr());
        System.out.println("Remote Host: " + req.getRemoteHost());
        System.out.println("Remote Port: " + req.getRemotePort());
        System.out.println("Remote User: " + req.getRemoteUser());

        // 서버정보 확인
        System.out.println("---- Locale ----");
        System.out.println("Preferred Locale: " + req.getLocale());

        // 쿠키 확인
        System.out.println("---- Cookies ----");
        if (req.getCookies() != null) {
            for (var cookie : req.getCookies()) {
                System.out.println("Cookie: " + cookie.getName() + " = " + cookie.getValue());
            }
        } else {
            System.out.println("No cookies found.");
        }

        // 응답 상태 코드 설정
        resp.setStatus(HttpServletResponse.SC_OK); // 200 OK
        System.out.println("Response Status Code: " + HttpServletResponse.SC_OK);

        // 응답 헤더 설정
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        resp.setHeader("Custom-Header", "This is a custom header");

        // 응답 데이터가 브라우저에 캐시되지 않도록 설정
        resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        resp.setHeader("Pragma", "no-cache");
        resp.setDateHeader("Expires", 0);  // 만료 날짜를 과거로 설정하여 캐시 무효화

        // 파일 다운로드 헤더 설정 (선택적으로 주석 처리)
         resp.setContentType("application/octet-stream");
         resp.setHeader("Content-Disposition", "attachment; filename=\"file.txt\"");

        // 응답 상태 코드 설정 (404 Not Found 예시)
        // resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource not found");

        System.out.println("Response Headers:");
        System.out.println("Content-Type: text/html");
        System.out.println("Character-Encoding: UTF-8");
        System.out.println("Custom-Header: This is a custom header");

        // 응답 본문 작성
        PrintWriter writer = resp.getWriter();
        writer.println("<html><body>");
//        writer.println("<h1>Hello, this is a GET response before</h1>");
//        // 버퍼 플러시
//        resp.flushBuffer();
//        // 지연 추가 (5초 동안 대기)
//        try {
//            Thread.sleep(5000);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
        writer.println("<h1>Hello, this is a GET response</h1>");
        writer.println("</body></html>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("---- HTTP POST Method ----");

        System.out.println("복수 파라미터 조회");
        String[] names = req.getParameterValues("name");
        if (names != null) {
            for (String name : names) {
                System.out.println("name = " + name);
            }
        } else {
            System.out.println("No name parameters found.");
        }

        String age = req.getParameter("age");
        System.out.println("age = " + age);
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("---- HTTP PUT Method ----");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("---- HTTP DELETE Method ----");
    }
}

p103 - src/main/java/boot/start/domain/Users

package boot.start.domain;

public class Users {

    private Long userIdx;
    private String userId;
    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Long getUserIdx() {
        return userIdx;
    }

    public void setUserIdx(Long userIdx) {
        this.userIdx = userIdx;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
}

p104 - src/main/java/boot/start/servlet/ApiServlet

@WebServlet(name = "apiServlet", urlPatterns = "/api")
public class ApiServlet  extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletInputStream inputStream = req.getInputStream();
        String msgBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        System.out.println("msgBody = " + msgBody);

        Users user = objectMapper.readValue(msgBody, Users.class);

        System.out.println("user.getUser_id() = " + user.getUserId());
        System.out.println("user.getUser_name() = " + user.getUserName());

        String result = objectMapper.writeValueAsString(user);

        resp.getWriter().write(result);
    }
}

Last updated