Java 애플리케이션 개발을 위한 포괄적인 인프라 지원을 제공하는 Java 플랫폼
└── 스프링이 인프라를 처리하므로 개발자는 애플리케이션 개발(비즈니스 로직)에 집중 가능
백엔드 오픈소스 프레임워크
제어의 역전은 개체 또는 프로그램 부분의 제어를 컨테이너 또는 프레임워크로 이전하는 기능
기존의 프로그래밍은 개발자가 코드 상에서 라이브러리
를 직접 호출하고 작성한 코드의 흐름대로 프로그램이 작동한다. 하지만 스프링을 사용하면 의존성 주입
에 의해 프레임워크
가 개발자의 코드를 호출하는 형태가 된다.
의존성 주입은 프레임워크가 객체를 생성해서 의존 관계에 있는 객체에 대입해주는 기능
객체의 의존 관계
는 한 객체에서 다른 객체를 참조하는 관계를 의미한다. 아래의 코드에서 ParkingLot
객체는 Car
객체에 의존하고 있으며, ParkingLot
이 직접 Car
객체의 생성을 관리하고 있다.
class ParkingLot {
private Car car;
public ParkingLot() {
this.car = new Venz();
}
}
interface Car {}
class Venz implements Car {}
class Lamborghini implements Car {}
이러한 구조에는 한 가지 문제점이 있는데, 바로 두 객체가 강한 결합
을 이루고 있다는 점이다. 만약 주차장에 있는 차가 Venz
가 아니라 Lamborghini
라면 ParkingLot
클래스를 직접적으로 수정해줘야한다.
class ParkingLot {
prviate Car car;
public ParkingLot() {
this.car = new Lamborghini();
}
}
...
변경사항이 있을 때마다 코드를 일일이 수정하는건 너무나 번거로운 일이다😫 따라서 내부
에서 직접 new
연산자를 통해 객체를 생성하는 방법보다는 외부에서 객체를 생성한 후 주입해주는 방법을 사용함으로써 두 객체를 따로 관리할 수 있다. 생성자
와 Setter
를 이용해서 외부로부터 객체를 주입받는 방법이다.
class ParkingLot {
private Car car;
// Constructor
public ParkingLot(Car car) {
this.car = car;
}
// Setter
public void setCar(Car car) {
this.car = car;
}
public class Main {
public static void main(String[] args) {
Car car = new Venz();
// 생성자를 이용한 객체 주입
ParkingLot parkingLot = new ParkingLot(car);
// Setter를 이용한 객체 주입
parkingLot.set(car);
}
}
이로써 ParkingLot
객체와 Car
객체를 분리해서 관리할 수 있게 됐지만, 외부에서 주입하더라도 개발자가 객체를 직접 생성해야함에는 변함이 없으며 Car
객체를 Venz
에서 Lamborghini
객체로 변경하고 싶을때 수작업으로 변경해줘야하 하는 사실도 여전하다!
스프링 프레임워크를 사용하면 Dependency Injection
기능에 의해 객체들의 관계를 느슨한 결합
형태로 관리할 수 있다. 개발자가 직접 객체를 생성하지 않고 스프링 설정 파일에 객체 정보를 기술함으로써 스프링이 객체를 생성해주고 의존 관계가 있는 곳에 주입해준다.
📌 Spring Framework Reference Documentation
📌 Intro to Inversion of Control and Dependency Injection with Spring