[Spring] 스프링에서 의존성을 주입하는 방법

    1. 시작하며

    의존성을 주입하기 위해 필드에 @Autowired 를 사용하면 편리하지만 intellij나 sonarLint 에서 Constructor Injection 을 사용하라는 warning을 발생시킨다.
    왜 경고가 발생하는지 스프링에서 의존성을 주입하는 방법을 알아보자.

    2. Inversion of Control, DI(Dependency Injection) 이란

    Inversion of Control (제어의 역전 - IoC)

    일명 할리우드 원칙이라고도 불린다.

     

    don’t call me, I’ll call you.
    나를 부르지 마라, 내가 너를 부를 것이다.

     

    메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다.

     

    이 방식은 대부분의 프레임워크에서 사용하는 방식으로, 개발자는 필요한 부분을 개발해서 '끼워넣기' 형태로 개발하고 실행하게 된다. 이렇게 조립된 코드의 최종 호출은 개발자에 의해 이루어지지 않고 프레임워크 내부에서 결정된 대로 이루어지게 되는데 이를 제어의 역전 이라고 한다.

    DI(Dependency Injection)

    의존성 주입은 제어의 역행이 일어날 때 스프링이 내부에 있는 객체(스프링에서는 bean) 들 간의 관계를 관리할 때 사용하는 기법이다.

     

    의존성 (Dependency) 란 어떤 객체가 혼자 일을 처리 할 수 없다는 것을 뜻한다. 만약 어떤 객체 A가 다른 객체 B의 도움을 받아야만 일을 온전히 처리 할 수 있다면 'A는 B에 의존적이다' 라고 표현한다. 자바에서는 일반적으로 인터페이스를 이용해서 의존적인 객체의 관계를 최대한 유연하게 처리할 수 있도록 한다.

     

    의존성 주입은 말 그대로 이런 의존적인 객체를 직접 생성하거나, 제어 하는 것이 아니라 제어의 역전(IoC)으로 특정 객체에 필요한 객체를 외부에서 결정해서 연결 시키는 것을 의미한다.

     

    외부에서 필요한 객체를 결정하기 때문에 개발자는 의존적인 객체들과의 관계를 직접 처리할 필요 없고 인터페이스를 활용해서 유연한 구조를 사용할 수 있다.

    스프링은 의존성 주입을 프레임워크에서 처리하기 때문에 개발자는 자신이 만드는 객체나 클래스 외에는 신경 쓸 필요가 없다. 자신의 코드에 필요한 객체는 스프링을 통해 주입 받는 구조로 작성된다.

    • 코드로 배우는 스프링 웹 프로젝트 참고

    3. Spirng 에서 의존성을 주입하는 방법

    Spring 에서 의존성을 주입하는 방법은 아래 3가지가 있다. 이 중에서 생성자 주입을 가장 권장한다.

    1. 생성자 주입 : Constructor Injection
    2. 필드 주입 : @Autowired
    3. 수정자 주입 : Setter Injection

    생성자 주입

    단일 생성자인 경우에는 @Autowired을 붙이지 않아도 되지만 2개 이상일 경우에는 @Autowired를 추가해야 한다.

    public class PostsController {
    
        private final PostsService postsService;
        private final ReplySerivce replySerivce;
    
        @Autowired
        public PostsController(PostsService postsService, ReplySerivce replySerivce) {
            this.postsService = postsService;
            this.replySerivce = replySerivce;
        }
    }

    생성자 주입 방식에는 다음과 같은 장점이 있다.

    • 순환 참조를 방지할 수 있다.
    • 의존성 주입이 필요한 필드를 final 로 선언 가능하다.
    • 테스트 코드 작성이 용이하다

    필드 주입

    필드에 @Autowired 추가한다.

    public class PostsController {
    
        @Autowired
        private PostsService postsService;
    
        @Autowired
        private ReplySerivce replySerivce;
    }

    수정자 주입

    public class PostsController {
    
        private PostsService postsService;
        private ReplySerivce replySerivce;
    
        public void setPostsService(PostsService postsService) {
            this.postsService = postsService;
        }
    
        public void setReplySerivce(ReplySerivce replySerivce) {
            this.replySerivce = replySerivce;
        }
    
    }

    4. 마치며

    스프링에서 의존성을 주입하는 3가지 방법이 있다. 이 중에서 생성자 주입 방식을 가장 권장한다.

     

    내 블로그 글보다 아래 두 블로그 글이 일목요연하니 참고하자

    참고

    반응형

    댓글

    Designed by JB FACTORY