헷갈렸던 이유
둘 간을 맨날 헷갈렸던 이유, 맨날 찾아봤던 이유는 URL을 통해 어떤 내용을 전달했기 때문이다. 아래와 같이 말이다.
@GetMapping("/member/{memberId}")
public MemberResponseDto showMember(@PathVariable Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
@GetMapping("/member")
public MemberResponseDto showMember2(@RequestParam Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
둘 간의 차이를 명확하지 이해하지 못해서 생긴 문제인 것 같아서 이 부분을 정리하고자 한다.
차이점
@GetMapping("/member/{memberId}")
public MemberResponseDto showMember(@PathVariable Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
위와 같이 PathVariable 을 사용할 경우
해당 기능을 수행하기 위한 URL 형태는
http://localhost:8080/api/member/1
이렇게 된다.
@GetMapping("/member")
public MemberResponseDto showMember2(@RequestParam Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
위 와 같이 QueryParameter를 사용할 경우
해당 기능을 수행하기 위한 URL 형태는
http://localhost:8080/api/member?memberId=1
이렇게 된다.
Resource 를 식별 하여 무언가 수행하고 싶다.==> PathVariable 을 사용함
정렬,필터링 기능을 하고 싶다.==> 쿼리 파라미터를 사용함
출처:https://ryan-han.com/post/translated/pathvariable_queryparam/
출처:https://medium.com/@fullsour/when-should-you-use-path-variable-and-query-parameter-a346790e8a6d
이에 따르면
위 예와 같이 Member라는 정보를 보여주거나 수정하거나 삭제하거나 업데이트 (CRUD)를 수행할 떄는
@GetMapping("/member/{memberId}")
public MemberResponseDto showMember(@PathVariable Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
이렇게 PathVariable을 쓰는게 맞다는 이야기이고
만약 member의 이름에 대해 필터링이 필요한 경우에는 아래와 같이
@GetMapping("/member")
public MemberResponseDto showMember2(@RequestParam Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
http://localhost:8080/api/member?name=jinu
이런 형태의 query parameter를 사용한다.
의문점
왜 굳이 위 원칙을 지켜야 하는가?
@GetMapping("/member/{memberId}")
public MemberResponseDto showMember(@PathVariable Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
@GetMapping("/member")
public MemberResponseDto showMember2(@RequestParam Long memberId){
return memberTeamService.memberResponseDto(memberId);
}
위에서 보듯 쿼리 파라미터나 PathVariable이나 기능상 다른 것도 없는데
왜 굳이 위 원칙을 지키는가?
이유?
여기서 부터 나오는 내용은 수정가능성이 있다. ㅋㅋㅋ 즉 확신할 수 없다.(미안행)
.../member/1
과
.../member/memberId=1
중 어느 것이 직관성이 높은가?
일단 무조건 전자가 직관성이 높다.
위 링크를 보면
11분 25초에
Rest를 구성하는 스타일 중 UNIFORM INTERFACE 라는게 있다!
또 그 UNIFORM INTERFACE 안에는 Identification Of Resource 라는게 있는데
이것은 자원 식별을 의미한다. 즉 PathVariable 을 통한 것이 더 REST 스타일에 맞는다는 의미인 것 같다.
일종의 약속 같은 거라 맞고 틀리고 특별한 장점이 있고 이런 거 없음.
실제 현업에서 저렇게 전자로 하지 않는 경우도 많음.
찾아보니 이런 내용도 있었다.
화잇팅~~