본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

Spring과 의존성 주입 (DI)

의존은 변경에 의해 영향을 받는 관계를 의미한다.
DI는 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방법을 말한다.

의존성 주입 위치별 특징

의존성을 주입하는 방법은 크게 3가지이다.

1. Constructor Injection
클래스를 생성할 때, 모든 의존성 객체를 주입하기 때문에 NPE 문제를 방지할 수 있다.
final 인자를 사용할 수 있기 때문에 불변성을 유지할 수 있다.
반면, 여러 객체를 의존하고 있는 경우 의존성 객체를 주입하는 코드가 복잡해지고 이해하기 어려워진다.
그러나 여러 객체를 의존한다는 것은 SRP (단일 책임 원칙)을 위배하는 것이기 때문에 베드스멜인 상황이다.
의도적으로 의존 객체를 줄여야한다는 위기의식을 줄 수 있기 때문에 권장되는 방식이다.

2. Setter Injection
주입하는 클래스의 이름을 확인할 수 있어 가시성이 있다.
그러나 의존성 주입을 놓치면, NPE 오류가 발생할 수 있다.

3. Field Injection
해당 방법은 읽기 쉽고 의존성을 선언하기 쉽다는 장점이 있다.
그러나 여러 클래스를 필드에 선언하여, 의도치않게 여러 클래스에 의존하는 코드가 늘어날 수 있다.
그리고 필드에 final을 선언할 수 없어서, 불변성을 유지할 수 없다.

의존 객체 주입

의존 관계가 있는 객체를 주입하는 방법은 xml 파일에 객체 관계를 명시하는 방법과
스프링 컨테이너가 의존성 자동 주입을 처리해주는 방법이 있다.
의존성 자동 주입은 @Autowired, @Resource 어노테이션으로 선언한다.
전자는 타입으로 빈에서 의존성 객체를 조회하고, 후자는 필드명으로 빈에서 의존성 객체를 조회한다.

참고


초보 웹 개발자를 위한 스프링5 프로그래밍 입문 3장

https://velog.io/@gillog/Spring-DIDependency-Injection-%EC%84%B8-%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95#construtor-injection%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
https://dololak.tistory.com/565