TIL ... 3주차 day 14 - Spring 5일차... 22.05.25

BYEONGMIN CHOI·2022년 5월 25일
0

TIL(Today I Learned)

목록 보기
10/24

* 프로그래밍개발을 배우고 있는 상황입니다. 잘못된 정보가 있을때에는 댓글로 잘못된 부분을 알려주시면 수정하겠습니다. 감사합니다.

과제를 제출하고 팀원들과 코드리뷰를 하며 발생한 이슈에 대해서 이야기해볼려고 합니다.

client의 비밀번호를 입력받아 게시글을 수정, 삭제 하는 api에서 비밀번호를 어떻게 전달받느냐에 대한 논의를 하였다.

수정의 경우 ajax에서 url을 통해 id와 data를 전달하여 서버에서 @PathVariable Long id 로 id를 전달 받고 @RequseBody 로 data를 Java의 형식으로 전달받아 처리한다는 것은 의견이 일치하였다.

하지만, 삭제 요청의 경우 @RequestParam 을 사용하여 password를 전달 받는 형식도 가능할 것 같다는 의견이 나왔고 이 부분에 대해 의문이 생겼었다.

@RequestBody

  • 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body 내용을 Java Object로 변환시켜주는 역할을 한다.

  • Body가 존재하지 않는 HTTP Get 메소드에 @RequestBody를 활용하려고 한다면 에러가 발생

  • @RequestBoy로 전달받은 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverte를 통해 Java 객체로 변환한다.

  • 메시지가 변환되는 과정에서 객체의 기본 생성자를 통해 객체를 생성하고, 내부적으로 Reflection을 사용해 값을 할당하므로 @RequsetBody에는 값을 주입하기 위한 생성자나 Setter가 필요없다.

@RequsetParam

  • 1개의 HTTP 요청 파라미터를 받기 위해서 사용

  • @RequestParam은 필수 여부가 true이기 때문에 기본적으로 반드시 해당 파라미터가 전송되어야 한다.

  • 해당 파라미터가 전송되지 않으면 400 Error를 유발

  • 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해둘 수 있으며 해당 Parameter를 사용하지 않고 요청을 보낼 경우에 default로 받을 값을 defaultValue 옵션을 통해 설정할 수도 있다.

Web

Requser 객체는 API를 컨트롤하기 위한 메소드로 아래의 세가지를 담고있다.

  • param
  • query
  • body
  • req.param

    \rightarrow 주소에 포함된 변수를 담는다. 예) https://naver.com/post/1234, 1234를 변수로 담는다.
    \rightarrow 서버에서 변수를 받기위해 @PathVariable 사용
    \rightarrow resource를 식별해야하는 상황에서 더 적합
  • req.query

    \rightarrow 주소의 ? 이후의 변수를 담는다. 예) https://naver.com/post?post_id=1234&key=value
    \rightarrow &으로 여러개의 데이터를 연결하여 전달할 수 있다.
    \rightarrow 서버에서 @RequstParam 으로 전달받을 수 있다.
    \rightarrow 정렬이나 필터링을 해야하는 상황에서 더 적합
  • req.body

    \rightarrow XML, JSON, Multi Form 등의 데이터를 담는다. 주소에서 확인할 수 없다.
    \rightarrow 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있다. 민감한 데이터의 경우 반드시 암호화해 전송해야한다.

언제 사용하면 좋을까?

일반적으로 우리가 어떤 자원(데이터)의 위치를 특정해서 보여줘야 할 경우 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으로 전달하면 주소창에 명시되지 않는가? 이에 대한 의문으로 조사한 내용이였습니다.

profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글