스프링에는 다양한 특징이 있지만 그중 하나는 제어의 역전 IoC 이다.
제어의 역전에 관한 내용은 아래 참고 포스팅을 참조하면 이해하기 쉬울 것이다.
스프링 컨테이너에서 직접 객체를 관리 하게 되는데 이것을 빈(Bean)이라고 한다.
빈 등록은 다양한 방법이 있는데
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
또한, @Component를 포함하는 @Controller, @Service, @Repository 애노테이션도 스프링 빈으로 자동 등록된다.
스프링에서는 다음과 같은 순서로 동작을 한다.
컨트롤러에서 @Controller 어노테이션을 사용하게 되면 자동으로 스프링 빈에 등록이 되고,
controller 클래스에서는 서비스 호출을 위해 @Autowired 라는 어노테이션으로 의존성 주입을 해주게 된다.
이상태로 만약 코드를 돌리면 에러가 난다.
이유는 의존성 주입을 받을 서비스가 빈에 등록이 되어있지 않기 때문이다.
그래서 서비스 클래스 역시 @Service 어노테이션으로 등록을 해줘야하고,
서비스에서도 마찬가지로 repository를 호출하기 위해서는 @Repository 어노테이션을 추가해줘야 한다.
참고로 스프링에서 스프링 컨테이너에 빈을 등록할때는 기본적으로 싱글톤으로 등록을 한다.
다른곳에서 사용이 되도 객체는 하나뿐이다.
물론 여러개를 사용할수 있지만 default값은 싱글톤이라고 하면 된다.
싱글톤에 대해서는 아래 참고 포스팅을 참조해보도록 한다.
어노테이션 방법이 아니라면 configuration에서 빈에 직접 등록할수 있고 방법은 다음과 같다.
configuration class를 생성 후에 bean annotation을 사용하여 해당 클래스를 선언해주면 된다.
@Configuration public void conf(){ @Bean puclic MemberService service(){ return new MemberService(memberRepository()); } @Bean puclic MemberRepository memberRepository(){ return new MemorymemberRepository(); } } |
이상 스프링에서 빈에 대해서 알아보았다.
참고 포스팅
https://thenicesj.tistory.com/144
https://thenicesj.tistory.com/146
'IT > Java' 카테고리의 다른 글
LocalDateTime 날짜 비교 (36) | 2022.07.21 |
---|---|
Spring에서 Service와 ServiceImpl 를 나누는 이유(2022.07.19) (24) | 2022.07.18 |
이클립스 자바 버전 변경 (35) | 2022.07.16 |
jdbc URL (29) | 2022.07.15 |
JAVA 에서 Date 형식(Date, LocalDateTime) (59) | 2022.07.06 |
댓글