[백엔드] 스프링 어노테이션 정리

유승선 ·2022년 10월 19일
0

Spring 강의

목록 보기
7/12
post-thumbnail

스프링을 처음 접할때 어노테이션이라는 개념이 너무 생소해서 많이 당황 했었다. 아직까지도 모르는 어노테이션이 많지만 해당 글을 꾸준히 업데이트하며 스프링에서 많이 쓰이는 어노테이션 정리를 해야겠다.


요청 매핑

요청 매핑은 HTTP 요청과 관련된 어노테이션을 얘기하면서 개인적인 토이 프로젝트를 진행할때도 많이 쓰이는 어노테이션이다.

@ RequestMapping

가장 기본적으로 HTTP 요청을 처리하기 위해 사용되는 어노테이션이다. GET, POST 같은 모든 메서드를 허용하는 어노테이션이기도 하고 value 이후에 method 부분에 GET,POST,DELETE 등을 적어서 처리할 수 있다.

다만, 이 과정은 너무 길기 때문에 줄여서 아래와 같은 어노테이션으로 사용할 수 있다.

  1. @GetMapping
  2. @PostMapping
  3. @PutMapping
  4. @DeleteMapping
  5. @PatchMapping

@PathVariable

URL을 통해서 들어오는 과정은 여러가지로 변형될 수 있는데 만약에 UserA의 정보만 수정을 하고 싶을때는 /hello 뿐만 아니라 /hello/userA 이런식으로 URL을 타고 들어와야 한다.

이렇게 특정 id가 URL 에 포함되어 있는 구조를 Path 라고도 부르고 동적 웹사이트를 구현하기 위해서는 어노테이션 중 하나인 @PathVariable 을 알아야한다.

이런식으로 특정 URL에 자세한 정보를 알기 위해서 @PathVariable 을 써주었고 그 Variable 을 담을 수 있는 userId를 String 타입과 함께 정의한걸 확인 할 수 있다.

@RequestParam

보통 HTML을 통한 Form 을 입력하게 되면은 POST 같은 메서드로 요청 파라미터안에 값을 넣을 수 있다. 그리고 그 HTTP 요청안에 있는 값을 @RequestParam 을 통해서 변수에 저장을 하고 그 변수를 다른 코드에 쓸 수 있다는 장점이 있다.

@ModelAttribute

위에 설명한 @RequestParam 은 HTTP 요청안에 있는 값을 변수에 저장하고 따로 사용할 수 있게 해주는 장점을 가지고 있다. 그런데 실제 개발을 하면 요청 파라미터를 받은 후에 객체를 만들어서 그 값을 넣어주고 뷰에 넘겨주는 작업이 필요하다.

만약에 url 입력에서 ?username = hello&age = 20를 받으면 자동으로 hellData 객체가 생성되고 그 안에 정보들이 객체로 자동 등록된다.

원리는 다음과 같다.

  1. 해당 객체 생성
  2. 파라미터의 이름으로 @setter을 호출해서 값을 세팅해준다. (setUsername(), setAge() 등등)
  3. model.addAttribute() 코드르 자동 생성해주긴도 한다.

3번에 경우 모델을 직접 담아서 뷰로 넘겨야할때 유용하게 사용될 수 있다.

보통 타임리프 같은 뷰템플릿으로 우리가 객체를 저장하고 보내게 되는데 이 과정에서 Model에 addAttribute 후에 보내주는게 가장 정석적인 패턴이다. 그렇지만 @ModelAttribute안에 ("값") 을 넣은 후 뷰템플릿을 리턴해주면 그 이름 그대로 넘어간다.

위 그림과 같다. 즉, 훨씬 더 편리하게 사용할 수 있다는 뜻이다.

@RequestBody, @ResponseBody

앞서 RequestParam 과 ModelAttribute 를 알아봤지만 항상 HTTP 관련 요청을 이렇게만 처리하는것은 아니다.

