IoC
IoC는 Inversion of Control 을 줄인 표현이고 직역하면 제어의 역전이다. 우리는 지금까지 자바 코드를 작성해 객체를 생성할 때는 객체가 필요한 곳에서 직접 생성했다. 다음 예제에선 클래스 B 객체를 사용하기 위해 클래스 A 에서 객체를 직접 생성한다.
public class A { b = new B(); // 클래스 A에서 new 키워드로 클래스 B의 객체 생성}제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다. 위 예제에 제어의 역전을 적용하면 다음과 같이 코드의 형태로 바뀐다. 실제로 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 한다.
public class A { private B b; // 코드에 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당}DI
스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용한다. 그리고 제어의 역전을 구현하기 위해 사용하는 방법이 DI이다. DI는 Dependency Injection 을 줄인 말이고 직역하면 의존성 주입이다.
public class A { // A에서 B를 주입받음 @Autowired B b;}여기에서 사용하는 @Autowired라는 애너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 한다. 빈은 쉽게 말해 스프링 컨테이너에서 관리하는 객체를 말한다.
위 예제처럼 작성해도 프로그램은 잘 동작한다. 그 이유는 스프링 컨테이너라는 곳에서 객체를 주입했기 때문이다. 쉽게 말해 스프링 컨테이너가 B 객체를 만들어서 클래스 A에 준 거라 보면 된다.
스프링 컨테이너
스프링은 스프링 컨테이너를 제공한다. 스프링 컨테이너는 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 이 스프링 컨테이너가 관리하는 것이다. 또한 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원하기도 한다. 그럼 빈은 도대체 무엇일까?
빈
어렵게 생각할 거 없이 스프링에서 제공해주는 객체라고 생각하자 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공한다.
예를 들어 MyBean이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록된다. 이후 스프링 컨테이너에서 이 클래스를 관리한다. 이때 빈의 이름은 클래스 이름의 첫글자를 소문자로 바꿔 관리한다. 따라서 MyBean 클래스의 빈 이름은 myBean 이 된다.
// 클래스를_빈으로_등록하는_방법.java
@Component // 클래스 MyBean 빈으로 등록public class MyBean {}AOP
AOP는 Aspect Oriented Programming을 줄인 표현이고 직역하면 관점 지향 프로그램밍이다. 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미한다.
예를 들어 계좌 이체, 고객 관리하는 프로그램이 있을 때 각 프로그램에는 기록을 위한 로깅 로직과 데이터베이스 연결 로직이 포함된다. 이때 핵심 관점은 계좌 이체, 고객 관리 로직이고 부가 관점은 로깅, 데이터베이스 연결 로직이다. 여기에 AOP 관점을 적용하면 부가 관점에 해당하는 로직을 모듈화해 핵심 관점 코드에서 분리할 수 있게 해준다.
PSA
PSA는 Portable Service Abstraction을 줄인 표현이며 해석하면 이식 가능한 서비스 추상화이다. 간단히 말해 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말한다.
대표적인 PSA의 예로는 클라이언트의 매핑과 클래스, 메서드의 매핑을 위한 애너테이션이 있다. 예를 들어 스프링에서 데이터베이스에 접근하기 위한 기술로는 JPA, MyBatis, JDBC 같은 것들이 있는데, 여기에서 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원한다.
정리
- IoC : 객체의 생성과 관리를 개발자가 하는 것이 아니라 프레임워크가 대신하는 것
- DI : 외부에서 객체를 주입받아 사용하는 것
- AOP : 프로그래밍을 할 때 핵심 관점과 부가 관점을 나누어서 개발하는 것
- PSA : 어느 기술을 사용하던 일관된 방식으로 처리하도록 하는 것