잠시 돌아가서, 이 @SpringBootApplication
이 뭐기에 빌드 오류를 뱉어내는지 보자
@Configuration + @EnableAutoConfiguration + @ComponentScan 을 합친 것이다.
다른 컴포넌트, 서비스, 설정 등을 찾을 수 있게 도와주는 어노테이션
즉 자바 클래스를 스프링 빈이라고 표시하고
스프링의 component-scanning 기술을 통해 ApplicationContext에 빈으로 등록하게 하는 역할
== @Component를 검색하도록 도와준다
@Configuration 클래스도 컴포넌트로서 검색 대상이 된다.
스프링은 기본적으로 객체를 자동으로 생성하여 관리하기 때문에 @Component 어노테이션이 있는 클래스들을 스프링 컨테이너가 생성해준다. @ComponentScan는 특별히 basePackage를 지정하지 않아도 main class가 위치한 패키지를 Root package로 하여 그 이하의 모든 컴포넌트 클래스들을 검색하여 빈으로 등록한다.
메인 클래스인 YcarBootServerApplication
를 보면, 이 클래스는 com.ycar.boot
패키지에 있다. 이 패키지가 컴포넌트 스캔의 루트패키지가 된다. 따라서 com.ycar.boot 패키지를 기준으로 그 하위에 있는(== 하위 패키지) 모든 컴포넌트들을 검색한다.
(주의) pom.xml에서 루트 패키지를 정확하게 매칭시켜야 한다.
Spring XML설정의 <context:component-scan>
을 대신해 자바에 설정
컴포넌트에 대해서는 아래에 따로 기술!
@Repository, @Service, @Controller는 @Component에 속한 어노테이션이다.
@Repository
@Service
@Contoller - @RestController
** 3가지 종류의 컴포넌트가 다른 이름을 가진 이유는 레이어를 구분하기 위함
DAO에 특화된 어노테이션이다. @Component 어노테이션을 써도 상관없지만, DAO 클래스들에 @Repository 어노테이션을 사용함으로써 @Component 어노테션이 가진 특성과 함께, DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있는 장점 또한 가질 수 있다.
서비스 레이어 클래스들에 사용되어지는 어노테이션이다. 역시나 @Component 어노테이션을 사용해도 상관없다. @Service 어노테이션을 사용함으로써 해당 클래스가 서비스 레이어 클래스라는 것을 명확하게 할 수 있다. 현재는 @Repository 어노테이션 처럼 추가적인 behavior는 없지만, 추후에 추가될 예정이다.
MVC 패턴에서 Controller 클래스에 선언되어진다. 이 또한 @Component 로 대체할 수 있다. 하지만, @Controller 어노테이션을 사용함으로써 @RequestMapping 등의 추가적인 어노테이션을 사용할 수 있게 된다.
** 실제 프로젝트에서 @Component가 필요한 비슷한 상황들을 직면하곤 한다. 하지만, 대부분의 상황에서 우리는 @Repository, @Service, @Controller 어노테이션을 사용하는게 좋다고 한다.
이렇게 @SpringBootApplication 와 그 안의 @Configuration, @EnableAutoConfiguration, @ComponentScan 에 대해 간단히 살펴보았다.
그러면 생성된 Bean을 누가 등록해줄까? 스프링 빈 컨테이너다.
스프링 빈 컨테이너는 인스턴스의 생명주기를 관리한다.
컨테이너의 종류는 ApplicationContext와 BeanFactory 2가지로 나누어지는데,
둘의 차이점은 쉽게 말하면 ApplicationContext가 BeanFactory의 향상된 버전이라 한다.
ApplicationContext
는 run() 메서드를 통해 Java configure를 읽어 bean을 등록한다.
싱글턴으로 객체 관리를 하기 때문에 한번만 실행된다.
ApplicationContext , 빈 관리 등 스프링 구조를 잘 몰랐기 때문에 발생한 문제였다. 기준이 되는 패키지를 생각하고 형상관리를 했어야 했다…. 문제를 알았으니 이제 해결해야겠죠
프로젝트를 하면서 컴퓨터 구조를 확실하게 알아야겠다는 생각을 많이 했다. 나 뿐만 아니라 우리 팀원 모두 그런 느낌을 받은건 우연이 아닌것 같다. 빠른 문제 해결을 위해선 기본적인 구조를 파악하고 체화해야 함을,, 오늘도 배운다- 까먹을 땐 이 블로그 포스트를 보며 다시 공부하자 😀😀
출처: