스프링 @AutoWired 주석을 통해 넣을수 있는 방법은 4가지가 존재합니다.
1.생성자 주입법
2.수정자 주입법 (setter)
3.메소드 주입법
4.필드 주입법
1.생성자 주입법
앞으로 소개할 4가지 주입법중 가장 쓰기 좋은 생성자 주입법이다.
생성자 주입법의 특징:
1. final 변수를 사용할수있다. -> 바꾸고 싶지않는 의존관계,구조를 불변성을 부여할수있음.
2. 단위 테스트하기 편하다.
3. 순환 참조를 막을수있다. -> 순환참조를 하면 StackOverFlow가 발생하는데, 그걸 방지할수있음.
2. 수정자 주입법
수정자 주입법이 필요할때가 존재하긴한다.
MemberRepository, DiscountPolicy 같은 Interface를 선택, 변경할때 사용한다.
만약에, 불변성을 가진 의존관계를 수정자 주입법으로 코딩을할경우,
setter 수정자가 Public으로 열려있어서, 수정가능한 여지를 부여하므로 지양해야 한다.
또한, 단위테스트하기 불편하다.
-> 단위테스트하기 왜 불편할까?
생성자 주입과 비교해서 보겠습니다.
수정자 주입은 OrderServiceImpl()를 해도, 컴파일 오류가 발생하지 않습니다.
->이럴경우, 개발자도 사람인지라, 의존관계를 누락할 위험이 있습니다.
->누락할경우 오류가터지죠..
->오류가 터지면 OrderServiceImpl을 다시 코드를 까봐서 의존관계를 다시 확인하고 설정해야하는 번거로움..
반면, 생성자 주입으로 테스트를 하면, 보기와같이, 빨간줄로 컴파일 오류를 발생시켜줍니다.
덤으로, 필요한 의존관계의 파라미터까지 친절하게 알려줍니다.
-> 수정자 주입에 반대로, 누락할 위험을 방지해주고 오류를 만날 확률을 줄여줍니다.
3.메소드 주입법
메소드 주입법이다. Init 메소드를통해서 의존관계를 직접 넣어주는것이다.
단도직입적으로 말하면, 쓸 이유가 전혀없다.
불변성을 나타나는 구조면 생성자 주입을 사용하면되고, 가변성을 나타내면 수정자 주입을 사용하면된다.
써도되긴하지만.. 굳이? 라는 느낌이 많이드는 방식이다.
4.필드주입법
보기에도 너무 간단하다. 하지만, 웬만해선 쓰지말자
순수 자바코드로 단위테스트를 그냥 못한다. 방법이 존재하지않는다.
예시를 들자면,
이번에 OrderService 잘 작동하는지 테스트 하려고, MemberRepository, DiscountPolicy를 넣어주려고한다.
근데... 넣을 방법이 없다
내가 Setter 수정자로 넣을방법도없고, 생성자 수정자로 새로 객체생성해서 넣을방법도 없다.
즉, 스프링 컨테이너가 생성되서 Bean이 생성되지 않는한 그냥 테스트를 못한다
순수 자바코드로 테스트가 가능한 생성자, 수정자 주입과 비교해 아주 큰 단점이다.
--------------------------------------------------------------------------------------------------------------------------------
이렇게 4가지 AutoWried 주입법을 알아보았는데,
웬만하면 생성자주입법을 사용하되, 가끔 의존관계를 선택,변경할경우 수정자(Setter)주입을 사용하자.
'자바 > 스프링(Spring)' 카테고리의 다른 글
스프링 빈 중복 조회 해결법 (0) | 2021.12.22 |
---|---|
자바 스프링 롬복(lombok) 라이브러리 (0) | 2021.12.21 |
스프링(Spring) 빈 수동등록, 자동등록 하는법 (0) | 2021.10.04 |
스프링(Spring): 싱글톤(Singleton) 패턴 (0) | 2021.10.01 |
자주쓰이는 스프링 테스트코드 정리글 (1) | 2021.09.06 |