이 글은 계속해서 스프링에 대한 지식이 깊어짐에 따라 업데이트할 글입니다.
기존에 자바 코드를 작성해 객체를 생성했을 때는 객체가 필요한 곳에서 직접 생성자 함수를 이용하여 생성했었습니다.
public class A {
B b = new B(); // 클래스 A 내부에서 B 타입의 객체를 생성하여 사용하려면 생성자 함수를 호출하여 생성했었습니다...
}
IOC는 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말합니다. 실제로 스프링은 스프링 컨테이너가 객체를 관리, 제공하는 역할을 합니다.
public class A {
private B b; // 클래스 내부에서 객체를 생성하는 것이 아닌, 어디선가 받아온 객체를 b에 할당
}
IOC를 구현하기 위해 사용하는 방법이 DI입니다. DI는 어떤 클래스가 다른 클래스에 의존한다는 의미입니다.
스프링에서는 @Autowired라는 애너테이션을 통해 스프링 컨테이너에 있는 빈을 주입합니다.
public class A {
// A에서 B 타입의 인스턴스를 주입받음
@Autowired
B b;
}
프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미합니다.
게임을 예시로 들어 보겠습니다.
게임에는 두 가지 모드가 있다고 가정을 해보도록 하죠.
첫 번째 모드의 핵심 관점은 플레이어끼리 대전을 하는 것이고, 부가 관점은 랭킹보여주기, 데이터베이스 연결 로직입니다.
두 번째 모드의 핵심 관점은 보스를 다 같이 물리치는 것이고, 부가 관점은 랭킹보여주기, 데이터베이스 연결 로직입니다.
랭킹 보여주기와 데이터베이스 연결은 두 가지 모드 모두 필요한 기능이네요. 이 부가 관점에 해당하는 로직을 모듈화할 수 있게 됩니다.
이렇게 코드를 분리하면 개발자는 핵심 관점 코드에만 집중할 수 있게 될 뿐 아니라 확장성에도 좋습니다.
PSA는 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스를 말합니다.
이를 통해 어떤 기술을 사용하든 일관된 방식으로 처리할 수 있게 됩니다.
스프링 컨테이너는 빈을 생성하고 관리합니다.
더 자세히는 스프링 컨테이너는 빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너가 관리합니다.
빈은 스프링 컨테이너가 생성하고 관리하는 객체이며 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공합니다. (빈을 등록하는 방법은 여러가지입니다)
@Component // NewBean이라는 클래스를 빈으로 등록
public class NewBean {
}
궁금한 부분
이러한 코드를 어떻게 내부적으로 구현하고 있는지와 애너테이션 하나로 이러한 코드를 어떻게 동작시키는지가 궁금했습니다. 일단은 스프링부트로 API를 무리없이 작성할 수 있을정도로 공부하고나서 이러한 내부 동작을 공부해봐야겠습니다.