티스토리 뷰

반응형

Spring 프레임워크에서 @Autowired를 대체하는 의존성 주입 방법

Spring 프레임워크는 의존성 주입(Dependency Injection)을 통해 객체 간의 결합도를 낮추고 유연한 설계를 가능하게 합니다. 전통적으로 @Autowired 어노테이션이 이러한 의존성 주입을 위해 널리 사용되어 왔습니다. 그러나 최근에는 더 안전하고 명시적인 방법들이 도입되어 @Autowired의 사용을 대체하고 있습니다. 이번 글에서는 @Autowired의 한계와 이를 대체하는 현대적인 의존성 주입 방법에 대해 살펴보겠습니다.

@Autowired의 한계

반응형

@Autowired 어노테이션은 필드, 생성자, 메서드에 적용되어 Spring 컨테이너로부터 빈(Bean)을 자동으로 주입받을 수 있게 합니다. 하지만 다음과 같은 한계가 존재합니다:

  • 필드 주입의 문제점: 필드에 직접 @Autowired를 적용하는 경우, 해당 필드는 외부에서 접근하거나 변경하기 어려워 테스트 작성이 까다로워집니다. 또한, 의존성이 숨겨져 있어 클래스의 책임이 명확하지 않을 수 있습니다.
  • 선택적 의존성 처리의 복잡성: @Autowired는 기본적으로 필수 의존성을 주입하지만, 선택적(optional) 의존성을 처리하려면 추가적인 설정이 필요합니다.

생성자 주입의 장점

이러한 한계를 극복하기 위해 생성자 주입(Constructor Injection)이 권장되고 있습니다. 생성자 주입은 다음과 같은 장점을 제공합니다:

  • 불변성 보장: 의존성이 생성자에서 주입되므로, 객체 생성 이후에는 의존성을 변경할 수 없어 객체의 불변성이 보장됩니다.
  • 테스트 용이성: 생성자를 통해 의존성을 주입하므로, 테스트 시 Mock 객체를 주입하거나 의존성을 쉽게 대체할 수 있습니다.
  • 명시적 의존성 표현: 생성자 파라미터를 통해 클래스가 어떤 의존성을 필요로 하는지 명확하게 드러나므로, 코드의 가독성과 유지보수성이 향상됩니다.

Spring 4.3 버전부터는 생성자가 하나이고, 해당 생성자가 의존성을 필요로 할 경우 @Autowired 어노테이션을 생략해도 자동으로 주입됩니다.

@Component
public class MyService {
    private final MyRepository myRepository;

    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 비즈니스 로직
}

위 예시에서 MyService 클래스는 MyRepository를 생성자를 통해 주입받으며, @Autowired 어노테이션 없이도 의존성 주입이 이루어집니다.

결론

Spring 프레임워크에서 의존성 주입을 구현할 때, 기존의 @Autowired 어노테이션 대신 생성자 주입을 활용하는 것이 더 안전하고 명시적인 방법입니다. 이를 통해 객체의 불변성을 보장하고, 테스트 작성이 용이하며, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. 따라서 새로운 Spring 프로젝트나 기존 프로젝트의 리팩토링 시 생성자 주입 방식을 적극 도입해 보시기 바랍니다.

반응형

'study > spring+spring-boot' 카테고리의 다른 글

[Spring] tiles 설정  (0) 2024.06.11
[SPRING BOOT] DatatypeConverter  (0) 2024.05.21
[Spring boot] mariadb + jpa 대문자로 만들기  (0) 2024.05.17
[Spring] Study #1  (0) 2023.02.06
[spring boot] thymeleaf th:href / th:src  (0) 2022.12.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함
반응형