스프링은 자바 클래스파일이나 XML, Groovy 설정 코드를 이용해서 객체 생성 및 초기화를 수행할 수 있다. 스프링이 생성하는 객체를 빈(Bean) 객체라고 부른다.
스프링은 BeanFactory 및 ApplicationContext 인터페이스에서 Bean객체의 전체적인 라이프사이클(생성, 초기화, 관리, 제거)기능을 제공하고 관리한다. 그래서 보통 ApplicationContext를 흔히 스프링 컨테이너라고 부른다.
public class Greeter {
private String format;
public String greet(String guest){
return String.format(format, guset);
}
public void setFormat(String format){
this.format =. format;
}
}
Greeter greeter = new Greeter();
greeter.setFormat("%s, 안녕하세요!");
String msg = greeter.greet("Spring");
System.out.println(msg); // output: Spring, 안녕하세요!
@Configuration
and @Bean
스프링 컨테이너(ApplicationContext)는 @Configuration
이 붙어 있는 클래스를 자동으로 Bean으로 등록 해주고, 해당 클래스를 파싱해서 @Bean
이 있는 메서드를 찾아서 실행하고 그 메서드의 실행의 결과로 하나의 객체를 초기화시키고 생성한다. 생성된 객체는 스프링이 관리하는 Bean 객체로 등록하여 관리한다.
@Bean
어노테이션만을 이용해서 직접 Bean을 등록해주는 것도 동작은 한다. 하지만, @Configuration
안에서 @Bean
을 통해 생성된 객체들만 싱글톤을 보장을 받을 수 있다.
@Configuration
public class AppContext {
@Bean
public Greeter greeter(){
Greeter g = new Greeter();
g.setFormat("%s, 안녕하세요!");
return g;
}
}
public class Main {
public static void main(String[] args){
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppContext.class);
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("Spring");
System.out.println(msg);
ctx.close();
}
}
객체 간의 의존을 의미한다. 아래 예제를 보면 MemberRegisterService 클래스 DB 처리를 위해서 MemberDao 클래스의 메서드를 사용하고 있다. 이렇게 한 클래스(A class)가 다른 클래스(B class)의 메서드를 실행할 때 이를 “의존(Dependency)”이라고 말하고, “A클래스는 B클래스에 의존한다.”라고 표현할 수 있다.
public class MemeberRegisterService {
private MemberDao memberDao = new MemberDao();
public void register(RegisterRequest req){
Member member = memeberDao.selectByEmail(req.getEmail());
if(member != null)
throw new DuplicateMemeberException("dup emailAddress: " + req.getEmail());
Member newMemeber = new Member(
req.getEmail(), req.getPassword(), req.getName(), LocalDateTime.now());
memeberDao.insert(newMemeber);
}
}
“의존한다.”라는 의미는 A클래스에서 사용 중인 B클래스(여기서는 MemberDao클래스)의 메서드에 변화(ex. 메서드명의 수정 또는 파라미터의 추가 또는 삭제 등)가 생겼다면 B클래스 뿐만 아니라, A클래스도 수정이 필요하다.즉, 변경에 따른 영향이 전파되는 관계를 “의존한다.”라고 표현한다.