제목이 무조건 알자! 스프링 어노테이션! 인 이유는,, 지금 Spring 쪼랩인 나에게 실습 중 자주나오는, 앞으로도 자주 사용할 것 같은 어노테이션은 잘 공부해놔야 한다는 생각에 지어진 제목이다. 🙄
우선 지금 내 실력의 위치에서 공부할 어노테이션은 다음과 같다 (앞으로도 수 없이 추가되겠지만,,)
시작해보자.
우리는 비동기 통신을 주로 사용한다. 비동기 처리는 앞선 작업의 완료를 기다리지 않고 다른 작업을 시작하는 방식이다.
막연히 앞선일을 기다리고 있는건 효율적이지 않기 때문에 우리는 요즘 더 비동기 처리에 대한 고민을 한다.
이 비동기처리에 사용되는 어노테이션이 바로 @RequestBody
이다.
클라이언트와 서버가 통신을 한다고 할때,
서버로 요청을 보내는 것을 request
, 서버로부터 응답을 받는것을 response
라고 한다.
우리는 데이터를 담아서 요청메시지, 응답 메시지를 보내게 되는데 이때 필요한 내용이 requestBody
와 responseBody
이다.
오늘 수업시간에 우스갯소리로 이런 말이 나왔다.
"개발자 밈에서 백앤드 개발자는 json 상하차와 같다"
이 말에서 알 수 있듯 우리는 실제로 json 타입의 데이터를 많이 다루게 된다.
하물며 방금 언급한 request/response body에 담기는 데이터도 json의 형태가 많다.
두 어노테이션은 명시를 하게 되면 MessageConverter를 통해 데이터를 변환하는 과정을 하게 된다.
클라이언트에서 서버로 json 형식의 데이터를 요청했을때, java에서는 json 형식의 요청 데이터를 받기위해 object 객체로 변환하는 과정을 거쳐야한다.
반대 동작도 마찬가지로, 요청에 대한 응답 데이터를 클라이언트로 다시 보낼때, object 형식의 객체를 json으로 변환하는 과정이 필요하는데, 이부분을 해당 어노테이션을 붙임으로 대신 처리해주는거임!
우리는 서버 간 http 통신을 하기에, httprequest의 본문인 requestBody의 내용을 자바 객체로 매핑 -> @RequestBody
반대로, 자바객체를 httpResponse의 본문인 responseBody으로 매핑 -> @ResponseBody
우리가 조회를 하기위해 사용하는 GET 메서드의 요청 시 URL 형식의 매개변수로 전달되기 때문에, Requestbody 어노테이션을 사용할 수 없다. 그렇기에 다음으로 나올 @PathVariable이나 @RequestParam을 사용하게 된다.
실습을 하는 도중 Controller 작성을 할때, Controller와 RestController의 차이점이 궁금했는데, 스프링부트 관련서적과 강사님이 말씀해주신 내용 덕분에 차이를 알게 되었다.
@RestController 어노테이션을 따라 올라가게되면,
다음과같이 @Controller와 @ResponseBody가 같이 있는걸 알 수 있다.
그렇기에 @Controller 대신 @RestController를 사용했다면 @ResponseBody를 명시하지 않아도 위에서 말한 자바객체를 httpResponse의 본문인 responseBody으로 매핑
하는 과정을 할 수 있는 것이다.
+그럼 Controller를 따라 올라가면 뭐가 나올까? @ResponseBody가 있고 없고의 차이일까?
그렇다. 오직 그 차이만 존재한다. (내가,,, 볼때는 그렇다)
위에서 잠깐 나온 PathVariable에 대해 알아보자
쉽게 말해, 초록색으로 적힌 경로 "api/articles/{id}"
부분에 {id}를 처리해주기 위한 어노테이션이다. 이 부분을 경로 변수
라고 하는데, 경로 안에서 변할 수 있는 부분을 말한다.
URL 경로에서 계속해서 변하는 부분 (=변수)을 추출해서 매개변수에 담아주는 역할을 해준다.
가장 큰 예시로 블로그 글이 있는데, 각각의 블로그 글들은 크게 변수를 하나씩 늘려주며 다른 화면이 나온다. 이 다른 화면을 보여주는 부분은 모두 @PathVariable에서 시작된다.
규칙이라 할것도 없지만, path에 적힌 {변수이름_A}
와 @PathVariable String 변수이름_A
처럼 같은 변수는 이름을 맞춰줘야 한다.
혹시 메소드에서 변수명을 다르게 사용하고싶다면 @PathVariable("변수이름_A") String A
처럼 사용하면 된다~
추가로, path에 변수가 2개 이상인경우 @PathVariable을 다중으로 사용 할 수도 있다.
앞서 말한 @PathVariable과 비슷한 역할을 하는 어노테이션이다. 🤔
두 어노테이션 모두 uri를 통해 전달된 변수를 파라미터로 사용하는 역할
을 한다.
우리는 uri를 통해 웹사이트에 접속할 때, 두 가지의 방식으로 접속 할 수 있다.
http://localhost:8080/article/1
http://localhost:8080/article?page=1&num=1
?
가 url안에서 사용되면 ?
뒤에는 쿼리 스트링
이 오게된다.
여기서 쿼리 스트링
은 웹서버에 요청된 자원에 대한 매개변수를 전달하는데 사용된다.
일반적으로 키,값쌍으로 이루어져있으며 =,와 &를 사용한다
예시로 다음과 같이 쓰이게되면, q라는 변수에는 apple, category라는 변수에는 fruits가 들어가는 동작이다.
https://www.example.com/search?q=apple&category=fruits
위 예시 중 1번의 경우 @PathVariable을 이용한 형태를 이용한 데이터 추출이 적합하고, 2번의 경우 @RequestParam 어노테이션을 이용한 데이터 추출이 적합하다.
정리하면 아래와 같다 ! 👍
@PathVariable 어노테이션은 URI 템플릿에서 경로 변수의 값을 바인딩.
@RequestParam 어노테이션은 HTTP 요청 파라마티의 값을 바인딩.
매개변수가 한 개 이상인 경우 @RequestParam이 적합한 형태일 수 있다! 👍
대충 저 자리는 함수에서 반환된 값의 형태가 오는 자리이다.
그렇다면 ResponseEntity는 무엇일까?
해당 클래스에는 Http Request / Response에 들어가는 HttpHeader, HttpBody 정보를 포함하고 있다.
이 HttpEntity를 상속받는 클래스가 바로 RequestEntity와 ResponseEntity 클래스이다.
해당 클래스는 Http 상태 코드를 가지고 있다.
우리는 이 ResponseEntity의 ok() 메소드를 통해 http응답과 함께 객체를 반환할 수 있다.
그럼 다시 이 코드로 돌아와서 해당 메소드는 어떤 역할을 하는가?
article 객체에 blogService.findById()의 값을 넣고 응답코드와 함께 article 클래스에 toResponse() 함수를 반환하는 역할을 한다!
해당 역할을 넣어주기위해 우리는 showOneArticle 메소드의 반환형을 ResponseEntity로 한것!
스프링 부트를 시작하고,,, 알지도 못하면서 따라치는 김정용 발견,,,
긍정적으로 생각하면 공부할게 많아서 오히려 좋다고 생각한다.
어줍짢게 알고 다 안다고 생각하는 것보다 내가 부족하고 어떤 부분을 보완해야하는지 아는게 더 좋다.😂
어제보다 나은 오늘을 위해 오늘도 화이팅 !!💪
정리 굿입니다 !!
경로변수랑 쿼리파라미터 늘 헷갈리는데 쿼리파라미터의 경우 회차별 에피소드가 누적되는 네이버 웹툰의 url을 뜯어보면 참 머리속에 잘 남더라구요
https://comic.naver.com/webtoon/list?titleId=796152 (특정웹툰 홈)
https://comic.naver.com/webtoon/detail?titleId=796152&no=86&week=tue (특정웹툰의 상세페이지 - 에피소드별 조회)
화이또 !!