자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크
애플리케이션 프레임워크는 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애츨리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다. 즉, 애플리케이션 프레임워크는 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크이다.
경량 컨테이너
자바 객체를 직접 관리한다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
POJO 기반의 구성
POJO란, 객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.
스프링의 주요기술인 IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능 기술이다. DI는 유연하게 확장가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이내믹하게 설정해준다. 이런 DI의 개념을 스프링은 애플리케이션 전반에 걸쳐 적용한다.
DI를 통한 객체간의 관계 구성
밑에서 추가 설명 예정
AOP 지원
AOP(Aspect Oriented Progreamming) : 관점 지향 프로그래밍
대부분의 시스템에서 비즈니스 로직은 아니지만 보안, 로그, 트랜잭션과 같이 반드시 처리가 필요한 부분을 횡단 관심사라고 합니다. 스프링에서는 이러한 관심사를 비즈니스 로직과 분리하여 중복된 코드를 줄이고 개발자가 비즈니스 로직에 집중하도록 만들어 줍니다.
WAS에 독립적인 개발환경
스프링을 한다고 한다면 이 부분에 대해서 꼭 알 필요가 있다고 본다.
어떤 객체에 스프링 컨테이너가 또 다른 객체와 의존성을 맺어주는 행위
인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다
의존성 주입 방법
생성자 주입 방식을 권장하고 있다.
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
원래는 이렇게 해야 하지만 @RequiredArgsConstructor를 통해 편리하게 생성자를 주입할 수 있다.
@Service
@RequiredArgsConstructor
public class OrderService {
private final DiscountPolicy discountPolicy;
...
}
프로그램의 제어흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 의미한다.
기존에는? 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다.
기깔찬 예시가 있어서 이해하기가 너무 쉬웠다!!!!
요약을 하자면 먼저 이렇게 클래스와 인터페이스가 존재한다고 할때
서비스단에서는 3번과 4번(중 하나)를 다 의존하게 된다.
만약 할인정책이 변경이 된다면? 기존 프로그램의 제어 흐름을 직접 제어할 경우에는 직접 하나하나 객체 생성 코드들을 수정해줘야했다.
근데 만약 여기저기서 정책 관련 의존 객체들이 많다면...?
실례합니다. 혹시 변경 좀 할게여
하고 열심히 찾아서 다 수정해줘야하는 것
이를 개선하기 위한 방법이 서비스 내에서 구현 객체를 정해주지 않고 외부에서 구현 객체를 주입해주는 것이다.
그래서
public class AppConfig {
public OrderService orderService() {
return new OrderServiceImpl(discountPolicy());
}
public FixDiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
-----------------------------------------------------------------
<Service Class>
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
서비스 객체가 생성될 때 의존적인 정책 객체이 들어가게 잘 생성하는 역할까지 다른 곳에서 관리를 하게 되고, 서비스 클래스에서는 제어 흐름에 관여하지않아도 된다!
Serivce객체를 선언하면서 의존성 객체들을 주입을 내가 해줄 필요도 없고!
다른 곳에서 해준다는 것이다. 이 AppConfig 같은 역할을 스프링이 해줄 것이라는 것
스프링에서는 스프링 컨테이너 ApplicationContext를 이용하여 설정 정보를 생성, 등록하고 필요한 객체를 생성자 혹은 setter를 통해 주입한다.