전체 아키텍처(구현 수준이 아니라 개념 수준에서)에서 형식 또는 메서드의 역할을 나타내는 주석이다.
스프링 컨테이너가 스프링 관리 컴포넌트로 식별하게 해주는 단순한 마커다. 이러한 마커는 외부 처리 도구에서 사용되거나 관점 지향 프로그래밍 컨텍스트에서 포인트컷에 대한 레퍼런스로 사용될 수 있다.
오늘날 스프링 커뮤니티의 많은 프로젝트에서 이 스테레오타입을 사용하면 코드를 더 읽기 쉽게 해서 이해하기 쉽게 해줄 뿐 아니라 구조와 구조적 계층을 식별하는 데도 도움을 준다.
종류로는 @Component, @Controller, @Service, @Repository 등이 있다.
@Component 어노테이션이 붙은 클래스는 스프링 컴포넌트 이다.이전까지는 xml파일에 bean을 등록하여 관리했지만, 모든 bean을 xml파일로 관리하다 보니 xml 파일이 매우 커지게 되었다.
따라서 Spring 2.0에서는 @Repository 가 등장하였고, Spring 2.5 부터는 @Component, @Controller, @Service, @Configuration 등이 등장하면서 Stereo Type에 대한 정의가 범용적으로 사용되게 되었다.
@ComponentScan은 @Component가 붙어있는 클래스들을 검색해서 스프링 컨테이너에 등록한다.
@Component vs @Bean
모두 스프링 빈을 만드는데 사용된다!
@Component는 클래스 상단에 적으며, default로 클래스 이름으로 Bean의 이름이 등록된다. 스프링에서 @ComponentScan을 사용해서 자동으로 찾고 관리해주는 bean이다.
@Bean은 @Configuration으로 선언된 클래스 내에 있는 메서드를 정의할 때 사용한다. default로 메소드 이름으로 Bean의 이름이 등록되며 메소드가 반환하는 객체가 Bean이 된다.
이론적으로 공부한 내용을 실습을 통해 확인해보자!!!!!
지난번에 작성한 프로젝트에 계속 이어 작성한다.
post 패키지 안에 아래와 같이 인터페이스를 만든다. crud를 확인하는 메소드로 따로 설명은 없어도 될 것 같다.
그리고 레포지토리를 담당하는 클래스를 만들고 그 위에 @Repository 어노테이션을 입력한다. 그리고 위에서 만든 PostRepository.java를 상속받는다. 상속받은 코드는 아래와 같다. 코드 내용은 PostController.java와 달라진 부분이 거의 없다.
컨트롤러, 모델(데이터 베이스), 비즈니스 로직을 분리하는 것을 중점으로 코드를 작성한다.
다음으로는 서비스를 담당하는 부분을 만들어보자.
서비스도 마찬가지로 인터페이스로 먼저 정의를 한다.
그리고 자바 클래스를 만든 후 그 위에 @Service 어노테이션을 입력하고 위에서 작성한 인터페이스를 상속받는다. 아래 사진을 보면 PostRepository 타입의 변수를 하나 만드는데 이를 생성자에서 @AutoWired 어노테이션을 이용해서 연결한다.
@Autowired 개념을 알기 위해 먼저 DI 개념을 알아야한다.
DI(의존성 종속, Dependency Injection)란, 클래스간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것을 말한다.
- Dependency는 객체가 다른 객체와 상호작용하는 것을 말함
@Autowired는 스프링 DI(Dependency Injection)에서 사용되는 어노테이션이다.
스프링에서 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입된다.
@Autowired는 주로 타입(Type)을 이용해 주입하는데 동일한 Bean 타입의 객체가 여러 개 있을 경우, Bean을 찾기 위해 @Qualifier 어노테이션을 같이 사용해야 한다. (우선 순위가 높은 구현체를 연결한다.)
위에 코드에서는 PostRepository로 만든 구현체가 PostRepositoryInMemory.java 하나밖에 없기 때문에 그 구현체로 연결된다.
이제 인터페이스에 대한 메소드를 작성해보자. 위에서 자동주입으로 주입된 postRepository 구현체를 이용하여 깔끔하게 독립적으로 코드가 작성된 것을 볼 수 있다.
이제 컨트롤러를 만들어보자!!!!!(거의 끝났다..) 서비스 로직에 관여하지 않고 오롯이 요청을 받고 응답을 보내는 역할만 하도록 만들 것이다. 그래서 위에서 @Autowired를 이용해서 레포지토리에 연결했던 것 처럼 같은 원리로 @Autowired를 이용해서 서비스 클래스에 연결한다.
그리고 CRUD에 해당하는 메소드를 작성한다. 서비스로직을 불러오는 코드이기 때문에 큰 문제없이 이해할 수 있을 것이다.
처음엔 이해하기 어려울 수 있으나 반복해서 보다보면 구조를 쉽게 파악할 수 있을 것이다.