백엔드 데브코스 TIL 12-13일차

Inchang Choi·2022년 4월 6일
0

백엔드 데브코스 TIL

목록 보기
10/30
post-thumbnail

학습목표

강의를 들으며 내가 알고 있는 내용을 점검하고,

새로 배운 내용을 정리하며,

궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다.


Inversion of Control

기존에는 사용자가 어떤 클래스를 사용하여 객체를 생성할 건지에 대해 결정했다면,

제어의 역전이란 거꾸로 프레임워크가 애플리케이션 코드를 사용하여 어떤 객체를 생성할 건지에 대해 결정하는 것 입니다.

즉, 사용자가 자신이 사용할 객체를 스스로 선택하는 방식이 아닌 프레임워크에 의해 결정되는 것 입니다.

이러한 방식을 제어 흐름의 역전, 제어의 역전이라고 부릅니다.

이를 The Hollywood Principle이라고도 합니다.

Spring에서는 생성에 대한 책임을 IoC 컨테이너에게 부여하여 객체의 생명주기를 관리하게 합니다.

Application Context

IoC 컨테이너에서는 개별 객체들의 의존 관계 설정이 자동으로 이루어지며 객체들의 인스턴스를 만들어주고,

컨테이너가 객체들의 생명주기를 관리합니다.

스프링에서는 BeanFactory를 상속받는 Application Context라는 Interface를 제공합니다.

이 Application Context를 통하여 생성 정보와 연관 관계 정보에 대한 설정을 읽어 처리 합니다.

여기서 Bean은 어플리케이션 컨텍스트, 빈팩토리, IoC 컨테이너에 의해 관리 되어지는 객체를 의미합니다.

즉 Application Conetxt는 클라이언트가 Bean을 요청하면 @Configuration이 붙은 클래스를 호출하여 @Bean 생성을 요청하고, 빈을 반환 합니다.

Configuration Metadata

Application Context는 Bean 정보를 설정 메타데이터로부터 받아옵니다.

이 메타데이터를 이용해서 IoC 컨테이너에 의해 관리되는 객체를 생성하고 구성합니다. 어플리케이션에서 객체들의 도면이라고 볼 수 있습니다.

인터페이스인 Application Context가 어떤 메타데이터를 받느냐에 따라 각기 다른 구현체로 구현 할 수 있습니다.

  • XML 기반 → GenericXmlApplicationContext
  • Java 파일 기반 → AnnotationConfigApplicationContext

IoC는 다양한 패턴들을 지원합니다.

  • 전략 패턴
  • 서비스 로케이터 패턴
  • 팩토리 패턴
  • 의존관계 주입 패턴

Dependency Injection

의존성 주입은 IoC를 구현하는 하나의 패턴이라고 할 수 있습니다.

생성자를 통해서 객체를 주입 받는 패턴을 생성자 주입 패턴(Constructor-based DI)이라고 합니다.

이 외에 스프링은 세터(setter-based Di)기반의 패턴도 지원합니다.

생성자 주입방식은 아래와 같은 장점을 가집니다.

  • 의존관계 설정이 되지 않으면 객체생성이 불가하기 때문에 컴파일 타임에 확인할 수 있으며, NPE 방지가 가능합니다.
  • 의존성 주입이 필요한 필드를 final 로 선언가능 하기 때문에 immutable합니다.
    • 멀티 스레드 환경에서 Thread-safety를 보장합니다.
  • 잘못된 패턴을 찾을 수 있게 도와줍니다.
    • BeanCurrentlyInCreationException
  • 테스트 코드 작성이 용이합니다.
    • 생성자 주입을 통해 mock 객체를 넣어 테스트 가능

컴포넌트 스캔으로 Bean 등록하기

컴포넌트 스캔은 스프링이 직접 클래스를 검색하여 빈으로 등록해주는 기능입니다.

설정 클래스에 빈으로 직접 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있습니다.

스프링이 자동으로 등록할 대상을 찾게 하기 위하여 @StereoType으로 스캔 할 대상을 지정할 수 있습니다.

스테레오타입 어노테이션이 특정 요소를 상황이나 도메인에 맞게 분류해 주는 것입니다.

@Autowired

자동으로 주입 가능한 빈이 두 개 이상이면 어떤 빈을 주입 할지 스프링에게 알려줘야 합니다.

@Primary 로 우선순위를 지정할 수 있습니다.

@Qualifier(”use_case”) 또는 우선순위가 동등하다면 역할을 구분해서 사용할 수 있습니다.

@Configuration 또한 컴포넌트 스캔의 대상이 되기 때문에 설정을 여러 파일로 분리하고 메인이 되는 클래스에서 컴포넌트 스캔으로 불러 오는 방식을 주로 사용합니다.

Bean Scope

스프링에서 빈은 기본적으로 싱글톤이지만, 필요에 따라 다른 스코프로 구성할 수 있습니다.

source : (https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes)

Bean Lifecycle Callbacks

빈의 생명주기는 생성, 의존 설정, 초기화, 소멸의 단계를 거칩니다.

Bean Factory는 기본적인 DI를 지원하는 가장 간단한 형태의 컨테이너입니다.

getBean() 메서드가 호출 되면 빈을 생성합니다.

Application Context는 BeanFactory를 상속한 컨테이너 입니다.

context가 시작 하기 전 모든 빈을 생성하고 로딩하여, 원하는 시기에 사용할 수 있습니다.

Bean 생명주기 콜백

  1. @PostConstruct이 적용된 메소드 호출
  2. 빈이 InitializingBean 인터페이스 구현시 afterProperites 호출
  3. @Bean의 initMethod에 설정한 메소드 호출

Bean 소멸주기 콜백

  1. @PreDestory이 적용된 메소드 호출
  2. 빈이 DisposableBean 인터페이스 구현시 destroy 호출
  3. @Bean의 destroyMethod에 설정한 메소드 호출
profile
always positive

0개의 댓글