2023. 12. 27. 11:50ㆍ개발/Spring
IoC(제어의 역전)
- 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미
-- 제어 : 객체 생명주기나 메서드의 호출을 직접 제어(관리)한다
EX)
public class A {
private B b;
public A(){
this.b = new B();
}
}
-- 역전 : 프로그램의 제어흐름을 직접 제어(관리)하는 것이 아니라 역전시켜 외부에서 관리하는 것
EX)
public class A {
private B b;
public A(B b){
this.b = b;
}
}
-- pattern : Service Locator, Factory, Template Method, Strategy, Dependency injection 등 존재
DI(의존성 주입)
- 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입 시켜주는 방식.
-- 의존성 : 클래스 간 의존 관계(의존성)가 있다면, 한 클래스가 바뀌면 다른 클래스도 영향을 받는다.
-- 주입 : 의존성을 다른 곳으로부터 주입해주는 것이다.
EX) 적용전
public class Pizza {
Bread bread;
Cheese cheese;
Sauce sauce;
public Pizza(){
this.white = new WhiteBread();
this.mozzarella = new MozzarellaCheese();
this.chili = new ChiliSauce();
}
}
EX) 적용후
public class Pizza {
Bread bread;
Cheese cheese;
Sauce sauce;
public Sandwitch(Bread bread, Cheese cheese, Sauce sauce){
this.bread = bread;
this.cheese = cheese;
this.sauce = sauce;
}
}
-- 주입 방법 : 생성자 주입, Setter 주입, interface 주입
-- Spring 에서 DI 방식 : @Controller, @Service
--- Controller 에서 Service를 호출할때, Service를 받는 생성자가 어딘가에서 호출되어야 하지만 instance를 주입하는 코드를 쓰지 않아도 가능하다.
--- 의존관계 자동 주입 : @Autowired는 스프링 컨테이너가 주입하려 하는 객체의 타입이 일치하는 객체를(등록된 스프링 빈을) 찾아서 자동으로 주입
EX)
@Autowired
public OrderService(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
DIP 의존관계 역전 원칙 : DIP(Dependency Inversion Policy)는 추상화에 의존해야한다. 만약 DIP를 적용하지 않는다면 의존성을 분리시켜야 한다.
EX) DIP 적용 전 DI
public class Pizza {
WhiteBread white;
MozzarellaCheese mozzarella;
ChiliSauce chili;
public Sandwitch(WhiteBread white, MozzarellaCheese mozzarella, ChiliSauce chili){
this.white = white;
this.mozzarella = mozzarella;
this.chili = chili;
}
}
EX) DIP 적용 후 DI
public class Pizza {
Bread bread;
Cheese cheese;
Sauce sauce;
public Sandwitch(Bread bread, Cheese cheese, Sauce sauce){
this.bread = bread;
this.cheese = cheese;
this.sauce = sauce;
}
}
IoC와 DIP의 차이 : 목적은 같지만 IoC는 제어의역전, DIP는 의존방향의 역전
PSA(Portable Service Abstraction) : 쉬운 서비스 추상화
POJO : 단순히 자바 객체를 사용하겠다
AOP(Aspect Oriented Programming)
- 애플리케이션의 핵심적인 기능과 부가적인 기능을 분리해 각각 모듈화하는 방법, 관점 지향 프로그래밍
-- 공통 모듈인 인증, 로깅, 트랜잭션 처리에 용이
-- Spring AOP의 특징 : 프록시 기반의 AOP 구현체이다
스프링 빈에만 AOP를 적용할 수 있다
-- Spring에서 AOP 적용 : @Aspect 클래스 명시, @Componet를 통해 빈으로 등록. @Before, @After, @Around 등의 어노테이션을 통해 타겟
매서드의 Aspect실행 시점을 지정할 수 있다.
Spring 컨테이너 : 스프링에서 자바 객체들(빈)을 관리하는 공간을 의미한다. (싱글톤으로 관리)
-- Spring 컨테이너의 종류 : BeanFactory, ApplicationContext
Spring Bean : 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다.
-- 싱글톤 빈 : 스프링 컨테이너에서 한 번만 생성되며, 컨테이너가 사라질때 제거된다.
--- 왜 싱글톤으로 빈을 만들까 ? 자바 엔터프라이즈 서버환경이란 서버 하나당 최대로 초당 수십에서 수백번씩 브라우저나 다른 시스템으로부터의 요청을 받아 처리할 수 있는 높은 성능을 요구되는 환경이다.
요청이 들어올 떄마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유하기 때문에 효율적인 사용이 가능하다.
--- 싱글톤 빈은 Thread-Safe 한가 ? 초기 한번만 초기화되어 애플리케이션이 종료될 때까지 메모리에 남아있는다. 만약 싱글톤이 상태를 갖게 된다면 멀티 스레드 환경에서 동기화 문제가 발생할 수있다.
-- 스프링 빈 스코프 : 빈이 생성되고, 존재하고, 적용되는 범위를 빈의 스코프라고 한다.
-- Bean 라이프 싸이클 : 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
--- 콜백 메서드 : 콜백 메서드를 등록하면 특정 이벤트가 발생했을 때 해당 메소드가 호출된다.
-- Spring에서 Bean 등록
1. 컴포넌트 스캔과 자동 의존성 관계 설정
- @Componet를 사용하면 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
- @Componet의 경우 클래스 또는 인터페이스 단위에 붙일 수 있다.
2. 자바 코드로 직접 스프링 빈 등록
- @Configuration 어노테이션을 붙이고 해당 클래스 안에서 빈으로 등록할 메서드를 만들어 @Bean을 붙여 주면 자동으로 해당 타입의 빈 객체가 생성된다.
- @Bean의 경우 메소드 또는 어노테이션 단위에 붙일 수 있다.
Spring Boot : Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
'개발 > Spring' 카테고리의 다른 글
Spring - 좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.10.03 |
---|---|
Spring - Spring 이란? (0) | 2023.08.22 |