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

윤건희님의 프로필 이미지
윤건희

작성한 질문수

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

스프링 MVC - 시작하기

직접등록과 자동등록에서 이해되지 않는 점이 있습니다.

작성

·

274

0

 수업에서 @Controller 사용시 자동으로 스프링빈 등록이 되고 SpringMemberFormControllerV1 클래스의 클래스 레벨에 @Controller, 메서드 레벨에 @RequestMapping을 사용하여 자동등록을 한다는 점은 이해를 했습니다. 이후 ServletApplication에 @Bean을 사용하여 직접 등록을 하는 경우,ServletApplication에 @Bean 애노테이션으로 직접 등록을 한 상태에서SpringMemberFormControllerV1 클래스의 @Controller, @RequestMapping을 각각 없애고(둘다 없애도 보고 하나씩만 남겨보기도 했습니다.)url에 /springmvc/v1/members/new-form 을 요청했더니404 에러가 뜨는데 ServletApplication에 @Bean을 사용해 직접 등록을 하는 경우에도 SpringMemberFormControllerV1 클래스의 @Controller, @RequestMapping 애노테이션은 유지를 해야하는건가요?만약 그렇다면 자동등록이 되어있는 상태에서 왜 굳이 수동등록을 또 하는지,그게 아니라면 수동등록을 할 경우 SpringMemberFormControllerV1 클래스는 어떻게 수정을 해야하는지 궁금합니다.  

답변 1

0

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

안녕하세요. 윤건희님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

윤건희님의 프로필 이미지
윤건희
질문자

image현재 SpringMemberFormControllerV1이 자동으로 스프링 빈을 등록하는 상태인데

 

image

여기 직접 등록 코드를 ServletApplication에 추가한 후

SpringMemberFormControllerV1의 @Controller, @RequestMapping 애노테이션을 둘다 제거해보고, 각각 하나씩도 제거를 해보며 실행-요청하였더니 오류가 떴습니다

 

ServletApplication에서 직접 등록을 해주었는데 SpringMemberFormControllerV1의 자동등록(Controller,RequestMapping 애노테이션)을 제거 했다고 왜 오류가 뜨는지 궁금합니다 ㅜㅜ

 

 

 

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

안녕하세요. 윤건희님

@Bean을 사용하면 스프링 빈으로 등록되는 것은 맞습니다.

다만 @Controller 애노테이션이 없으면 스프링 컨트롤러로 인식하지 못하는 문제가 발생합니다.

@Controller 애노테이션은 2가지 기능을 함께 제공합니다.

  1. 컴포넌트 스캔의 대상

  2. 스프링 MVC의 컨트롤러로 작동

감사합니다.

영한님 저도 이것 때문에 굉장히 궁금한데요!!

HandlerMapping이 HashMap과 같은 역할을 하는건가요?

우리는 일일이 컨트롤러를 HashMap에 등록하고, 요청 url을 기반으로 HashMap에서 컨트롤러를 찾아 어뎁터에 넘겨줬습니다.

그런데 @RequestMapping("요청 주소") 어노테이션을 메소드에 붙이고는, 더이상 HashMap에 직접 등록하지 않아도 됐습니다.

이걸 바탕으로 HandlerMapping이란 클래스가 각 메소드가 요청 주소를 가지고 있고,

요청이 들어오면 DIspatcherServlet이 우리가 HashMap에서 요청 url 기반으로 컨트롤러를 찾았던 것처럼,

HandlerMapping을 호출해 요청 url에 해당하는 컨트롤러를 찾아 어뎁터에 넘겨주는 것으로 이해했어요.

그러면 스프링이 인식하고, 관리할 수 있도록 빈에 등록하면 끝인거지 왜?? @Controller를 붙여야 하나요?

저도 다 실험해 봤는데 정말 이분 말씀처럼 안되더라고요.

@Controller 어노테이션을 붙여야만 스프링 MVC의 컨트롤러로 작동한단 게 이해가 안갑니다.

HandlerMapping이 @RequestMapping 붙은 메소드 찾는 거 아닌가요?????

강의를 아무리 돌려봐도 이렇게 밖에 이해하지 못하는 제 자신이 눈물나네요..ㅜㅜㅜ

 

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

안녕하세요. JamesByron Dean님

과거에는 @RequestMapping 애노테이션만 있어도 인식이 되었는데요. 스프링에서 최신 버전으로 업데이트 하면서 @RequestMapping 애노테이션을 스프링 컨트롤러 뿐만 아니라 다른 곳에서도 사용하게 되었습니다.

이것을 명확히 구분하기 위해 @Controller 애노테이션이 있어야 스프링이 스프링 MVC의 컨트롤러로 인식하도록 변경되었습니다.

감사합니다.

윤건희님의 프로필 이미지
윤건희

작성한 질문수

질문하기