빙응의 공부 블로그

스프링 기본편 생각정리 본문

정리

스프링 기본편 생각정리

빙응이 2024. 1. 6. 15:01

📝팩토리 패턴과 IoC

  • 팩토리 패턴은 외부의 클래스가 직접 관계를 설정해주는 것이다.
  • 이것을 관심사의 분리라 하며 외부에서 의존성 설계하는 것을 IoC의 한 종류이다.
    • IoC는 제어의 역전 제어 흐름을 외부가 하는 것이다.  

📝DI 와 IoC

  • 스프링에는 AppConfig처럼 객체를 생성하고 관리하는 스프링 컨테이너가 존재한다.
  • 이것은 Bean이라는 객체를 자동 생성, 관리, 주입을 하여 IoC의 기능과 의존관계(DI)를 자동 주입한다.

📝스프링 컨테이너와 빈

  • 스프링 컨테이너는 생성 - 빈 등록 - 의존관계 설정 순으로 작동한다.
  • BeanDefinition - 스프링은 다양한 설정 형식을 제공하며 BeanDefinition을 통해 추상화를 제공한다.

📝웹 애플리케이션과 싱글톤

  • 스프링은 대부분 웹 애플리케이션이다. 그리고 웹 애플리케이션의 특성은 다중 처리이다.
  • 그러므로 스프링 컨테이너는 객체에 대해 1개만 생성하는 싱글톤 패턴을 적용한다.
    • 싱글톤 패턴은 무상태로 설계하는 것이 중요하다.(무조건 무상태는 아니다)
    • 싱글톤의 보장은 CGLIB의 바이트 코드 조작을 통해 가상의 객체를 만들어 사용한다.

📝컴포넌트 스캔과 의존관계 자동 주입

  • 스프링은 설정 정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.
  • 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan을 설정 정보에 붙여주어야 한다.
    • 스캔 제외를 할 수 있는 기능도 존재한다.
  • @Autowired는 컴포넌트 스캔 시에 의존관계 주입을 담당하는 역할이다.
    • 컴포넌트 스캔은 단지 빈에만 등록하는 것이기 때문이다. 

 

📝의존 관계 주입 

  • 생성자 주입 : 이름 그대로 생성자를 통해서 의존관계를 주입 받는 방법이다.
    • 장점은 불변, 필수 의존 관계이다. 
  • 수정자 주입 : setter을 이용한 주입 방식
    • 선택 변경 가능성이 잇는 의존관계에 사용한다.
  • 필드 주입 : 이름 그대로 필드에 값을 넣어버림, 사용 X
  • 일반 주입 : 사용안함 생략 
  • @Autowired의 null 값 옵션 처리 방법 들이 있다.
    • @Autowired(required=false)
    • org.springframework.lang.@Nullable
    • Optional<>
  • 결론 : 생성자 주입을 사용하라 

📝의존 관계 주입2

  • 조회 빈이 2개 이상인 문제
  • @Autowired는 타입으로 조회하기 때문에 ac.getBean과 유사하다.
  • 그래서 같은 타입을 인터페이스 받는 것에서 오류가 발생한다. NoUniqueBeanDefinitionException
  • 해결방법
    • @Autowired 필드 명 매칭 : @Autowired는 타입 매칭을 시도하고 이때 여러의 빈이면 필드, 파라미터로 추가 매칭
    • @Quilifier : @Quilifier을 통해 하위 타입을 지정해 줄 수 있다.
    • @Primary:  우선순위를 정하는 방법이다. 

 

📝빈 생명주기 콜백 

  • 빈 생명주기 콜백이란 스프링을 통한 초기화 작업과 종료 작업 진행을 말한다.
  • 스프링 빈의 라이플사이클
    • 스프링 컨테이너 생성- 스프링 빈 생성- 의존관계 주입- 초기화 콜백 - 사용 - 소멸전 콜백- 스프링 종료
  • 인터페이스 콜백 : 위 라이프사이클에는 2개의 콜백이 존재하였다. 콜백 시에 로직을 만드는 것이 가능하다.
    • implements InitializingBean : 초기화 메서드 후에 일어나는 콜백이다.
    • implements DisposableBean : 스프링 컨테이너 종료가 호출되면 호출된다. 
  • 초기화, 소멸 메소드 지정 
    • @Bean -> @Bean(initMethod = "init", destroyMethod = "close")
      • @Bean 애노테이션을 통해 메소드를 지정할 수 있다. 
  • 애노테이션으로 지정
    • @PostConstruct
    • @PreDestory

 

📝빈 스코프 

  • 빈 스코프는 말 그대로 빈이 존재할 수 있는 범위를 뜻한다.
  • 스프링의 스코프
    • 싱글톤
    • 프로토타입
    • request, session, application 
  • 프로토타입 스코프는 인스턴스의 생성+ DI 만 책임진다. 
  • ObjectProvider 
    • 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공한다. 
  • 웹 스코프 : 웹 환경에서 동작하는 스코프 
    • request 스코프 : HTTP 요청 하나가 들어가고 나갈 때까지 유지되는 스코프이다. 
    • 웹 스코프 지연 생성 방식을 통한 문제 해결에 대한 것은 자세한 포스팅에서 봐야한다.

[Spring]스프링 핵심 원리 - 빈 스코프 (tistory.com)

 

[Spring]스프링 핵심 원리 - 빈 스코프

📝빈 스코프 지금까지 학습에서 스프링 빈이 스프링 컨테이너가 생성될 때 함께 생성되어 스프링 컨테이너가 종료될 때 같이 종료된다고 학습하였다. 이것은 스프링 빈이 기본적으로 싱글톤

quddnd.tistory.com

 

'정리' 카테고리의 다른 글

[Spring]스프링 참고 정리  (0) 2024.02.12