본문 바로가기
웹 개발/Java Spring

스프링의 다양한 의존관계 주입방법

by 동배_ 2021. 8. 7.

먼저 의존관계 주입이 무엇인가에 대해 알고자 한다면 https://donghs1541.tistory.com/14 를 참고해주길 바란다.

의존관계 주입은 크게 4가지 방법이 있다.
생성자를 생성할때 하는 주입
setter를 이용한 주입
필드 주입
일반 메서드를 이용한 주입이 있다.

순서대로 알아보자

생성자 주입

이 방법은 생성자를 통해서 의존관계를 주입받는 방법이다. 생성자는 우리가 객체를 생성 할때 가장 먼저 1번 불러와지는 메소드로 클래스의 초기값을 설정하는 부분을 담당한다.

의존관계를 주입할 때는 생성자 주입을 권장하며 가장 많이 사용되는 방법이다. 그리고 스프링에서 지원하는 의존관계를 자동으로 주입해주는 것도 이방법을 사용한다.

생성자 의존관계주입

필드에서 인터페이스를 선언한 후 생성자의 매개변수를 통해 인터페이스에 객체를 주입한다. (의존관계주입)
이러한 방법은 불변, 필수 의존관계에 사용된다. 그리고 엥간하면 불변하기 때문에 final을 통해 선언 후 생성자로 주입시킨다.(@Autowired는 생성자가 1개일경우 자동 주입 되므로 생략가능하다.)

setter를 통한 주입

먼저 setter란 무엇일까? 이에 대해 간단히 설명한다.
객체지향 프로그래밍을 할때 객체지향(캡슐화, OCP 등을) 지키기위해 private로 변수들을 선언한 후 getter/setter를 통해 값을 교환한다.  setter는 필드의 변수를 설정할때 getter는 변수의 값을 불러올때 사용 되는데 이러한 방법을 자바빈 프로티 규약이라 한다.

앞셔 말한  setter를 통해 의존관계를 주입하는 방법이 있다.

이를 사용하는 이유는 선택, 변경 가능성이 있는 의존관계에 사용 된다.

이러한 방법을 통해 의존관계를 주입한다 여기서는 생성자와 다르게 @Autowired를 해야한다. 그리고 final을 이용할 수 없다.

필드 주입

이건 필드에 바로 주입하는 방법이다. 이 방법이 제일 간단하다 .


이 방법 하나면 의존관계 주입을 끝낼 수 있다. 하지만 이러한 방법은 외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점이 있다. 그리고 저기 물결 표시에 커서를 대면


이러한 글이 뜬다 즉 필드를 통해 의존관계를 주입하는 방법은 추천하지않는다.

일반 메서드 주입

말 그대로 메서드를 만들어서 주입 할 수 있다.
한번에 여러 필드를 주입 할 수 있으며 여기서 하는 생성자의 의존관계 주입 방법과 유사하다.
일반적으로 잘 사용하지 않으며 외부에 의해 값이 변경 될 수 있으니 특별한 상황이 아니면 쓰지말자.


여기까지 의존관계 주입 방법에 대해 알아보았다. 그렇지만 막상 개발을 해보게 되면 대부분은 다 불변이여서 생성자에 final 키워드를 사용하게 된다고 한다.
그런데 또 스프링, 스프링 부트 같은 것이 나온 이유는 뭔가? 개발을 편하게 하기 위해서이다. 이런 의존관계 주입을 정말 간단하게 할 수 있는 방법이 있다. 그 것은 바로 lombok을 사용하는 것이다.

lombok(롬복)

롬복은 plugin을 통해서 받을 수 있다. (그 외에도 초기 스프링 프로젝트를 개설할때 롬복 라이브러리를 받으면 된다.)
롬복의 소개와 설치방법은 https://taetaetae.github.io/2017/02/22/lombok/ 를 통해 간단하게 보는 것을 추천한다. (간단하게 설명 잘해놓음)

그래서 이를 설치하면 어떻게 되는지 확인해보자

이게 끝이다 ! 필드를 통한 의존관계 주입보다 훨씬 쉽다. @RequiredArgsConstructor라는 어노테이션을 적으면 클래스 내의 모든 final 필드를 생성자를 통해 자동으로 의존관계를 주입해준다.

즉 롬복이 생성자를 알아서 자동으로 만들어 설정해준다. 정말 간단하다. 현재 실무에서도 이 방법을 가장 많이 쓰인다고?한다 (내가 들은 강의 피셜)


이렇게 의존관계를 어떻게 주입하는지 여러 방법을 알아보았다. 물론 마지막방법이 가장 쉽고 편리하지만 롬복 이용하기 전에 왜 이러한 방법을 쓰게 됐고 다른 방법에 비해 장점, 단점 등을 알아보기위해 공부했고 글을 적었다.

댓글