스프링부트로 미니프로젝트를 진행하다가 404 오류에 봉착했습니다.
그냥 평소대로 작업했던 것 같은데 다음 엔드포인트에 도무지 접근을 할 수 없었습니다
@RestController
@RequestMapping("/users")
@CrossOrigin // 이 컨트롤러의 모든 메소드에 대해 CORS 요청 허용
public class UserController {
// 컨트롤러 메소드...
}
pom.xml에 각 의존성의 버전 호환을 확인해 봤으나 문제가 없었고,
application.properties파일의 설정도 괜찮은 듯 보였습니다.
아무튼 서버가 빌드는 잘 되는데 엔드포인트에 접근할 수 없었습니다
하지만 곧 원인을 찾았습니다
바보같게도 클래스 파일을 @SpringBootApllication 어노테이션이 붙은 클래스 밖에 위치시켰던 것입니다.
만약 컴포넌트가 @SpringBootApplication 어노테이션이 붙은 클래스의 패키지 또는 그 하위 패키지 바깥에 위치한다면, 스프링 부트의 자동 컴포넌트 스캔 메커니즘은 그 컴포넌트를 찾지 못하게 됩니다. 이는 스프링 부트의 디자인 원칙 중 하나로, 애플리케이션의 구성요소를 체계적으로 관리하기 위해 도입된 제약사항입니다.
예를 들어, com.example.app 패키지에 @SpringBootApplication 어노테이션이 붙은 메인 애플리케이션 클래스가 있다면, 스프링 부트는 com.example.app 패키지와 그 하위 패키지에서 컴포넌트를 검색합니다. 만약 컴포넌트가 com.example 패키지나 그 상위에 위치한다면, 이 컴포넌트는 자동 스캔 대상에서 제외됩니다.
이 문제를 해결하기 위한 몇 가지 방법은 다음과 같습니다:
1. 컴포넌트를 메인 애플리케이션 클래스가 있는 패키지 또는 그 하위 패키지로 이동
가장 간단한 해결책은 컴포넌트를 메인 애플리케이션 클래스가 위치한 패키지 또는 그 하위 패키지로 옮기는 것입니다. 이렇게 하면 컴포넌트가 자동으로 스캔되어 빈으로 등록됩니다.
2. 컴포넌트 스캔 범위 확장
@ComponentScan 어노테이션을 사용하여 스프링 부트의 컴포넌트 스캔 범위를 명시적으로 확장할 수 있습니다. 이 어노테이션을 @SpringBootApplication 어노테이션이 붙은 클래스에 추가하고, basePackages 속성을 사용하여 추가로 스캔할 패키지를 지정합니다.
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.app", "com.other.package"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
'웹개발 > 오류해결' 카테고리의 다른 글
docker-compose : Connection refused (0) | 2024.06.17 |
---|---|
failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount277479487/Dockerfile: no such file or directory 해결 (0) | 2024.06.17 |
could not prepare statement [Table ""] (0) | 2024.03.22 |
Error executing DDL "create table user" (0) | 2024.03.22 |
스프링 + 마이바티스 구조에서 동시 DB insert 실패 해결 (0) | 2024.03.20 |