API 를 사용해서 HTTP 메시지 바디를 통해서 데이터가 날아오는 경우 위에 파라미터를 처리하는 어노테이션들은 사용할 수 없다. 즉, HTTP 메세지 바디를 가져와서 처리해야 한다.

HTML FORM의 경우 POST로 body에 데이터가 담겨 오는데 이는 예외적으로 @RequestParam 으로 데이터를 담을 수 있다

가장 많이 사용되는 방법은 @RequestBody 와 @ResponseBody 다. 이 둘은 커플 처럼 사용하면 된다.

@ResponseBody : return을 응답 HTTP 바디에 넣어준다
@RequestBody: HTTP 메세지 바디를 변수에 넣어준다
@ResponseStatus: 응답의 상태를 표시해준다.

요청 파라미터 vs HTTP 메세지 바디

요청 파라미터를 조회하는 기능으로는 @RequestParam, 그리고 @ModelAttribute 가 있다.
-> GET 방식의 퀴리 파라미터, POST 방식의 HTML 폼 데이터 전송 방식에서 가장 많이 사용된다.

HTTP 메세지 바디를 직접 조회하는 기능: @RequestBody

@RestController

@Controller 같은 경우 반환값이 String 이면 View 이름으로 인식해서 View 템플릿으로 넘어가 랜더링을 한다. 반면에 @RestController은 반환값으로 View 템플릿으로 넘어가고 찾는게 아니라 HTTP 메세지 바디에 바로 입력한다.

@ResponseBody의 동작원리와 같지만 @ResponseBody를 모두 적용 시키려면 메서드에 하나 하나 다 붙혀야 하기에 클래스에 @ResponseBody를 붙히기도 하는데 통합적으로 @Controller 와 @ResponseBody를 전부 합친@RestController 을 붙혀서 사용한다.


요청 메세지 - JSON

일반적으로 URL 을 통해서 HTTP 메서드의 GET 과 POST 방식을 가져오는게 아닌, API 방식을 사용하게 된다면은 HTTP 바디에 내용을 담아서 보내게 된다. 그리고 사실상 이 방법은 전부 JSON 형식으로 보면된다. 단순 텍스트가 아니고 JSON 으로 요청을 처리하는 방법이다.

@ModelAttribute와 비슷하지만 @RequestBody로 HTTP 바디를 전부 받고 HelloData 객체를 생성해서 setter 을 사용해 세팅해준다. 이때 data 를 return 하는것을 볼 수 있는데 HTTP 메세지 컨버터가 작동이 되면서 JSON 형식으로 웹에 응답하게 된다.

만약에 @RequestBody 를 생략하게 된다면 @ModelAttribute 동작을 대신 수행 해주기 때문에 조심해야한다. 왜냐면은 @ModelAttribute 는 바디부가 아니라 파라미터부를 확인하기 때문이다.


응답 - 정적 리소스, 뷰 템플릿

개인적으로 또 궁금했던 부분이었고 꽤 많은 궁금증이 해결되었다. 리소스를 보관하는 곳이자 클래스패스의 시작 경로는 src/main/resources 다. 그리고 정적 리소스의 경로는 아래와 같다.

src/main/resources/static

정적인 리소스와 반대로, 동적인 HTML 을 만들고 뷰템플릿을 거쳐야 한다면 경로는 아래와 같다.

src/main/resources/templates

만약 해당 경로에 hello.html 파일을 만들어 놨다고 가정한다면,

return "hello" 를 하며 뷰 템플릿 경로에 있는 hello.html을 찾아서 model 정보를 랜더링 하는 서비스를 할것이다. 만약에 타임리프 라이브러리를 정상적으로 추가됐다면 스프링 부트가 필요한 빈들을 등록하고 다음과 같은 설정을 하기도 한다.

prefix 와 suffix가 있기 때문에 우리가 뷰 템플릿을 넣을때 길게 경로를 지정하지 않아도 알아서 붙혀주기때문에 굉장히 쉽게 개발을 할 수 있다.


Spring 어노테이션 (추후 정리 예정)


참고

스프링 블로그

profile
성장하는 사람

0개의 댓글