Error/Spring

[Spring] Spring MVC에서의 HTTP 요청 처리(Get,Post, @GetMapping, @PostMapping ...)

prao 2023. 9. 4. 00:18
반응형

spring logo

Java + Spring Boot로 개인 미니 프로젝트를 진행하면서, Controller에서 자주 사용하는 HTTP 요청 처리 어노테이션인 @GetMapping과 @PostMapping이 헷갈려서 정리를 하고자 글을 작성한다.

 

우선 Get과 Post에 대해서 먼저 이해를 해보자.

 

Get

용도

클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 메서드

데이터를 읽거나(Read), 검색(Retreive)할 때 사용되는 메서드로 요청을 전송할 때 URL 주소 끝에 파라미터로 포함되어 전송된다.

이 부분을 쿼리 스트링(Query String)이라고 부른다.

특징

  1. URL에 데이터를 포함시켜서 요청 → 민감한 데이터를 사용할 때는 사용해선 안된다.
  2. 데이터를 Header에 포함하여 전송
  3. 데이터 길이에 대한 제한 존재
  4. 성공 시 200 HTTP 응답  코드를 XML, JSON, 여러 데이터(html, txt ...), 여려 형식의 데이터와 함께 반환
  5. 여러 번 반복해서 호출되어도 동일한 결과가 나타난다(idempotent; 멱등성)

위와 같은 특징으로 인해 주로 조회할 때만 사용

→ 안전하다고 간주, 데이터 변형의 위험 없이 사용할 수 있다.

 

 

Post

용도

리소스를 생성 및 업데이트하기 위해 서버에 데이터를 보내는 데 사용된다.

특징

  1. URL에 데이터를 노출하지 않고 요청한다.
  2. 데이터를 Body에 포함한다.
  3. Body 타입은 요청 Header의 Content-Type에 요청 데이터의 타입표시에 따라 결정
  4. 데이터 길이에 대한 제한 없음 → 대용량 데이터 전송 가능
  5. URL에 데이터가 노출되지 않으므로 GET 방식보다 안전해보임
    → 하지만 개발자도구와 같은 툴로 요청 내용 확인 가능 → 민감한 데이터의 경우에는 반드시 암호화를 해야함.
  6. 캐싱을 할 수 없다.
  7. 브라우저에 기록이 남지 않는다.
  8. 여러 번 반복해서 호출하면 서버 상태에 변경이 발생할 수 있다(Non-idempotent)

POST VS GET

GET VS POST

특징 GET POST
캐시 ⭕️
브라우저 기록 ⭕️
북마크 추가 ⭕️
데이터 길이 제한 ⭕️
HTTP 응답 코드 200(Ok) 201(Created)
언제 주로 사용하는가? 리소스 요청 리소스 생성
리소스 전달 방식 쿼리스트링 HTTP Body
idempotent ⭕️

HttpMethod

  1. GetMapping: HTTP Get Method에 해당하는 단축 표현. 서버의 리소스를 조회할 때 사용
  2. PostMapping: HTTP Post Method에 해당하는 단축 표현. 서버에 리소스를 등록(저장)할 때 사용
  3. PutMapping: 서버의 리소스를 모두 수정
  4. PatchMapping: 서버의 리소스를 일부 수정
  5. DeleteMapping: 서버의 리소스를 삭제

RequestMapping

  • 특정 URI로 요청을 보내면 Controller에서 어떠한 방식으로 처리할 지 정의를 하는데,
    이 때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 RequestMapping이다.
  • 가장 많이 사용하는 특성은 value, method
    • value: 요청받을 URL 설정
    • method: 어떤 요청으로 받을지 정의(GET, POST, PUT, DELETE, PATCH)
  • 예시
@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String helloGet(...) {
        ...
    }

    @RequestMapping(value = "/hello", method = RequestMethod.POST)
    public String helloPost(...) {
        ...
    }

    @RequestMapping(value = "/hello", method = RequestMethod.PUT)
    public String helloPut(...) {
        ...
    }

    @RequestMapping(value = "/hello", method = RequestMethod.DELETE)
    public String helloDelete(...) {
        ...
    }
}

이런 식으로 모든 메서드를 매핑하면 코드가 길어진다. 따라서 아래와 같이 매핑한다.

@RestController
@RequestMapping(value = "/hello")
public class HelloController {

    @GetMapping()
    public String helloGet(...) {
        ...
    }

    @PostMapping()
    public String helloPost(...) {
        ...
    }

    @PutMapping()
    public String helloPut(...) {
        ...
    }

    @DeleteMapping()
    public String helloDelete(...) {
        ...
    }
}

공통적인 URL은 class에 @RequestMapping으로 설정하고 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping을 붙이면서 나머지 코드는 생략할 수 있다. 추가 URL을 붙이고 싶으면 각 어노테이션에 추가적인 URL을 작성하면 된다.

@Controller
@RequestMapping(value = "/items")
public class ItemController {    
    @GetMapping("/new")
    public String updateItem(...) {
        ...
    }
}

updateItem에 들어가려면 /items/new를 입력해야 들어갈 수 있다.

@RequestMapping은 Class와 Method에 붙일 수 있다.
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping들은 Method에만 붙일 수 있다.

 

Handler

 Spring MVC에서는 핸들러가 @Controller클래스를 의미한다.

@GetMapping, @PostMapping과 같은 어노테이션들을 핸들러 메서드라고 부른다.

→ Handler Mapping이란, 사용자의 요청과 이 요청을 처리하는 Handler를 매핑해주는 역할을 하는 것

 

 

예시

@GetMapping, @PostMapping

@GetMapping("/new")
public String New() {
        return "/Login/회원가입";
}

@PostMapping("/new")
public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());
        member.setPhoneNumber(form.getPhoneNumber());

        memberService.join(member);

        return "redirect:/";
}

HTML - <form>

<form action="/new" method="post">

 

참고자료

https://mungto.tistory.com/436

 

[Spring] @RequestMapping이란?

우리는 특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의를 한다. 이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 @RequestMapping이다. @RequestMapping에서 가장

mungto.tistory.com

https://whales.tistory.com/120

 

Get과 Post의 차이를 아시나요?

주의!⚠️ 본글에서는 독자들이 HTTP method가 무엇인지 안다는 전제 하에 이야기를 진행합니다. Get과 Post는 Http method 중 가장 많이 쓰이는 method가 아닐까 싶습니다. 하지만 이 글을 읽는 당신은 둘

whales.tistory.com

https://tjdwns4537.tistory.com/48

 

Controller의 PostMapping, GetMapping 에 대해 이해하기

ㅇ GET/POST 이해하기 1) GET 란? - URL에 데이터를 포함시켜 요청 - 데이터를 헤더에 포함하여 전송 - URL에 데이터가 노출되어 보안에 취약 - 캐싱할 수 있음 => 주로 조회할때만 사용 2) POST 란? - URL에

tjdwns4537.tistory.com

 

반응형