Spring 어노테이션의 장점과 의존성 주입 이해하기(feat: @Autowired, @RequiredArgsConstructor)

박지성 학부생·2024년 2월 28일
0

BackEnd Develop log

목록 보기
26/27

Spring 어노테이션 이해하기: 장점과 의존성 주입 예시

Spring의 주요 어노테이션들의 장점, 의존성 주입(Dependency Injection)이 무엇인지, 왜 중요한가?

의존성 주입(Dependency Injection)이란?

의존성 주입은 객체가 필요로 하는 의존성(다른 객체)을 외부에서 제공하는 디자인 패턴.
이를 통해 클래스는 자신이 사용할 객체를 직접 생성하지 않고, 외부(Spring 컨테이너)로부터 필요한 객체를 주입받게 됨.
=> 코드의 결합도를 낮추고, 유닛 테스트를 용이하게 하며, 코드의 재사용성과 유지 보수성을 향상시킴

예시: 의존성 주입 없이 사용하는 경우

public class BookService {
    private BookRepository bookRepository = new BookRepository();
    
    // BookService 클래스는 BookRepository 클래스에 강하게 의존하고 있음
}

위 예시에서 BookService 클래스는 BookRepository 인스턴스를 직접 생성하여 사용해야함.
이 경우, BookService는 BookRepository에 강하게 결합되어 있어, BookRepository의 구현을 변경하거나 다른 저장소로 교체하기 어려움.

예시: 의존성 주입을 사용하는 경우

public class BookService {
    private BookRepository bookRepository;
    
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
        // 의존성이 외부에서 주입되므로, BookService와 BookRepository 사이의 결합도가 낮아짐.
    }
}

이 경우, BookService는 생성자를 통해 BookRepository의 인스턴스를 주입받음.
이 방식은 BookService와 BookRepository 사이의 결합도를 낮추고, BookRepository의 다른 구현을 쉽게 교체할 수 있게 함.

@Autowired와 @RequiredArgsConstructor를 사용한 의존성 주입 예시

Spring에서는 @Autowired 어노테이션을 통해 의존성 주입을 자동으로 처리할 수 있음.
하지만 생성자 주입 방식을 사용하는 것이 더 권장!!

왜?

  • 불변성(Immutability): 생성자 주입을 사용하면 의존성이 마크된 필드를 final로 선언
    => 한번 설정되면 변경할 수 없는 불변 객체를 만들 수 있게 해주어, 애플리케이션의 안정성 높임
  • 테스트 용이성(Testability): 생성자 주입을 사용하면, 테스트 중에 모의 객체(Mock objects)나 다른 구현체를 쉽게 주입할 수 있음
    => 필드 주입을 사용할 경우, 리플렉션(Reflection)을 사용해야 하는 등 테스트가 더 복잡
  • 순환 의존성(Circular Dependency) 해결: 생성자 주입을 사용하면 순환 의존성 문제를 컴파일 타임에 발견할 수 있음
    => 이는 애플리케이션의 실행 시점 전에 문제를 해결할 수 있게 해, 런타임 오류의 가능성을 줄임
  • 의존성 명확성(Dependency Clarity): 생성자를 통해 의존성을 주입받는 클래스는 필요한 의존성이 무엇인지 명확하게 드러냄
    => 코드의 가독성과 이해도가 향상
  • 생성자 주입 방식 => 코드 안전, 테스트하기 쉬움, 이해하기 쉬움

@RequiredArgsConstructor 어노테이션을 사용하면 final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성

@Component
@RequiredArgsConstructor
public class BookService {
    private final BookRepository bookRepository;
    // 이제 Spring은 BookService의 생성자를 통해 BookRepository의 의존성을 자동으로 주입
}

위 예시에서 @RequiredArgsConstructor는 BookService에 필요한 BookRepository의 의존성을 주입하기 위한 생성자를 자동으로 생성
=> 개발자는 의존성 주입 관련 코드를 직접 작성하지 않아도 되며, 코드의 가독성과 유지 보수성이 향상

결론

Spring의 어노테이션과 의존성 주입 패턴은 개발자가 더 깔끔하고 유지 보수가 용이한 코드를 작성 @NoArgsConstructor, @Builder, @AllArgsConstructor, @RequiredArgsConstructor와 같은 어노테이션들은 코드를 구조화하고, 필요한 객체를 효과적으로 관리하는 데 큰 도움을 줌

profile
참 되게 살자

0개의 댓글