POJO (Plain Old Java Object)
: 순수 Java만을 통해서 생성한 객체 (즉, 다른 기술 사용하지 않고 Java 및 Java의 스펙에 정의된 기술만 사용)
👉 장점
IoC (Inversion of Control, 제어의 역전)
- 기존의 개발 방식에서는 개발자가 코드를 작성하면서 필요한 객체를 직접 생성하고 조합하는 등의 제어를 수행
- 하지만 IoC 방식에서는 제어의 흐름이 개발자가 아닌 프레임워크에 의해 역전되어 객체 생성과 의존성 조합 등을 프레임워크가 수행하게 됩니다.
- 이렇게 하면 객체 간의 결합도가 낮아지고 유연한 코드를 작성할 수 있습니다.
DI (Dependency Injection, 의존성 주입)
- 객체를 생성하면서 해당 객체가 필요로 하는 의존성 객체를 외부에서 주입하는 방식
- 이렇게 하면 객체 생성 시점에 객체 간의 의존성을 완전히 분리시킬 수 있으며, 유닛 테스트 등에서도 객체를 쉽게 대체할 수 있습니다.
✍ DI 적용 전
public class Car {
private Engine engine;
public Car() {
engine = new Engine(); // 의존성 직접 생성
}
public void start() {
engine.start();
}
}
✍ DI 적용 후
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine; // 의존성 주입
}
public void start() {
engine.start();
}
}
👉 이렇게 의존성 주입은 의존성을 관리하는 일을 외부에 넘겨 주었기에 일종의 IoC로 볼 수 있는 것이다.
- 생성자 주입 (Constructor Injection)
- Setter 주입 (Setter Injection)
- 필드 주입 (Field Injection)
public class MyClass {
private MyDependency myDependency;
public MyClass(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
public class MyClass {
private MyDependency myDependency;
public void setMyDependency(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
public class MyClass {
@Autowired
private MyDependency myDependency;
}
👉 Spring 프레임워크에서는 주로 생성자 주입을 권장하며, 생성자 주입을 위해 @Autowired 어노테이션(스프링이 빈을 생성하고 의존성을 주입할 때 사용하는 어노테이션)을 사용
<생성자 주입 권장하는 이유>
1. 필수적인 의존성을 강제할 수 있습니다.
생성자 주입을 사용하면 해당 의존성이 필수적인 것이므로, 객체를 생성하는 동안 반드시 제공되어야 합니다.
따라서, 객체 생성 시점에서 필수적인 의존성을 강제할 수 있어 안정적인 프로그램 구현을 도와줍니다.
2. 불변성을 보장할 수 있습니다.
의존성이 객체 생성 시점에서 제공되기 때문에, 해당 객체는 의존성을 변경할 수 없습니다.
이는 객체의 불변성을 보장하여 코드의 안정성과 가독성을 높이는데 도움이 됩니다.
3. 테스트 용이성이 높습니다.
생성자 주입을 사용하면 의존성을 주입하기 위해 외부 컴포넌트를 사용할 필요가 없습니다.
이는 테스트 코드 작성 시 복잡도를 낮추어 테스트 용이성을 높이는데 도움이 됩니다.
" 흩어진 관심사(Crosscutting Conerns)를 모듈화 할 수 있는 프로그래밍 기법"
- 흩어진 관심사: 소스 코드상에서 계속 반복해서 사용되는 부분
- 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것
예를 들어 핵심적인 관점은 비즈니스 로직이 될 수 있고, 부가적인 관점은 핵심 로직을 실행하기 위해 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이 될 수 있다.
일종의 인터페이스 형태로 다양한 서비스 기술에 대한 추상화 계층을 제공하며, 이를 통해 개발자가 서비스 구현 기술과 상관없이 일관된 방식으로 개발할 수 있도록 합니다.
예를 들어, 스프링에서는 JDBC, JPA, JMS 등 다양한 데이터 액세스 기술을 추상화한 인터페이스를 제공합니다. 이를 이용하여 개발자는 다양한 데이터 액세스 기술을 사용할 수 있으며, 데이터 액세스 기술을 변경해야 할 경우 코드의 변경을 최소화할 수 있습니다.
Spring Boot는 스프링 프레임워크 기반의 애플리케이션을 빠르고 쉽게 개발하도록 도와주는 프레임워크입니다.