[SpringBoot] Controller가 동작하지 않는 오류 | Mapping된 URL, Value를 찾지 못하는 경우 | @ComponentScan | Whitelabel Error Page | 스프링부트 :: 매운코딩
728x90
300x250

스프링부트 프로젝트를 신규로 생성한 후에

static 경로에 index.html을 넣고 서버를 실행시키면

localhost:8080/ 주소에서 index.html 화면이 나온다.

 

 

그리고 각각 다른 화면들을 보여주기 위해

@GetMapping을 사용하여 url로 요청을 해서 view를 연동시켜준다.

	@GetMapping(value = "/boardlist")
	public String boardList() {
		return "board/view/board-list";
	}

 

그러면 localhost:8080/boardlist 로 접속하면 board/view/board-list.html이 나와야하는데

Whitelabel Error Page 페이지가 나오는 경우가 있다.

 

해당 boardList() 펑션에 잘 들어오는지 부터 확인하기위해 중단점을 찍고보니 들어오지 않는다.

Controller가 제대로 동작을 하지 않다고 있는 것이다.

 

우선, 1. 컨트롤러로 사용할 Class의 최상단에 @Controller  어노테이션을 넣었는가? 를 확인한다.

 

모든 세팅이 다 되어있음에도 Controller에 지정한 URL을 찾지못할 때에는 Package 구조를 보아야한다.

2. 해당 Controller가 메인 클래스 (xxxApplication.java) 가 위치한 패키지 하위에 위치해 있는가?

 

시작점인 메인클래스가 위치한 패키지의 하위에 있는 클래스들을 검색하여 Bean으로 등록하기에

하위 패키지에 속하지 않는다면 스프링 컨테이너는 해당 클래스를 Bean으로 등록하지 않게 된다.

 

위의 그림에서 보다시피 com 패키지바로 밑에 메인클래스가있고 com.board에 BoardController가 있어서 Controller을 인식한다. 

 

 

+ 좀 더 자세히 다루자면.....!!!!!

 

Spring 문법에서 @Controller 혹은 @RestController를 설정했다 쳐도 XML 설정 파일에

<context:component-scan>을 설정하지 않으면 컨테이너가 컨트롤러를 빈으로 등록하지 않는다.

Spring boot에서는 해당 작업을 자동으로 처리해주고 있는데... 그것은 Spring Boot의 시작점 파일때문이다.

 

시작점 파일을 파헤쳐보자.

 

기본적으로 Spring Boot가 시작되는 시작점은 xxxAplication.java 파일이다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
public class MyTestBootProjectApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyTestBootProjectApplication.class, args);
	}

}

@SpringBootApplication 어노테이션이 붙어있는 곳이 시작점이다.

 

@SpringBootApplication 어노테이션은

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나로 합친 것이다.

 

- @Configuration : 해당 클래스가 설정 파일임을 알려주는 용도

- @EnableAutoConfiguration : 스프링의 다양한 설정이 자동으로 구성되고 완료됨

- @ComponentScan : 자동으로 컴포넌트 클래스를 검색하여 컴포넌트와 빈 클래스를 Spring Application Context에 등록함. (단, 메인 클래스가 위치한 패키지부터 이하 모든 클래스를 검색하여 Bean으로 등록)

 

여기서, 패키지 구조가 다르면 @ComponentScan의 역할이 수행되지 않기에 등록이 되지 않는다.

 

만약.. 꼭 굳이 패키지 구조를 하위가 아닌 다르게 두어야한다면..

메인클래스에 아래와 같이 @ComponentScan 어노테이션을 하나 더 쓰면 된다.

@SpringBootApplication
@ComponentScan(basePackages = {"메인 클래스가 있는 패키지 위치", "추가할 패키지 위치"})
public class MyTestBootProjectApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyTestBootProjectApplication.class, args);
	}

}

 

 

 

 

 

참고자료 - https://mkil.tistory.com/456

 

Spring Boot Annotation 정리

어노테이션은 이름만 봐도 얼추 기능에 대한 설명이 유추된다지만 그렇지 않은 어노테이션도 있고..해서 Spring Boot 스터디를 하게 된 김에 어노테이션도 정리해본다 :) SpringBoot에서 사용하는 어

mkil.tistory.com

 

728x90

+ Recent posts