Development Study/Backend

[Spring Boot] About HTTP 요청 관련 어노테이션, @도움!

  • -
728x90

Spring Boot를 사용하기 위해 학습을 하던 중, 문득 HTTP 요청에 따른 어노테이션들이 무엇이 있고, 어떤 일을 하는 지 궁금했습니다.

그래서 저는 이에 대해 알아보기로 하였고, 나중에 이 글을 읽고 도움이 되었으면 하는 마음에 새 글을 작성하기로 하였습니다.

 


@GetMapping 은 무엇인가요?

@GetMapping은 Spring Framework에서 제공하는 annotation이며, 주로 HTTP GET 요청을 처리하는 메소드에 사용됩니다.

이는 @RequestMapping의 특수한 형태라고 볼 수 있습니다.

기본적으로, @GetMapping은 컨트롤러의 메소드 위에 위치하여, 특정 URL에 대한 GET 요청이 오면 그 요청을 처리할 메소드를 지정합니다.

간단한 예를 보자면 다음과 같습니다.

@GetMapping("/hello")
public String hello() {
    return "Hello, World!";
}

이 경우에는 /hello URL로의 GET 요청이 이 메소드에 의해 처리됩니다. 그 결과로서 "Hello, World!"라는 문자열이 반환됩니다.

또한 @GetMapping@RequestMapping에서 제공하는 속성들을 그대로 제공합니다. 예를 들어, value, params, headers 등의 속성을 사용할 수 있습니다. 이들 속성은 요청이 특정 조건을 충족해야 메소드가 처리하도록 하는 역할을 합니다.

@GetMapping은 주로 RESTful API를 개발할 때 사용되며, 이는 클라이언트에서 서버로 데이터를 요청하는 경우에 주로 사용되는 HTTP 메소드인 GET을 사용함으로써, 서버에서 클라이언트로의 데이터 전송을 명시적으로 표현하는 방법입니다.


엇, 이거 분명 페이지 이동에도 사용되지 않았나요?

그렇습니다, @GetMapping은 페이지 이동에도 사용될 수 있습니다.

Spring에서는 Thymeleaf, FreeMarker, JSP 등의 템플릿 엔진을 사용해 뷰를 만들 수 있습니다.

컨트롤러 메소드는 템플릿 이름을 문자열로 반환하여, 해당 템플릿으로 이동하게 됩니다.

이때 사용하는 것이 @GetMapping입니다.

예를 들어, 아래와 같이 사용할 수 있습니다

@GetMapping("/greeting")
public String greeting(
    @RequestParam(name="name", required=false, defaultValue="World") 
    String name, Model model
) {
    model.addAttribute("name", name);
    return "greeting";
}

이 예제에서는 "/greeting" 경로로 GET 요청이 오면 greeting 메소드가 호출됩니다.

이 메소드는 greeting이라는 이름의 템플릿을 반환합니다.

이 템플릿 엔진(예를 들어, Thymeleaf)은 이 greeting 이름을 가진 템플릿을 찾아서 렌더링하고, 최종적으로 생성된 HTML 페이지를 클라이언트에게 반환하게 됩니다.

그리고 메소드 인자로 받는 Model 객체는 뷰에 전달할 데이터를 담는 역할을 합니다.

위의 예제에서는 name이라는 속성에 값을 담아 greeting 템플릿에 전달하고 있습니다.

이렇게 전달된 데이터는 템플릿 내에서 사용되어 동적인 뷰를 생성하는데 활용됩니다.


greeting이 반환된다는건 잘 알겠어요. 하지만 어디에 위치해있는 지 잘 모르겠네요

Spring Boot의 기본 설정에 따르면, greeting이라는 뷰 템플릿 파일은 일반적으로 src/main/resources/templates 디렉토리 아래에 위치하게 됩니다.

예를 들어 Thymeleaf를 사용한다면, greeting 템플릿은 src/main/resources/templates/greeting.html이 됩니다.

또한, 뷰 템플릿 파일의 위치는 application.properties 또는 application.yml 설정 파일을 통해 변경할 수도 있습니다.

템플릿 엔진(예: Thymeleaf)은 @GetMapping에서 반환한 문자열을 통해 해당 위치의 파일을 찾아 렌더링 작업을 수행하게 됩니다. 이렇게 렌더링된 결과는 최종적으로 HTML 형태로 클라이언트에게 전송되며, 이것이 바로 사용자가 웹 브라우저를 통해 보게 되는 웹 페이지입니다.

그리고 JSP를 사용하는 경우 일반적으로 웹 애플리케이션의 WEB-INF 디렉토리 아래에 JSP 파일들이 위치합니다.

greeting.jsp라는 JSP 파일이 있다면, 그 위치는 보통 src/main/webapp/WEB-INF/jsp/greeting.jsp가 될 것입니다.

이때, src/main/webapp는 웹 애플리케이션의 루트 디렉토리에 해당합니다.

그러나 Spring Boot에서는 기본적으로 내장 톰캣을 사용하고, src/main/webappWEB-INF 디렉토리는 기본적으로 사용하지 않습니다.

