@Configuration
public class AppCtx {
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
@Bean
public MemberRegisterService memberRegisterService() {
return new MemberRegisterService(memberDao());
}
@Bean
public MemeberLoginService memeberLoginService() {
return new MemeberLoginService(memberDao());
}
위의 코드에서 memberReigsterService() 메서드와 memberLoginService() 메서드는 둘 다 memberDao() 메서드를 실행하여 의존 주입을 하고있다. 그리고 memberDao() 메서드는 새로운 MemberDao 객체를 생성해서 리턴한다.
그러면 memberRegisterService 객체와 memberLoginService 객체는 서로 다른 MemberDao 객체를 사용하는 것일까?
정답은 '아니오' 이다.
스프링 컨테이너가 생성한 빈은 싱글톤 객체이다. 즉, @Bean이 붙은 메서드에 대해 한 개의 객체만 생성하며 이는 memberDao()를 몇 번을 호출하더라도 전부 같은 MemberDao 객체를 리턴한다는 것을 의미한다.
스프링은 설정 클래스(@Configuration이 붙은 클래스)를 그대로 사용하지 않는다. 대신 이를 상속한 새로운 설정 클래스를 만들어서 사용한다. 이 새로운 설정 클래스에서 스프링은 한 번 생성된 객체를 보관했다가, 이후에 호출된다면 동일한 객체를 리턴한다.
@Autowired : 자동 의존 주입
필드에 이 애노테이션을 붙이면, 스프링은 해당 타입의 빈을 찾아서 필드에 할당한다.
클래스 내의 필드에 @Autowired 애노테이션을 사용하면, 스프링 설정 클래스에서 생성자를 이용하거나 게터세터를 이용하여 수동으로 의존성 주입을 할 필요가 없다. 스프링에서 그 필드 타입에 맞는 빈을 자동으로 주입해주기 때문이다.
메서드에도 이 애노테이션을 붙일 수 있다. 스프링은 해당 메서드를 호출할 때, 메서드 파라미터 타입에 해당하는 빈 객체를 찾아 인자로 주입한다.
ex)
@Autowired
public void setMemberDao(MemberDao memberDao) {
this.memberDao = memberDao;
}
컴포넌트 스캔
컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 등록하지 않아도 스프링이 알아서 빈으로 등록해준다.
@Component
이 애노테이션에 값을 주었는지에 따라 빈으로 사용될 이름이 결정된다.
아무런 값도 주지 않는다면 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용한다.
예를 들어 MemberDao라면 memerDao의 이름으로 빈을 등록한다.
만약 애노테이션이 값을 주면 그 값을 빈 이름으로 사용한다
ex) Component("listPrinter")
@Component 애노테이션을 붙인 클래스를 스캔해서 스프링 빈으로 등록하려면 설정클래스에 @ComponentScan 애노테이션을 적용해야한다.
@Configuration
@ComponentScan(basePackage={"spring"})
public class AppCtx {
...
}
basePackage 의 속성은 스캔 대상 패키지 목록을 지정한다.
위의 코드에서는 "spring" 값 하나만 존재하는데, 이는 spring 패키지와 그 하위 패키지에 속한 클래스를 스캔 대상으로 설정한다는 의미이다. 따라서 spring 패키지 안에 있는 모든 @Component 애노테이션이 붙은 클래스들을 스캔하여 객체 생성 후 빈으로 설정한다.
@Component 애노테이션이 붙은 클래스만 컴포넌트 스캔 대상이 되는 건 아니다. 다음 애노테이션 전부가 컴포넌트 스캔 대상에 포함된다.
- @Component
- @Controller
- @Service
- @Repository
- @Aspect
- @Configuration
'Back-End > Spring' 카테고리의 다른 글
[Spring] ResponseBody와 ResponseEntity (0) | 2022.03.28 |
---|---|
[Spring] 의존 주입 (0) | 2022.03.25 |