Categories
웹개발/Spring
@RequestMapping @GetMapping 차이
URL 매핑, 어떤 어노테이션을 쓰나
Spring MVC에서 특정 URL 요청을 어떤 메서드가 처리할지 연결하는 것이 URL 매핑이다. 이때 쓰는 대표 어노테이션이 @RequestMapping과 @GetMapping이다. @RequestMapping @GetMapping 차이를 한 줄로 정리하면, @RequestMapping은 모든 HTTP 메서드를 다룰 수 있는 범용 어노테이션이고, @GetMapping은 그중 GET 요청만 처리하도록 줄여 쓴 축약형이다.
예전 코드는 @RequestMapping(method = RequestMethod.GET)처럼 길게 썼는데, Spring 4.3부터 @GetMapping, @PostMapping 같은 축약형이 생기면서 훨씬 간결해졌다. 공공 SI 레거시에서는 긴 @RequestMapping 형태를, 비교적 최근 코드에서는 축약형을 자주 보게 된다.
두 어노테이션 비교
| 구분 | @RequestMapping | @GetMapping 등 축약형 |
|---|---|---|
| 처리 범위 | 모든 HTTP 메서드(미지정 시) | 특정 메서드(Get/Post 등) |
| HTTP 메서드 지정 | method 속성으로 지정 | 어노테이션 자체가 메서드 |
| 코드 길이 | 길다 | 짧다 |
| 클래스 레벨 사용 | 가능(공통 경로) | 권장 안 함(주로 메서드) |
| 도입 시점 | 초기부터 | Spring 4.3+ |
| 주 용도 | 공통 경로, 범용 | 메서드별 명확한 매핑 |
기본 매핑 방법
1. @RequestMapping으로 매핑하기
가장 기본 형태다. value(또는 path)에 URL을, method에 HTTP 메서드를 지정한다.
@Controller
public class MemberController {
// GET /member/list 요청을 이 메서드가 처리
@RequestMapping(value = "/member/list", method = RequestMethod.GET)
public String list() {
return "member/list";
}
}
method를 지정하지 않으면 GET, POST 등 모든 메서드 요청을 받는다. 의도치 않게 POST까지 받게 될 수 있으므로, 화면 조회라면 GET을 명시하는 편이 안전하다.
2. @GetMapping으로 줄여 쓰기
위 코드는 @GetMapping으로 짧게 바꿀 수 있다. 의미는 동일하다.
@Controller
public class MemberController {
// 위 @RequestMapping(GET)과 같은 동작
@GetMapping("/member/list")
public String list() {
return "member/list";
}
// 등록 처리: POST
@PostMapping("/member/save")
public String save(MemberVO member) {
memberService.save(member);
return "redirect:/member/list";
}
}
축약형은 어노테이션 이름에 HTTP 메서드가 드러나서 코드만 봐도 무슨 요청인지 알기 쉽다. GET은 조회, POST는 등록/처리에 쓰는 식으로 메서드를 구분하면 의도가 명확해진다.
클래스와 메서드 경로 조합
컨트롤러 클래스에 @RequestMapping으로 공통 경로(prefix)를 두고, 각 메서드에 세부 경로를 붙이면 경로가 합쳐진다. 같은 도메인의 URL을 묶어 관리할 때 유용하다.
@Controller
@RequestMapping("/member") // 클래스 공통 경로
public class MemberController {
@GetMapping("/list") // 최종 경로: /member/list
public String list() { ... }
@GetMapping("/{id}") // 최종 경로: /member/{id}
public String detail(@PathVariable String id, Model model) {
model.addAttribute("member", memberService.findById(id));
return "member/detail";
}
@PostMapping("/save") // 최종 경로: /member/save
public String save(MemberVO member) { ... }
}
클래스의 /member와 메서드의 /list가 합쳐져 /member/list가 된다. {id}처럼 중괄호를 쓰면 URL 일부를 변수로 받는데, 이를 @PathVariable로 메서드 파라미터에 연결한다. REST 스타일 URL에서 자주 쓰는 형태다.
매핑이 안 되거나 충돌할 때
1. 404가 나는 경우
매핑했는데 404가 난다면 몇 가지를 본다. 클래스 공통 경로와 메서드 경로를 합친 최종 URL이 실제 요청과 맞는지, 슬래시(/) 위치가 어긋나지 않았는지, 컨트롤러가 컴포넌트 스캔 범위 안에 있는지 확인한다. HTTP 메서드도 봐야 한다. @GetMapping인데 POST로 요청하면 매핑을 못 찾는다.
// 흔한 실수: 메서드 경로 앞 슬래시 혼동
@RequestMapping("/member") // 클래스
@GetMapping("list") // 슬래시 없음 → 환경에 따라 의도와 달라질 수 있음
// → 명확하게 "/list" 로 적는 편이 혼선이 적다
2. 매핑 충돌(Ambiguous mapping)
서로 다른 메서드가 같은 URL + 같은 HTTP 메서드 조합을 가지면 기동 시점에 충돌 오류가 난다. 예를 들어 두 메서드가 모두 GET /member/list를 매핑하면 스프링이 어느 쪽을 부를지 정할 수 없다.
// 충돌 예: 같은 GET /member/list 가 둘
@GetMapping("/member/list")
public String list1() { ... }
@GetMapping("/member/list") // Ambiguous mapping 오류
public String list2() { ... }
기동 로그에 Ambiguous mapping 메시지가 보이면 중복된 URL+메서드 조합을 찾아 하나로 정리한다. 경로 변수(/{id})와 고정 경로(/list)가 애매하게 겹치는 경우에도 주의가 필요하다.
실무에서 자주 하는 실수
- method를 지정하지 않은 @RequestMapping이 GET·POST를 모두 받아, 의도치 않은 요청까지 처리되는 경우.
- 클래스 공통 경로와 메서드 경로의 슬래시를 혼동해 최종 URL이 어긋나는 경우.
- @GetMapping에 POST로 요청(또는 반대)해 404가 나는데 경로만 들여다보는 경우. HTTP 메서드를 함께 확인한다.
- 같은 URL+메서드를 두 곳에 매핑해 기동 시 Ambiguous mapping이 나는 경우.
- @PathVariable 변수명과 URL의
{}이름이 달라 값이 안 들어오는 경우.
FAQ
Q1. @RequestMapping과 @GetMapping 중 무엇을 써야 하나요?
메서드별 매핑은 의미가 명확한 @GetMapping·@PostMapping 등 축약형을 권장한다. 클래스 레벨 공통 경로에는 @RequestMapping을 쓴다.
Q2. @RequestMapping에 method를 안 적으면 어떻게 되나요?
GET, POST 등 모든 HTTP 메서드 요청을 받는다. 의도치 않은 요청까지 처리될 수 있으니 메서드를 명시하는 편이 안전하다.
Q3. 매핑했는데 404가 납니다.
클래스+메서드 경로를 합친 최종 URL이 맞는지, HTTP 메서드가 일치하는지, 컨트롤러가 컴포넌트 스캔 범위 안인지 확인한다.
Q4. Ambiguous mapping 오류는 왜 나나요?
같은 URL과 같은 HTTP 메서드 조합이 두 개 이상 매핑됐을 때 난다. 중복을 찾아 하나로 정리한다.
Q5. value와 path 속성은 뭐가 다른가요?
같은 역할이다. @RequestMapping(value="/x")와 @RequestMapping(path="/x")는 동일하게 URL을 지정한다.
정리
@RequestMapping @GetMapping 차이는 "범용이냐 특정 메서드 전용이냐"로 정리된다. @RequestMapping은 method 속성으로 모든 HTTP 메서드를 다룰 수 있는 범용 어노테이션이고, @GetMapping·@PostMapping은 특정 메서드만 처리하도록 줄인 축약형이다. 실무에서는 클래스 레벨 공통 경로에 @RequestMapping을, 메서드별 매핑에 축약형을 쓰는 조합이 깔끔하다. 매핑이 안 되면 최종 URL과 HTTP 메서드 일치, 컴포넌트 스캔 범위를 먼저 보고, 기동 시 Ambiguous mapping이 나면 중복된 URL+메서드 조합을 정리한다. 경로 변수는 {} 이름과 @PathVariable 변수명을 맞추는 것을 잊지 않으면 대부분의 매핑 문제는 피할 수 있다.
'웹개발 > Spring' 카테고리의 다른 글
| Spring @RequestParam으로 요청 파라미터 받기 정리 (0) | 2026.07.02 |
|---|---|
| Spring *.do URL 패턴 정리, 공공 프로젝트는 왜 .do로 끝날까 (0) | 2026.07.02 |
| @Controller와 @RestController 차이 JSP와 JSON으로 정리 (0) | 2026.07.01 |
| Spring IoC와 DI 개념 SI 신입을 위한 10분 정리 (0) | 2026.06.30 |
| Spring Framework vs Spring Boot 차이와 공공 SI에서의 선택 (0) | 2026.06.30 |