[SpringBoot] Controller를 찾지 못하는 상황
개발 환경
IntelliJ 2022.3.1
java 11
SpringBoot
jsp
gradle
+ 전자정부프레임워크
문제 상황
보통의 상황의 경우, perperties에서 경로 설정을 완료하고 jsp템플릿을 사용할 수 있도록 gradle에 dependency를 추가해준다면 컨트롤러를 타고 정상적인 출력이 가능할 것이다.
나의 경우 /home을 타면 webapp/WEB-INF/views/test.jsp를 타도록 경로를 설정했다.
여기서 src/main/webapp/WEB-INF 까지는 기본경로라 변경해서는 안된다.
아래는 나의 경로와 Controller 상황이다.
- application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
이런 상황에서 /home 경로를 타게 된다면 아래와 같은 페이지를 반환하고, Test start라는 로그를 띄우지 않는데, 이는 즉 Controller를 타지 않는다는 상황인 것 같다.
해결
Contoller가 위치한 경로는 메인클래스의 하위에 존재해야 했다 .. 그래서 메인클래스의 하위에 넣어줬더니 정상적으로 실행되는 모습이다.
왜 이런 상황이 발생했는가 .. 를 알아보게 되었다. 나는 아래 블로그의 도움을 받았다.
https://cceeun.tistory.com/183
Spring에서는 xml설정파일에서 <context:component-scan> 을 설정해주지 않는다면 컨테이너가 컨트롤러를 빈으로 등록하지 않는다고 한다.
SpringBoot는 이 작업을 자동으로 해주고 있는데, 문제는 시작점 즉 root의 문제라고 한다.
@SpringBootApplication Annotation이 붙은 곳이 시작점이다.
@Configuration, @EnableAutoConfiguration, @ComponentScan 이 세가지의 어노테이션이 하나로 합쳐진 것이다.
각각의 어노테이션들은
@Configuration : 해당 클래스가 설정 파일임을 알려주는 용도
@EnableAutoConfiguration : 스프링의 다양한 설정이 자동으로 구성되고 완료됨
@ComponentScan : 자동으로 컴포넌트 클래스를 검색하여 컴포넌트와 bean 클래스를 Spring Appliocation Context에 등록함.
여기서 ComponentScan 의 역할이 수행되지 않기 때문에 Bean으로 등록되지 않는다고 한다.
오늘도 유익한 것을 배워간다.