스프링의 모든 기능의 기반을 IoC와 DI에 두고 있다.
IoC
IoC란 Inversion of Control을 줄인 표현이다. 직역하면 제어의 역전이 된다.
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다.
public class A {
b = new B(); // 클래스 A에서 new 키워드로 클래스 B의 객체 생성
}
에를 들어 위의 코드에서 IoC를 적용하면 다음과 같은 코드 형태가 된다.
public class A {
private B b; // 코드에서 객체 생성 x , 어디선가 받아온 객체를 b에 할당.
}
실제 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 한다.
DI
스프링은 객체들을 관리하기 위해 Ioc를 사용한다. 그리고 IoC를 구현하기 위해 사용하는 방법이 DI이다. DI는 Dependency Injection을 줄인 표현이고, 직역하면 의존성 주입이다.
DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻이다.
public class A {
@Autowired
B b;
}
위 코드는 IoC/DI를 기초로 하는 스프링 코드이다. @Autowired 애너테이션 스프링 컨테이너에 있는 빈(Bean)이라는 것을 주입하는 역할을 한다. 따라서 빈이라는 스프링 컨테이너에서 관리되는 객체를 통해 개발자는 B b; 라고 선언만 하고, 직접 객체를 생성하지 않고 주입받을 수 있는 것이다.
즉, 스프링 컨테이너가 B 객체를 만들어서 클래스 A에게 준 것이다.
이처럼 스프링의 경우 쓰고 싶은 객체를 해당 클래스에서 직접 생성하는 것이 아니라 스프링 컨테이너에서 객체를 주입 받아 사용하는데, 이것이 스프링의 핵심 개념인 IoC/DI 개념이다.
cf) Annotation(@)
: 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공하고, 코드에 정보를 추가하는 정형화된 방법이다. 애너테이션 사용시 코드가 깔끔해지고 재사용에 용이하다는 장점이 있다.
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공
스프링 컨테이너(Spring Container)
빈을 생성하고 관리하는 역할을 한다.
즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리하는 것이다. 또한 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입 받을 수 있도록 DI를 지원한다.
빈(Bean)
스프링이 생성하고 관리하는 객체. 위의 예시 코드 중 B가 빈이다.
스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등 여러 방법을 제공한다.
@Component // 클래스 MyBean을 빈으로 등록. 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꾸어 스프링 컨테이너에서 관리.
public class MyBean {
}
AOP는 Aspect Oriented Programming의 약자이다. 직역하면 관점 지향 프로그래밍이다.
AOP는 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의미한다.
예를들어 계좌이체, 고객 관리하는 프로그램이 있을 때 각 프로그램에는 로깅 로직(기록 로직), 데이터 베이스 연결 로직이 포함된다. 이때 핵심 관점은 계좌 이체, 고객 관리 로직이고, 부가 관점은 로깅, 데이터베이스 연결 로직이다.
그림을 보면 로깅, 데이터베이스 연결은 모두 계좌 이체와 고객 관리에 필요하다. 여기에 AOP 관점을 적용하면 부가 관점에 해당하는 로직을 모듈화해 개발할 수 있다.
즉, 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있게 된다. 따라서 프로그래머는 핵심 관점 코드에만 집중할 수 있게 되고 프로그램의 모듈화로 인해 프로그램의 변경과 확장에도 유연하게 대응할 수 있게 된다.
PSA는 Portable Service Abstraction의 약자이다. 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 의미한다.
대표적인 PSA의 예는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션이다.
예를들어 스프링에서 일관된 방식으로 데이터베이스에 접근하기 위해 인터페이스를 제공하는 기술인 JPA, MyBatis, JDBC 등이 PSA라고 볼 수 있다. WAS도 PSA 예시인데, 코드는 그대로 두고 WAS를 톰캣이 아닌 언더토우, 네티와 같은 다른곳에서 실행해도 기존 코드를 그대로 사용할 수 있기 때문이다.
스프링 프레임 워크는 IoC/DI를 통해 객체 간의 의존 관계를 설정하고, AOP를 통해 핵심 로직과 부가 로직을 분리해 개발하며, PS를 통해 추상화된 다양한 서비스들을 일관된 방식으로 사용하도록 한다.