스프링 프레임워크는 자바플랫폼을 위한 오픈소스 애플리케이션 프레임워크이다. 자바 개발을 위한 프레임워크로 종속 객체를 생성해주고, 조립해주는 도구로써 주요 기능으로 DI, AOP, MVC, JDBC를 제공한다.
스프링은 내부적으로 객체 간의 관계를 구성할 때 별도의 API 등을 사용하지 않는 POJO(Plain Old Java Object)만으로 구성이 가능하도록 되어있다. 따라서, 일반적인 Java 코드를 이용하여 객체를 구성하는 방식 그대로 스프링에서 사용이 가능하다.
이것은 특정한 라이브러리나 컨테이너에 기술에 종속적이지 않다는 것을 의미한다. 이로 인하여 개발자는 가장 일반적인 형태로 코드를 작성하고 실행할 수 있기 때문에 높은 생산성과 유연한 테스트를 할 수 있는 장점을 갖게 된다.
DI을 이해하기 위해서는 IoC(제어의 역전)의 개념을 알고 넘어가야 한다.
스프링을 쓰기 전에는 개발자가 프로그램의 흐름을 제어하는 주체였다.
스프링에서는 프로그램의 흐름을 프레임워크가 주도하게 된다.(ex. @Autowired 등으로 Bean을 자동 주입)
객체의 생성~ 생명주기 관리를 컨테이너가 도맡아서 하게 된 것이다.
즉, 제어권이 컨테이너로 넘어가게 되고, 이것을 제어권의 흐름이 바뀌었다고 하여 IoC이라고 하게 된다.
제어권이 컨테이너로 넘어옴으로써 DI, AOP(관점 지향 프로그래밍)등이 가능하게 된다.
각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말함.
Setter Injection(Setter 메서드를 이용한 의존성 삽입) : 의존성을 입력 받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.
Constructor Injection(생성자를 이용한 의존성 삽입) : 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
Method Injection(일반 메서드를 이용한 의존성 삽입): 의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입한다.
Spring DI 컨테이너의 개념
Spring DI 컨테이너가 관리하는 객체를 빈(bean)이라 하고, 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)라고 부른다.
객체의 생성과 객체 사이의 런타임(run-time) 관계를 DI 관점에서 볼 때는 컨테이너를 BeanFactory라고 한다.
BeanFactory에 여러가지 컨테이너 기능을 추가하여 애플리케이션 컨텍스트(ApplicationContext)라고 부름,.
BeanFactory
ApplicationContext
관점지향 프로그래밍을 위한 풍부한 지원을 한다. 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다.
참고 출처
https://mo-world.tistory.com/
https://dog-developers.tistory.com/12
https://shlee0882.tistory.com/200
https://coding-restaurant.tistory.com/102
https://coding-restaurant.tistory.com/102