* 프로그래밍개발을 배우고 있는 상황입니다. 잘못된 정보가 있을때에는 댓글로 잘못된 부분을 알려주시면 수정하겠습니다. 감사합니다.
과제를 제출하고 팀원들과 코드리뷰를 하며 발생한 이슈에 대해서 이야기해볼려고 합니다.
client의 비밀번호를 입력받아 게시글을 수정, 삭제 하는 api에서 비밀번호를 어떻게 전달받느냐에 대한 논의를 하였다.
수정의 경우 ajax에서 url을 통해 id와 data를 전달하여 서버에서 @PathVariable Long id
로 id를 전달 받고 @RequseBody
로 data를 Java의 형식으로 전달받아 처리한다는 것은 의견이 일치하였다.
하지만, 삭제 요청의 경우 @RequestParam
을 사용하여 password를 전달 받는 형식도 가능할 것 같다는 의견이 나왔고 이 부분에 대해 의문이 생겼었다.
- 클라이언트가 전송하는
Json(application/json) 형태
의 HTTP Body 내용을Java Object
로 변환시켜주는 역할을 한다.
- Body가 존재하지 않는 HTTP Get 메소드에 @RequestBody를 활용하려고 한다면 에러가 발생
- @RequestBoy로 전달받은 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverte를 통해 Java 객체로 변환한다.
- 메시지가 변환되는 과정에서 객체의 기본 생성자를 통해 객체를 생성하고, 내부적으로 Reflection을 사용해 값을 할당하므로 @RequsetBody에는 값을 주입하기 위한 생성자나 Setter가 필요없다.
- 1개의 HTTP 요청 파라미터를 받기 위해서 사용
- @RequestParam은 필수 여부가 true이기 때문에 기본적으로 반드시 해당 파라미터가 전송되어야 한다.
- 해당 파라미터가 전송되지 않으면 400 Error를 유발
- 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해둘 수 있으며 해당 Parameter를 사용하지 않고 요청을 보낼 경우에 default로 받을 값을 defaultValue 옵션을 통해 설정할 수도 있다.
Requser 객체는 API를 컨트롤하기 위한 메소드로 아래의 세가지를 담고있다.
- param
- query
- body
@PathVariable
사용@RequstParam
으로 전달받을 수 있다.일반적으로 우리가 어떤 자원(데이터)의 위치를 특정해서 보여줘야 할 경우 Path variable을 쓰고, 정렬하거나 필터해서 보여줘야 할 경우에 Query parameter를 쓴다. 아래가 바로 그렇게 적용한 사례이다.
/users // Fetch a list of users
/users?occupation=programer // Fetch a list of programer user
/users/123 // Fetch a user who has id 123
비밀번호의 경우 query나 param으로 전달하면 주소창에 명시되지 않는가? 이에 대한 의문으로 조사한 내용이였습니다.