backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  1. 스프링
  2. 서블릿, JSP

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);
    }
}
Previous서블릿, JSPNext서블릿 보충자료

Last updated 6 months ago