[ 스프링 ] - 스프링 핵심 원리 기본

.·2021년 6월 8일
0

스프링

목록 보기
2/2

DI, IOC

IOC : Inversion Of Control

  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것
  • 메소드나 객체의 호출작업, 객체 생명 관리, 흐름 제어를 개발자가 결정하는 것이 아니라,외부에서 결정되는 것
  • 대부분의 프레임워크에서 사용하는 방법
  • 개발자는 필요한 부분을 개발해서 끼워 넣기의 형태로 작성하고 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행

DI : Dependency Injection

  • 외부에서 의존 객체를 생성하여 전달하는 것
  • 애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결 되는 것
  • 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스 를 변경할 수 있다

Container

DI Container

  • 객체를 생성하고 관리하면서 의존관계를 연결해 주는 컨테이너
  • IOC 컨테이너라고도 불림

Spring Container

  • 스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정 정보로 사용
  • @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록
  • 스프링 컨테이너에 등록된 객체를 스프링 빈이라 부름
  • 스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용

스프링 컨테이너의 생성 과정

스프링 컨테이너 생성

스프링 빈 등록

스프링 빈 의존관계 설정 - 준비

스프링 빈 의존관계 설정 - 완료

싱글톤

싱글톤 패턴

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
  • 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다.
  • 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반

스프링 컨테이너의 싱글톤

  • 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리
  • 스프링 컨테이너는 객체 인스턴스를 싱글톤으로 관리
  • 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
  • @Bean만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다
  • 스프링 설정 정보는 항상 @Configuration 을 사용

컴포넌트 스캔

@ComponentScan, @Autowired

  • 설정 정보에 @ComponentScan을 붙여준다.
  • SpringBoot를 사용하면 @SpringBootApplication에 자동으로 포함
  • @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록
  • @Autowired 를 사용하면 생성자에서 여러 의존관계도 한번에 주입

컴포넌트 스캔 과정

@ComponentScan

@AutoWired

  • 생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입
  • 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입

컴포넌트 스캔 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controlller : 스프링 MVC 컨트롤러에서 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용
  • @Configuration : 스프링 설정 정보에서 사용

의존관계 주입

다양한 의존관계 주입 방식

  • 생성자, 수정자, 필드, 일반 메서드
  • 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장
  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계 변경 X
  • 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출 X

조회 빈이 2개 이상 - 문제

  • @Autowired 는 타입(Type)으로 조회
  • 같은 타입이 2개 이상이면 오류 발생

@Qualifier

  @Component
  @Qualifier("mainDiscountPolicy")
  public class RateDiscountPolicy implements DiscountPolicy {}
   @Autowired
  public OrderServiceImpl(MemberRepository memberRepository, 
  @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
      this.memberRepository = memberRepository;
      this.discountPolicy = discountPolicy;
}

@Primary

  • @Primary 는 우선순위를 정하는 방법이다. @Autowired 시에 여러 빈이 매칭되면 @Primary 가 우선권을 가진다.
  • @Qualifier 가 우선권이 높다.
  @Component
  @Primary
  public class RateDiscountPolicy implements DiscountPolicy {}
  
  @Component
  public class FixDiscountPolicy implements DiscountPolicy {}

스프링 빈의 이벤트 라이프 사이클

  • 스프링컨테이너생성
  • 스프링빈생성
  • 의존관계주입
  • 초기화콜백 사용 - @PostConstruct
  • 소멸전콜백 - @PreDestroy
  • 스프링 종료
profile
지금부터 공부하고 개발한것들을 꾸준하게 기록하자.

0개의 댓글