티스토리 뷰
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
- 챗봇개발
- 개발블로그
- nextJS
- 프론트엔드
- github
- 웹개발
- 페이지
- REACT
- Ktor
- PostgreSQL
- Docker
- 관리자
- LangChain
- Project
- kotlin
- 백엔드
- fastapi
- 리액트
- Webpack
- rag
- Page
- llm
- 로컬LLM
- nodejs
- AI챗봇
- babel
- Next.js
- Python
- 백엔드개발
- til
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |