Spring MVC

@PathVariable과 @RequestParam의 차이에 대한 공부

beginner-development 2025. 2. 20. 22:46

게시판 프로젝트를 진행하면서 가장 헷갈렸던 부분을 고르라고 한다면, Controller부분을 작성할 때 사용되었던 @PathVariable과 @RequestParam이었다. 게시판 프로젝트를 시작하고 Controller를 처음 만들었을 때, 게시글 삭제 부분에서 @PathVariable을 사용했다가 삭제가 이루어지지 않는 것을 보고 '왜 되지 않지? 분명 게시글의 id를 받아와서 삭제 처리가 되어야되는데?'라는 생각으로(이 때는 수정, 상세 문단에서 @PathVariable을 써서 삭제도 당연히 그걸써야되는줄 알았다.)한시간을 넘게 고민을 했었다. 그러던 중 @PathVariable을 제외하고 @RequestParam도 있다는 것을 깨닫고(지금 생각하면 왜 @RequestParam을 제외했는지 이해가 되지 않는다.) @RequestParam을 적용해 봤더니 삭제 부분이 잘 동작하는 것을 확인할 수 있었다. 그래서 나는 두 어노테이션에 대한 이해가 부족함을 인지할 수 있었고 게시판 프로젝트를 완성하고 난 뒤, 두 어노테이션에 대해 공부했다. 오늘은 그 공부한 내용을 정리해 보고자 한다.

 

@PathVariable과 @RequestParam

두 어노테이션 모두 URL을 통해 값을 파라미터로 받아오는 역할을 한다는 것은 동일하다. 즉, 우리가 URL을 입력했을 때 들어가는 데이터를 Controller의 메소드 파라미터와 바인딩하는 역할을 하는 것이다.

그럼 이 두 어노테이션의 차이가 뭐길래 게시판 삭제파트에서 에러가 나는 것일까? 두 어노테이션은

 

@PathVariable

  • URL 상에서 / 뒤의 변수값을 표현하는데 쓰인다.(예 : https://beginner-development.tistory.com/6의 6부분)
  • 기본적으로 경로 변수는 반드시 값을 가져야하고, 값이 없는 경우 404 오류가 발생한다.
  • GetMapping이나 PostMapping에서 {}로 감싸여 있는 값을 나타낸다.
  • RESTful API에서 자원의 식별자를 URL 경로의 일부로 포함시킬 때 주로 사용된다.
  • PathVariable은 1개의 데이터만 받아올 수 있다.

@RequestParam

  • HTTP요청 파라미터를 메서드 매개변수에 바인딩할 때 사용한다. 주로 쿼리 스트링(사용자가 입력 데이터를 전달하는 방법 중 하나) 또는 폼 데이터(html에서 <form>태그에 실려 전송되는 데이터)에서 파라미터를 추출할 때 사용된다.
  • URL 상에선 ?뒤에 데이터가 붙어져 쓰인다.(예 : https://beginner-development.tistory.com/manage/newpost/?type=post&return의 ?뒷부분)
  • 기본값을 제공하지 않으면 기본값 설정이 가능하다. 파라미터가 필수가 아닐 경우, required 속성을 false로 설정하면 된다.
  • @RequestParam에서 사용할 수 있는 속성은 name, value, required, defaultValue가 있다.(name, value : 쿼리 파라미터와 메소드의 파라미터의 이름이 다른 경우 바인딩해준다. required : 파라미터 입력 설정(기본값 : true) defaultValue : 파라미터가 입력되지 않은 경우의 기본값을 설정할 수 있다.)
  • RequestParam은 여러개의 데이터를 받아올 수 있다.

위와 같은 차이가 있다. 내가 생각하기에 가장 큰 차이점은 1개의 데이터만 받아올 수 있는가, 여러개의 데이터를 받아올 수 있는가이다.

즉, 게시글 삭제 부분에서 삭제를 하려면 게시글 id, 제목, 내용을 다 불러와서 처리를 해야했기에 @PathVariable을 사용하면 아무런 동작없이 오류가 난 것이다.