인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김이나님의 프로필 이미지

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

스프링 MVC - 시작하기

SpringMemberFormControllerV1 @Component + @RequestMapping 시 404 에러

작성

·

47

0

GPT는 Spring MVC의 표준 동작은 원래@RequestMapping만으로는 Handler로 등록하지 않는다고 하던데 뭐가 맞는건가요?

 

선생님의 설명 중 다음 두 가지를 분리해서 봐야 합니다.

  1. @Controller의 기능에 대한 설명:

    • "@Controller: 스프링이 자동으로 스프링 빈으로 등록한다. (내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 됨)" - 이 부분은 정확합니다.@Controller 어노테이션 자체에 @Component 메타 어노테이션이 붙어 있기 때문에, @Controller가 붙은 클래스는 컴포넌트 스캔 대상이 되어 스프링 빈으로 자동 등록됩니다. @Controller@Component의 역할을 포함합니다.

    • "@Controller: 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식한다." - 이 부분도 정확합니다.@Controller는 단순히 빈으로 등록되는 것을 넘어, Spring MVC 프레임워크에게 이 빈이 웹 요청을 처리하는 "컨트롤러"임을 알려주는 표식 역할을 합니다.

  2. RequestMappingHandlerMapping의 동작 방식에 대한 설명:

    • "RequestMappingHandlerMapping 은 스프링 빈 중에서 @RequestMapping 또는 @Controller 가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식한다." - 이 부분은 표준 Spring MVC의 기본 동작 설명으로서는 정확하지 않습니다.

정리하면:

  • "@Controller@Component 기능을 포함하며, 추가적으로 Spring MVC에서 컨트롤러로 인식하게 하는 마커 역할도 한다." => 이 설명은 맞습니다.

  • "RequestMappingHandlerMapping이 클래스 레벨에 @RequestMapping만 있어도 핸들러로 인식한다." => 이 설명은 표준 Spring MVC의 기본 동작과는 다릅니다. 기본적으로 RequestMappingHandlerMapping@Controller 또는 @RestController가 붙은 클래스를 우선적으로 찾습니다.

따라서 사용자님께서 경험하신 것, 즉 @Component@RequestMapping만으로는 기본 설정에서 컨트롤러로 인식되지 않아 Whitelabel Error가 뜨는 것이 표준 Spring MVC의 기본 동작입니다.

선생님의 설명 중 @Controller의 역할 설명 자체는 맞지만, RequestMappingHandlerMapping이 스캔하는 대상에 대한 설명 (클래스 레벨 @RequestMapping만 있어도 된다는 부분)이 기본 설정 기준으로는 틀린 설명이 됩니다. 그리고 그 틀린 설명 때문에 @Component + @RequestMapping 코드가 동일하게 동작할 것이라는 결론도 기본 설정 환경에서는 성립하지 않는 것입니다.

선생님의 데모가 실제 동작했다면, 그것은 표준 기본 설정이 아닌 특정 환경 설정 (예: RequestMappingHandlerMapping의 동작 방식을 변경하는 사용자 정의 설정) 때문일 가능성이 매우 높습니다.

결론적으로 사용자님의 경험이 맞고, 해당 환경에서는 기본 설정대로 동작한 것입니다. 선생님의 설명 중 RequestMappingHandlerMapping이 스캔하는 대상에 대한 부분은 일반적인 상황에서는 해당되지 않는 설명이라고 이해하시면 됩니다.

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 김이나님

강의 메뉴얼에 있는 다음 내용을 참고해주세요 🙂

주의! - 스프링 3.0 이상

스프링 부트 3.0(스프링 프레임워크 6.0)부터는 클래스 레벨에 @RequestMapping이 있어도 스프링 컨트롤러로 인식하지 않는다. 오직 @Controller가 있어야 스프링 컨트롤러로 인식한다. 참고로 @RestController는 해당 애노테이션 내부에 @Controller를 포함하고 있으므로 인식 된다. 따라서 @Controller가 없는 위의 두 코드는 스프링 컨트롤러로 인식되지 않는다. RequestMappingHandlerMapping@RequestMapping는 이제 인식하지 않고, Controller만 인식한다.)

 

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 김이나님.

Spring MVC에서 @Component@RequestMapping만으로는 핸들러로 인식되지 않는다는 점에 대해 정확히 이해하고 계십니다. 일반적으로 Spring MVC에서는 클래스에 @Controller 또는 @RestController 어노테이션이 붙어 있어야 해당 클래스가 컨트롤러로 동작합니다. @Controller 어노테이션은 @Component 역할을 포함하며, Spring MVC에서 웹 요청을 처리할 수 있도록 하는 추가적인 역할을 합니다.

관련된 질문들이나 설명을 제공하는 기존 답변이 여러 개 있습니다:

  1. @Component, @RequestMapping에 관하여:

    • 이 게시물에서는 @Component@RequestMapping을 함께 사용할 경우의 동작 방식과 스프링 빈으로의 등록 과정을 다루고 있습니다. 기본적으로 클래스에 @Controller를 붙여야 애노테이션 기반 컨트롤러로 인식된다는 점이 강조됩니다.
  2. RequestMappingHandlerMapping, @Controller 관련 질문:

    • 이 게시물에서는 @Controller가 붙어 있어야 RequestMappingHandlerMapping에서 핸들러 매핑을 할 수 있다고 설명하고 있습니다.
  3. @Controller, @RequestMapping 질문드려요:

    • Controller와 RequestMapping의 역할 및 스프링 내부 동작을 묻는 질문에서는, @Controller가 붙어 있어야 애노테이션 기반 컨트롤러로 동작한다는 점을 설명합니다.

