스프링 어플리케이션 동작시 @ComponentScan 어노테이션을 통해 @Component을 읽어 싱글톤 패턴으로 컨테이너에 빈 등록을 한다.
즉 ComponentScan은 @Component 어노테이션이 있으면 스프링 빈으로 자동 등록됨을 말한다.
가독성을 위해 @Component 대신 @Controller, @Service, @Repository 어노테이션을 사용하고 이들은 모두 @Component를 포함하고 있기 때문에 이 세 개의 어노테이션도 스프링 빈으로 자동 등록 되게 된다.
항상 Repository에 @Repository 어노테이션을 당연하게 달았는데, 어노테이션이 없어도 Repository가 정상적으로 동작하는 것을 보고 해당 어노테이션이 꼭 필요한지 고민해보게 되었다.
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>
위의 @NoRepositoryBean 어노테이션은 실제 사용되는 Repository가 아님을 표시하는 것일 뿐이다.
spring-data-jpa의 리포지토리 빈 등록은 해당 어노테이션에서 이루어진다.
SpringBoot에서는 이것이 자동 설정이 되어 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(JpaRepositoriesRegistrar.class)
public @interface EnableJpaRepositories
@Import(JpaRepositoriesRegistrar.class)
가 실제 JpaRepository를 상속받은 Repository 인터페이스를 빈으로 등록해준다.