// Developer · Debugging Reports

뉴스도 디버깅이 필요해

마주친 오류를 재현하고, 원인을 추적하고, 기록합니다. Java · Spring · DB · 실무 트러블슈팅.

debug — today.log
$ debug --trace "오늘의 뉴스"
> 헤드라인 파싱 중...
> 원인 추적: 근거 누락 · 출처 불명
> 패치 적용: 사실 확인 + 출처 보강
✓ RESOLVED
TOTAL
TODAY
YESTERDAY

Categories

웹개발/Spring

@RequestMapping @GetMapping 차이

자바를잡아2026. 7. 1. 09:00
반응형

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 변수명을 맞추는 것을 잊지 않으면 대부분의 매핑 문제는 피할 수 있다.

반응형