[스프링] 의존성 주입하는 2가지 방법

춘자쓰·2022년 3월 14일
2

https://1-7171771.tistory.com/105
http://melonicedlatte.com/2021/07/11/232800.html
위 문서를 참고하여 스터디용으로 작성된 문서입니다.

Spring Been 이란?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean) 이라고 부른다.
기존의 JAVA 에서는 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후에 사용했다.
하지만 Spring에서는 직접 new를 이용하여 생성한 객체가 아니라, Spring에 의하여 관리 당하는 자바 객체를 사용한다.
이렇게 Sprung에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 한다.


의존성 주입하는 2가지 방법

(Spring Been을 Spring IoC Container에 등록하는 방법)

  • 컴포넌트 스캔과 자동 의존관계 설정

  • 자바 코드로 직접 스프링 빈 등록하기


1. 컴포넌트 스캔과 자동 의존관계 설정

  • 컴포넌트 스캔의 원리는 기본적으로 @Component 어노테이션이 있으면 자동으로 스프링 빈으로 등록된다.
    @Component 어노테이션은
    @Controller, @Service, @Repository를 포함한다.

-Controller

-Service

-Repository

2. 자바 코드로 직접 스프링 빈 등록하기

필요한 의존 객체의 "타입"에 해당하는 빈을 찾아 주입하는 역할을 한다.

  • 생성자
  • setter
  • 필드

위의 3가지의 경우에 Autowried를 사용할 수 있다.
기본값은 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면
애플리케이션 구동에 실패한다.

생성자 주입

생성자에 의존성 주입을 받고자 하는 field를 나열하는 방법
가장 권고되는 방법이다.
필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제함
spring 4.3이상부터는 생성자가 하나인 경우 @Autowried를 사용하지 않아도 됨
어쩔 수 없는 순환 참조는 생성자 주입으로 해결하기 어려움

필드

멤버 필드에 @Autowired annotation을 선언하여 주입받는 방법
가장 간다한 선언방식
의존관계가 눈에 잘 보이지 않아 추상적이고 이로 인해 의존성 관계가 과도하게 복잡해질 수 있음

Setter 셋팅

setter 메소드에 @Autowired annotation를 선언하여 주입받는 방법
(메소드 이름을 setter 대신에 다른 걸로 하여도 주입은 가능하지만 권고사항x)
의존성이 선택적으로 필요한 경우에 사용
생성자에 모든 의존성을 기술하면 과도하게 복잡해질 수 있는 것을 선택적으로 나눠 주입할 수 있게 부담을 덜어줌
의존성 주입 대상 필드가 final 선언 불가

따라서 만약 같은 타입의 빈이 위의 상황처럼 여러개 일 때
내가 만약 MyBookRepository를 빈으로 등록하고 싶다면
@Primary 라는 어노테이션을 추가해주면 MyBookRepository가
빈으로 등록된다.

또 다른 방법으로는 @Qualifier라는 어노테이션을
이용하는 것인데 일반적으로 빈의 이름은 클래스 이름의 스몰케이스이다.

profile
프사라도 귀여워야지

0개의 댓글