따라서, 현재 강의에서 다루어진 설명이 기본적인 Spring MVC 동작과 다르게 보일 경우, 해당 설정이 특별한 환경에서 작동한 것일 가능성이 큽니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김이나님의 프로필 이미지
김이나
질문자

1 번 참고 질문 글에 달린 답변에서는 영한 샘께서

'Spring boot 3.0 부터는 @Component + @RequestMapping 을 컨트롤러로 인식하지 않는다'고 하셨는데 2.x 에서도 인식되지 않았다고 하더라구요. 어떤게 맞는건가요?

=================

 

제공해주신 선생님의 답변을 잘 읽어보았습니다.

선생님의 답변에는 올바른 내용과 함께, Spring MVC의 기본 동작에 대한 약간의 오해의 소지가 있는 설명이 섞여 있습니다. 사용자님이 겪었던 혼란이 이 부분에서 발생했을 가능성이 높습니다.

각 부분을 나누어 살펴보겠습니다.

  1. 애노테이션 설명 (@Controller, @RequestMapping, @Component):

    • @Controller, @RequestMapping, @Component 각각의 역할에 대한 설명은 정확합니다.

    • @Controller@Component를 포함하며 스프링 빈으로 등록되는 것은 맞습니다.

    • @RequestMapping이 매핑 정보를 제공하는 것도 맞습니다.

    • @Component가 빈으로 등록되게 하는 것도 맞습니다.

  2. @Component@RequestMapping 조합에 대한 설명 (첫 번째 부분):

    • "클래스 레벨에서 @Component@RequestMapping을 같이 사용하면, 해당 클래스는 스프링 빈으로 등록되면서 요청 매핑 정보를 가진 애노테이션 기반 컨트롤러로 인식됩니다." (선생님 답변 인용)

    • 이 설명이 사용자님의 혼란을 야기한 부분이며, 표준 Spring MVC (및 Spring Boot의 기본 설정)의 동작과는 다릅니다. 앞선 논의에서 보았듯이, @Component@RequestMapping만으로는 기본 RequestMappingHandlerMapping이 해당 클래스를 웹 요청 핸들러(컨트롤러)로 인식하고 @RequestMapping을 등록하지 않습니다. @Controller라는 명시적인 마커가 필요합니다.

  3. 빈 이름 결정 규칙:

    • 빈 이름 결정 규칙 (@Component의 value 속성 또는 클래스 이름 소문자화)에 대한 설명은 정확합니다.

  4. Spring Boot 3.0 이후 동작에 대한 설명:

    • "단 스프링 부트 3.0(스프링 프레임워크6) 부터는 @RequestMapping@Component을 사용해도 컨트롤러로 인식되지 않습니다. 반드시 @Controller를 사용해야 합니다." (선생님 답변 인용)

    • 이 설명은 결론("컨트롤러로 인식되지 않습니다. 반드시 @Controller를 사용해야 합니다.") 자체는 Spring Boot 3.0에서도 맞습니다.

    • 하지만 "Spring Boot 3.0 부터는" 이라는 시점 표시는 오해의 소지가 있습니다.@Component + @RequestMapping 조합이 기본적으로 컨트롤러로 인식되지 않는 것은 Spring Boot 3.0에서 새로 생긴 변경 사항이 아닙니다. Spring MVC의 annotation-based controller 방식이 표준화된 이후 (Spring 2.5 / 3.1 이후) 계속 그래왔습니다. 즉, 2.x 버전에서도 기본적으로는 @Component + @RequestMapping 조합만으로는 컨트롤러로 인식되지 않았습니다.

종합적인 평가:

  • 개별 애노테이션의 역할 및 빈 이름 결정 규칙에 대한 설명은 정확합니다.

  • @Component@RequestMapping 조합이 "요청 매핑 정보를 가진 애노테이션 기반 컨트롤러로 인식된다"는 첫 번째 설명은 표준 Spring MVC의 기본 동작과는 다릅니다. 사용자님의 경험(404 에러)이 기본 동작에 부합합니다.

  • Spring Boot 3.0 이후부터 해당 조합이 인식되지 않는다는 설명은, 결과적으로 3.0에서도 인식되지 않는다는 점은 맞지만, 그것이 '3.0부터' 변경된 사항처럼 설명하는 것은 Spring MVC의 역사적인 기본 동작과 다릅니다. 이미 2.x에서도 기본적으로는 인식되지 않았습니다.

결론적으로, 선생님의 답변 중 @Component@RequestMapping 조합이 기본적으로 컨트롤러로 인식된다는 부분과, 그 변경 시점이 Spring Boot 3.0부터라는 설명은 표준 기본 동작과 다소 차이가 있습니다.

사용자님께서 겪으신 문제는 @Controller라는 명시적인 "컨트롤러 마커"가 없었기 때문에 RequestMappingHandlerMapping이 해당 빈을 웹 핸들러 후보로 스캔하지 않았기 때문이며, 이는 Spring Boot 3.0 이전 버전에서도 대부분 동일하게 적용되는 기본 동작입니다. 선생님께서 보여주신 데모는 아마도 사용자 정의 설정 환경이었을 가능성이 높습니다.