그래서 만약 Spring Boot에서 JSP를 사용하려면 별도의 설정이 필요합니다.

이때 spring.mvc.view.prefixspring.mvc.view.suffix 속성을 application.properties 또는 application.yml에 설정하여 JSP 파일의 위치를 지정할 수 있습니다.

spring.mvc.view.prefix= /WEB-INF/jsp/
spring.mvc.view.suffix= .jsp

이 설정은 컨트롤러가 뷰 이름으로 "greeting"을 반환하면, Spring MVC가 이를 /WEB-INF/jsp/greeting.jsp로 변환하여 해당 JSP 파일을 찾게 됩니다. 그리고 이 JSP 파일이 렌더링되어 최종적인 HTML 페이지가 생성됩니다.


HTTP 요청 메소드를 처리하는 다른 어노테이션들도 알려주세요!

Spring에서는 HTTP 요청 메소드를 처리하는 여러 가지 어노테이션을 제공하고 있습니다. @GetMapping과 마찬가지로 이들 어노테이션들도 @RequestMapping의 특수한 형태입니다.

아래에는 추가적인 어노테이션들을 다뤄놓았습니다.

  • @PostMapping
    • HTTP POST 요청을 처리하는 메소드를 표시합니다.
    • POST는 주로 클라이언트에서 서버로 데이터를 전송하거나, 리소스를 생성하는 데 사용됩니다.
@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.createUser(user);
}
  • @PutMapping
    • HTTP PUT 요청을 처리하는 메소드를 표시합니다.
    • PUT은 주로 리소스를 수정하거나, 대체하는 데 사용됩니다.
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
    return userService.updateUser(id, user);
}
  • @DeleteMapping
    • HTTP DELETE 요청을 처리하는 메소드를 표시합니다.
    • DELETE는 주로 리소스를 삭제하는 데 사용됩니다.
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
    userService.deleteUser(id);
}
  • @PatchMapping:
    • HTTP PATCH 요청을 처리하는 메소드를 표시합니다.
    • PATCH는 주로 리소스의 일부를 수정하는 데 사용됩니다.
@PatchMapping("/users/{id}")
public User updateUserPartially(@PathVariable Long id, @RequestBody User user) {
    return userService.updateUserPartially(id, user);
}

이들 어노테이션을 사용하면 각 HTTP 요청 메소드에 대응하는 컨트롤러 메소드를 명확하게 표현할 수 있습니다.

그러므로 각 메소드가 어떤 HTTP 요청을 처리하는지를 더 쉽게 이해할 수 있으며,

이는 코드의 가독성을 향상시키는 데 도움이 됩니다.


아직 이해가 잘 되지 않아요. 더 설명해주세요

각 어노테이션에 대한 몇 가지 상황을 더 설명하겠습니다.

  • @GetMapping
    • 상품 목록을 가져오는 API를 만들 때, GET 메소드는 서버의 리소스를 조회하는 데 가장 일반적으로 사용됩니다.
@GetMapping("/products")
public List<Product> getProducts() {
    return productService.getAllProducts();
}

ex) 특정 사용자의 정보를 조회하는 API를 만들 때,

@GetMapping("/users/{userId}")
public User getUser(@PathVariable String userId) {
    return userService.getUser(userId);
}
  • @PostMapping
    • 새로운 사용자를 등록하는 API를 만들 때, POST 메소드는 서버에 새로운 리소스를 생성하는 데 사용됩니다.
@PostMapping("/users")
public User createUser(@RequestBody User newUser) {
    return userService.createUser(newUser);
}
  • @PutMapping
    • 사용자의 전체 정보를 수정하는 API를 만들 때, PUT 메소드는 서버의 특정 리소스를 전체적으로 업데이트하는 데 사용됩니다.
@PutMapping("/users/{userId}")
public User updateUser(@PathVariable String userId, @RequestBody User updatedUser) {
    return userService.updateUser(userId, updatedUser);
}
  • @DeleteMapping
    • 특정 사용자를 삭제하는 API를 만들 때, DELETE 메소드는 서버의 특정 리소스를 삭제하는 데 사용됩니다.
@DeleteMapping("/users/{userId}")
public ResponseEntity<?> deleteUser(@PathVariable String userId) {
    userService.deleteUser(userId);
    return ResponseEntity.ok().build();
}
  • @PatchMapping
    • 사용자의 일부 정보(예: 이메일 변경)만을 수정하는 API를 만들 때, PATCH 메소드는 서버의 특정 리소스의 일부분만을 업데이트하는 데 사용됩니다.
@PatchMapping("/users/{userId}")
public User updateUserEmail(@PathVariable String userId, @RequestBody User updatedUser) {
    return userService.updateUserEmail(userId, updatedUser);
}

이렇게 각 HTTP 메소드는 그 용도에 따라 적절한 상황에서 사용됩니다.

이를 통해 클라이언트와 서버 간의 커뮤니케이션을 더욱 명확하고 이해하기 쉽게 만들 수 있습니다.


End

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.