@Pathvariable vs @RequestParam

이진우·2023년 11월 18일
0

스프링 학습

목록 보기
19/41

헷갈렸던 이유

둘 간을 맨날 헷갈렸던 이유, 맨날 찾아봤던 이유는 URL을 통해 어떤 내용을 전달했기 때문이다. 아래와 같이 말이다.

Pathvariable 사용

 @GetMapping("/member/{memberId}")
    public MemberResponseDto showMember(@PathVariable Long memberId){
        return memberTeamService.memberResponseDto(memberId);
    }

QueryParameter 사용

@GetMapping("/member")
   public MemberResponseDto showMember2(@RequestParam Long memberId){
       return memberTeamService.memberResponseDto(memberId);
   }

둘 간의 차이를 명확하지 이해하지 못해서 생긴 문제인 것 같아서 이 부분을 정리하고자 한다.

차이점

형태상의 차이점

PathVariable

@GetMapping("/member/{memberId}")
  public MemberResponseDto showMember(@PathVariable Long memberId){
      return memberTeamService.memberResponseDto(memberId);
  }
  

위와 같이 PathVariable 을 사용할 경우
해당 기능을 수행하기 위한 URL 형태는

http://localhost:8080/api/member/1

이렇게 된다.

QueryParameter

@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)를 수행할 떄는

PathVariable
@GetMapping("/member/{memberId}")
  public MemberResponseDto showMember(@PathVariable Long memberId){
      return memberTeamService.memberResponseDto(memberId);
  }
  

이렇게 PathVariable을 쓰는게 맞다는 이야기이고

만약 member의 이름에 대해 필터링이 필요한 경우에는 아래와 같이

QueryParameter
@GetMapping("/member")
  public MemberResponseDto showMember2(@RequestParam Long memberId){
      return memberTeamService.memberResponseDto(memberId);
  }
http://localhost:8080/api/member?name=jinu

이런 형태의 query parameter를 사용한다.

의문점

왜 굳이 위 원칙을 지켜야 하는가?

Pathvariable 사용

 @GetMapping("/member/{memberId}")
    public MemberResponseDto showMember(@PathVariable Long memberId){
        return memberTeamService.memberResponseDto(memberId);
    }

QueryParameter 사용

@GetMapping("/member")
   public MemberResponseDto showMember2(@RequestParam Long memberId){
       return memberTeamService.memberResponseDto(memberId);
   }

위에서 보듯 쿼리 파라미터나 PathVariable이나 기능상 다른 것도 없는데
왜 굳이 위 원칙을 지키는가?

이유?

여기서 부터 나오는 내용은 수정가능성이 있다. ㅋㅋㅋ 즉 확신할 수 없다.(미안행)

직관성론

위에서 예를 든 것을 보자.
.../member/1

.../member/memberId=1

중 어느 것이 직관성이 높은가?

일단 무조건 전자가 직관성이 높다.

REST API 론

https://www.youtube.com/watch?v=RP_f5dMoHFc&t=2219s

위 링크를 보면

11분 25초에
Rest를 구성하는 스타일UNIFORM INTERFACE 라는게 있다!

또 그 UNIFORM INTERFACE 안에는 Identification Of Resource 라는게 있는데
이것은 자원 식별을 의미한다. 즉 PathVariable 을 통한 것이 더 REST 스타일에 맞는다는 의미인 것 같다.

이런거 의미없다 론

일종의 약속 같은 거라 맞고 틀리고 특별한 장점이 있고 이런 거 없음.
실제 현업에서 저렇게 전자로 하지 않는 경우도 많음.

찾아보니 이런 내용도 있었다.

profile
기록을 통해 실력을 쌓아가자

2개의 댓글

comment-user-thumbnail
2023년 11월 21일

화잇팅~~

1개의 답글