🌼DI (Dependency Injection)
의존성 주입(DI) / IoC(제어의 역전)
생성자를 통해 의존관계를 주입받는 생성자주입방식을 사용
객체가 생성되는 순간 의존관계를 설정하는 것
전에 학습에서 봤던 강한 결합은 수정이 불편하기때문에 느슨한 결합을 선택
의존성 주입은 setter,필드등 다른 방식도 있지만 생성자를 통하는것이 일반적이고 공식적인 추천 방법이다
- 의존 역전 원칙 (Dependency Inversion Principle - DIP):
- 일반적으로 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라, 둘 다 추상화에 의존해야 합니다. 예를 들어, 자동차(고수준 모듈)는 바퀴, 엔진(저수준 모듈)에 직접 의존하는 것이 아니라, 운전이라는 추상화에 의존해야 합니다. 이렇게 하면 추상화를 통해 시스템이 더 유연해지고 확장하기 쉬워집니다.
- 제어의 역전 (Inversion of Control - IoC):
- IoC는 프로그램의 제어 흐름이 역전되는 것을 의미합니다. 일반적으로 프로그램의 흐름은 사용자 코드가 제어하지만, IoC에서는 제어의 주체가 프레임워크나 컨테이너로 넘어갑니다. 예를 들어, 스프링 프레임워크에서는 개발자가 직접 객체를 생성하지 않고, 프레임워크가 객체의 생명주기를 관리하며 필요한 객체를 주입해줍니다. 이렇게 하면 코드의 결합도가 낮아져 유지보수가 쉬워집니다.
DIP는 모듈 간의 의존성을 추상화를 통해 낮추는 원칙이고, IoC는 제어의 흐름을 역전시켜 유연하고 확장 가능한 코드를 작성하는 패턴입니다.
🌼스프링 컨테이너(ApplicationContext 인터페이스)
객체의 생성,관리,조립을 담당하는 곳
개발자가 정의한 애플리케이션 내부의 빈(Bean , 객체)들의 생명주기를 관리하고 개발자가 필요로 할 때 제공
컴포넌트(component) : 스프링에서는 컴포넌트를 빈으로 등록해서 스프링컨테이너에서 관리, 애플리케이션의 구성요소, 독립적인 객체 또는 모듈
모듈(module) : 특정 기능이나 목적을 갖고 독립적으로 구성된 구성요소,특정 작업을 수행하는 프로그램의 일부
객체 생성 후 의존성 주입을 통해 빈(Bean,객체)들을 연결
- 의존,결합으로 인해 생기는 문제(유지보수어려움등..)를 신경쓰지 않아도 된다
- 의존성 주입을 통해 객체가 자동주입되기때문에 메서드호출과 매개변수 전달의 간소화
원하는 만큼 많은 객체를 가질 수 있고 인터페이스에만 의존하게 설계 가능
개발자가 작성한 코드가 컨테이너를 사용하는 순간 개발자의 손을 떠나
컨테이너의 독립적인 영역에 종속되어 그 후에 컨테이너가 관리하게 된다
1. BeanFactory : 기본적인 컨테이너
스프링 컨테이너의 최상위 인터페이스
빈을 관리하는 역할 ( 빈 등록, 생성, 조회, 돌려주기, 검색...)
getBean() 메소드를 통해 빈을 조회 -> 인스턴스화 함, 호출된 시점에 빈이 생성
@Bean 이 붙은 메서드의 이름을 스프링빈의 이름으로 사용하여 등록
2. ApplicationContext : BeanFactory를 확장한 것으로 더 많은 기능 제공
BeanFactory의 기능을 상속받은 인터페이스(인터페이스는 여러 구현체를 사용할 수 있다)
일반적으로 스프링컨테이너라 하면 ApplicationContext를 뜻한다
BeanFactory 외에 부가기능제공 - 환경변수설정, 메시지 국제화 기능, 이벤트 발생, 리소스 조회등
테스트 케이스 작성 기초
단위테스트, 테스트케이스 기능을 테스트하고 검증하기 위한 도구
스프링에서 JUnit을 제공해주는데 텍스트는 메서드 단위로 작성된다
BDD(Behavior Driven Development)
give 입력 데이터
when 실행 동작
then 결과 검증
- 주로 AssertJ 라이브러리의 Assertions 기능을 사용 메서드체이닝을 지원하기 때문에 스트림과 유사하게 여러 메서드를 연속 호출가능
🌼스프링 빈(Bean)
스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트
(스프링 컨테이너에 의해 관리되는 인스턴스화된 객체)
설정정보(BeanDefinition)와 함께 스프링 컨테이너에 등록된 객체
Java Bean과 다르다!
BeanDefinition : 스프링에서 빈의 메타데이터(설정정보)를 나타내는 인터페이스
스프링컨테이너가 Bean을 어떻게 생성,관리해야 하는지 정보를 제공
BeanDefinition은 주로 스프링의 컨테이너에 의해 사용되며, 각각의 빈에 대한 설정 정보를 가지고 있습니다. 이 설정 정보는 빈의 클래스, 스코프, 초기화 메서드, 소멸 메서드, 의존성 주입 등과 관련된 내용을 포함할 수 있습니다.
스프링 컨테이너 = 싱글톤 컨테이너
싱글톤으로 객체를 생성 관리하는 기능을 싱글톤 레지스트리라고 한다
CGLIB를 사용하기때문에 가능
빈 생명주기와 범위
컨테이너 생명주기 : 빈객체생성,의존관계주입,초기화 = 컨테이너 초기화 - 컨테이너 사용 - 컨테이너 종료
스프링은 의존관계 설정이 완료된 시점과 스프링 컨테이너의 종료직전의 시점에 지정된 메서드를 호출해
각각의 시점에 필요한 작업을 수행할 수 있도록 지원한다
InitializingBean & DisposableBean 인터페이스
9
// 초기화 단계에서 실행되는 메서드
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
// 소멸 단계에서 실행되는 메서드
public interface DisposableBean {
void destroy() throws Exception;
}
InitializingBean & DisposableBean 인터페이스는 스프링 전용 인터페이스이기 때문에
초기화와 소멸메서드의 이름을 개발자가 임의로 변경할 수 없고
직접 구현한 클래스가 아닌 외부에서 받은 라이브러리 클래스등에 두가지 인터페이스를 적용할 수 있는 방법이 없다
initMethod 속성과 destoryMethod속성을 사용해서 문제해결 가능
@PostConstruct 와 @PreDestory 애너테이션 활용
빈객체의 관리범위
스프링빈이 컨테이너와 생성과 종료를 같이하게 되는것은
빈 객체가 별도의 설정이 없는 경우 싱글톤범위(scope)를 가지기 때문이다
빈 객체의 스코프 = 빈 객체가 존재할 수 있는 범위
싱글톤 외에 프로토타입, 세션, 리퀘스트등이 더 있다
프로토타입일때 빈을 조회하면 각기 다른 객체가 반환된다
빈의 생성,의존성주입,초기화까지만 관여하고 초기화 메서드만 두번 호출될뿐 종료메서드는 더이상 호출되지 않는다
정리
스프링은 제공해준 주문서(XML,Annotation) 대로 부품을 쉽게 조립 해주는 기능 (DI)
종속성 주입
DI(Dependecy Injection) - 부품 조립 (결합력 낮아짐,쉽게 갈아끼우는 부품)
주문서대로 부품 생성,조립 후 담을 그릇 -> 컨테이너
작은부품, 큰부품생성 후 작은부품을 큰부품에 조립,결합
제어의 역전
IoC 컨테이너 (Inversion of Control) 역순으로 생성
스프링컨테이너에 의해 관리되는 인스턴스화된 객체 스프링 빈(Bean)
느낀점
진짜 먼말ㅇ이야? 진짜루....
한번 보고 못하는거 당연한거지..
학습페이지에 설명을 너무 복잡하게 해놓은거같다.....ㅜㅜ
검색해서 개념 다시 세우기
실습도 다시 해보기
🤕
'개발공부🌷 > Spring' 카테고리의 다른 글
Spring framework AOP (0) | 2023.11.17 |
---|---|
Spring Framework DI 2 (0) | 2023.11.17 |
Spring Framework 기본 (0) | 2023.11.15 |