<< 학습 목표 >>
1. PUT, DELETE 요청 방식을 받을 수 있다.
2. PUT, DELETE 요청 방식을 받을 수 있게 설정할 수 있다.
전 글 ( https://codingaja.tistory.com/103 ) 에서 GET, POST 방식 요청을 받는 방법을 알아봤음
이번에는 RestfulAPI에 사용되는 나머지 요청 방법인 PUT, DELETE 요청을 받는 방법을 알아보자
PUT, DELETE 요청을 받는 방법은 GET, POST와 동일함
<< PUT, DELETE 요청 받는 방법 >>
프로젝트 -> com.study.chapter02 -> TestController02 클래스를 추가하고 아래 코드를 추가하자
package com.study.chapter02;
import java.time.LocalDateTime;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
@Controller
public class TestController02 {
@PutMapping("/chapter02/test/controller/03")
public void processPutRequest() {
System.out.println("TestController02 -> processPutRequest 메서드 호출 " + LocalDateTime.now());
}
@DeleteMapping("/chapter02/test/controller/04")
public void processDeleteRequest() {
System.out.println("TestController02 -> processDeleteRequest 메서드 호출 " + LocalDateTime.now());
}
}
<< 코드 설명 >>
코드 설명이 필요 없을 정도로 간단함
1. GET 요청을 받을 때는 @GetMapping 애너테이션을 달고
2. POST 요청을 받을 때는 @PostMapping 애너테이션을 다는 것처럼
3. PUT 요청을 받을 때는 @PutMapping 애너테이션을 달고
4. DELETE 요청을 받을 때는 @DeleteMapping 애너테이션을 담
그러나 여기서 중요한 점 한가지가 있음
PUT, DELETE 요청 방식은 논란이 있는 요청 방식이라 Spring Framework 프로젝트는 기본적으로 PUT, DELETE 요청을 받지 않도록 막아뒀음
그래서 PUT, DELETE 요청을 받을 수 있게 뚫어줘야함
( 막아둔 이유가 궁금하다면 구글 또는 ChatGPT를 활용해 CORS 정책에 대해서 찾아보자 )
PUT, DELETE 요청을 받을 수 있게 뚫으려면 WebMvcConfigurer 인터페이스를 상속 받은 클래스가 필요함
어느 패키지든 상관 없지만 우리는 프로젝트 -> com.study 패키지 -> WebConfigurer 클래스를 추가하고 아래 코드를 추가하자
package com.study;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://192.168.0.1:8080")
.allowedMethods("GET", "POST", "PUT", "PATCH", "OPTIONS", "DELETE")
.allowCredentials(true);
}
}
<< 코드 설명 >>
(1). addMapping 메서드 : PUT, DELETE 요청을 이 프로젝트 내 모든 컨트롤러가 받을 수 있도록 하겠다
(2). allowedOrigins 메서드 : PUT, DELETE 요청을 보낼 수 있는 클라이언트를 제한하는 메서드로 http 프로토콜을 사용하고 IP가 192.168.0.1이고 포트는 8080번인 클라이언트의 요청만 addMapping 메서드로 명시한 컨트롤러가 받겠다
프론트엔드(웹페이지)가 없어서 이 메서드의 역할이 이해가 잘 안될 것
웹페이지의 URL이 http://192.168.0.1:8080 일 때만 이 프로젝트 내 모든 컨트롤러로 요청을 보낼 수 있다는 것
(3). allowedMethods 메서드 : 컨트롤러가 받을 수 있는 요청 방식
우리가 알고 있는 요청 방식은 GET, POST, PUT, DELETE 뿐인데 PATCH, OPTIONS 요청 방식은 뭘까?
클라이언트는 서버로 요청하기 전 이 방식의 요청을 서버가 받을 수 있는지 확인함
우리가 GET, POST, PUT, DELETE 요청을 보내면 실제로 그 요청이 보내지기 전 OPTIONS 방식, PATCH방식 각 각 한번씩 요청을 보내 컨트롤러가 GET, POST, PUT, DELETE 방식 요청을 받을 수 있는지 확인함
그래서 OPTIONS, PATCH 요청 방식도 뚫어놔야함
(4). allowCredentials 메서드 : allowedOrigins 메서드와 함께 동작하는 메서드로 allowedOrigins의 인자를 "*" 로 넣으면 어떤 클라이언트이든 이 프로젝트 내 모든 컨트롤러를 호출할 수 있도록 하겠다임
이렇게 되면 이 프로젝트는 알 수 없는 어떤 해커에게 DDoS 공격을 받을 수 있음
따라서 allowedOrigins 메서드의 인자는 절대 "*" 로 하면 안되고 지금 우리가 한 것처럼 내가 개발하고 있는 프론트엔드(웹페이지)의 URL만 인자로 넣어야함
allowCredentials 메서드의 인자를 true로 설정하면 allowedOrigins의 인자를 "*" 로 할 수 없게 막게됨
allowCredentials 메서드는 개발자의 무지 또는 실수로 allowedOrigins의 인자를 "*" 로 할 수 없게 막는 역할
'Spring + Boot > Boot-Chapter02' 카테고리의 다른 글
Chapter02. Spring Boot - Restful실습 / RestfulAPI 답게 응답하기 (0) | 2023.06.02 |
---|---|
Chapter02. Spring Boot - Restful실습, @PathVariable (0) | 2023.06.01 |
Chapter02. Spring Boot - Restful API 이론 (0) | 2023.05.31 |
Chapter02. Spring Boot - Validator 유연하게 생성하기 (0) | 2023.04.12 |
Chapter02. Spring Boot - 커맨드 객체 검증 하기 (0) | 2023.04.11 |