Computer Engineering/Spring

스프링 빈과 의존 관계

onenewkong 2023. 2. 9. 23:56

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아 넣어줌

이렇게 객체 의존 관계를 외부에서 넣어주는 것을 DI(Dependency injection), 의존성 주입이라고 함

 

 

DI에는 필드 주입, setter 주입, 생성자 주입이 있음

@Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동

 

 

스프링 빈을 등록하는 방법

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

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

 

 

컴포넌트 스캔 원리

@Component 애노테이션이 있으면 스프링 빈으로 자동 등록됨

@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문

 

 

@Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록됨

- @Controller

- @Service 

- @Repository

 

 

생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입

생성자가 1개만 있으면 @Autowired는 생략 가능

 

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록함

따라서 같은 스프링 빈이면 모두 같은 인스턴스임

 

 

추가)

 

강한 결합: 객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조

 

느슨한 결합: 객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해 넘겨받는 것

결합도를 낮출 수 있고, 런타임시에 의존관계가 결정되므로 유연한 구조를 가짐

 

<Field Injection>

 

변수 선언부에 @Autowired Annotaion 붙임

 

- 의존성 주입 쉬움

- 의존성 숨음

- 필요한 의존성을 가진 클래스를 곧바로 인스턴스화 시킬 수 없음

- 불변성 지킬 수 없음 (final 선언 불가)

- 순환 의존성

 

<Setter Injection>

 

set Method를 정의하여 사용

런타임시에 할 수 있도록 낮은 결합도 가짐

 

<Constructor Injection>

 

필수적으로 사용해야 하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있음

 

단일 생성자에 한해 @Autowired를 붙이지 않아도 됨

Spring 4.3부터 클래스를 완전히 DI Framework로부터 분리 가능

 

- null을 주입하지 않는 한 NullPointerException은 발생하지 않음

- 의존 관계 주입을 하지 않은 경우에는 Controller 객체를 생성할 수 없음

- final 사용 가능

- 순환 의존성 알 수 있음

- 의존성 주입하기 번거로움

'Computer Engineering > Spring' 카테고리의 다른 글

Repositiry / Service / Test  (0) 2023.02.01
API  (0) 2023.01.29
Controller와 GetMapping  (0) 2023.01.23