0. 스프링이란?

1. 스프링의 첫번째 핵심기능은 객체를 생성하고 초기화 하는 것이다.

스프링은 자바 클래스파일이나 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
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();
	}
}

2. 스프링의 두번째 핵심기능은 의존성 주입(DI)이다.

의존성이란?

객체 간의 의존을 의미한다. 아래 예제를 보면 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클래스도 수정이 필요하다.즉, 변경에 따른 영향이 전파되는 관계를 “의존한다.”라고 표현한다.