Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

@Autowired (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.24 02:33

@Autowired

정의

스프링 프레임워크에서 제공하는 어노테이션으로, 의존성 주입(Dependency Injection)을 자동으로 설정하기 위해 사용됩니다.

주요 용도

스프링 빈(Bean) 간의 의존 관계를 자동으로 연결(Wiring)

적용 대상

생성자

필드

세터 메서드

일반 메서드

관련 분야

의존성 주입(DI)

제어의 역전(IoC)

스프링 프레임워크

유형

어노테이션(Annotation)

상세 정보

동작 방식

스프링 컨테이너가 타입을 기준으로 해당 빈을 찾아 자동으로 주입합니다.

필요한 타입의 빈이 컨테이너에 정확히 하나만 존재해야 합니다.

주입 우선 순위

타입 매칭

@Qualifier 어노테이션 지정

빈 이름 매칭

required 속성

주입 대상 빈이 필수인지 선택적인지 지정할 수 있습니다. 기본값은 true입니다.

1. 개요

@Autowired는 스프링 프레임워크가 제공하는 어노테이션으로, 의존성 주입을 자동으로 수행하기 위해 사용된다. 이 어노테이션을 사용하면 개발자가 직접 코드로 빈 객체 간의 의존 관계를 명시적으로 연결하지 않아도, 스프링 IoC 컨테이너가 적절한 빈을 찾아 자동으로 주입해 준다. 이는 제어의 역전 원칙을 구현하는 핵심 메커니즘 중 하나이다.

@Autowired는 주입 대상에 따라 다양한 방식으로 적용할 수 있다. 주로 생성자, 필드, 세터 메서드에 부여하여 사용하며, 필요에 따라 일반 메서드에도 적용이 가능하다. 이를 통해 스프링 빈 간의 결합을 설정 파일이나 자바 코드 없이도 선언적으로 관리할 수 있어 개발 생산성을 높이고 코드를 간결하게 유지하는 데 기여한다.

2. 기본 개념

2.1. 의존성 주입(DI)과의 관계

@Autowired 어노테이션은 의존성 주입(DI) 패턴을 구현하는 구체적인 수단이다. 스프링 프레임워크의 핵심 원리인 제어의 역전(IoC)은 객체의 생성과 의존 관계 설정을 개발자가 아닌 프레임워크(컨테이너)가 담당하게 한다. @Autowired는 이 원리를 실현하기 위해, 스프링 컨테이너가 관리하는 빈(Bean)들 사이의 의존성을 자동으로 연결해주는 역할을 한다.

즉, 의존성 주입은 객체 간 결합도를 낮추는 설계 패턴이라는 개념이라면, @Autowired는 자바 기반의 스프링 애플리케이션에서 그 개념을 적용하기 위해 사용하는 표시(Marker)이다. 개발자가 XML 설정 파일이나 자바 설정 클래스에서 수동으로 의존 관계를 명시하지 않아도, 이 어노테이션이 붙은 생성자, 필드, 세터 메서드 등을 분석해 스프링이 적합한 빈을 찾아 주입한다.

이러한 자동 연결은 타입(Type)을 기준으로 이루어지며, 해당 타입의 빈이 컨테이너에 단 하나만 존재할 때 가장 명확하게 동작한다. @Autowired의 등장으로 인해 의존성 주입의 설정이 간소화되었고, 애노테이션 기반의 선언적 프로그래밍 방식이 스프링 개발의 표준이 되는 데 기여했다.

2.2. 사용 목적

@Autowired 어노테이션의 주요 사용 목적은 스프링 프레임워크의 핵심 원칙인 제어의 역전과 의존성 주입을 편리하게 구현하는 데 있다. 개발자가 XML 설정 파일이나 자바 설정 클래스에서 수동으로 빈 간의 의존 관계를 명시하지 않아도, 스프링 컨테이너가 런타임에 필요한 객체를 자동으로 찾아 연결해 주는 과정을 단순화한다. 이를 통해 반복적이고 번거로운 설정 코드를 줄이고, 애플리케이션의 유지보수성을 높이는 것이 근본적인 목적이다.

구체적으로 @Autowired는 생성자, 필드, 세터 메서드, 일반 메서드 등 다양한 위치에 적용되어 해당 요소가 필요로 하는 의존 객체를 스프링이 관리하는 애플리케이션 컨텍스트 내에서 자동으로 주입하도록 지시한다. 예를 들어, 서비스 계층의 클래스가 데이터 접근 계층의 리포지토리를 필요로 할 때, 개발자가 직접 리포지토리 인스턴스를 생성하거나 가져오는 코드를 작성할 필요 없이 @Autowired를 선언하기만 하면 스프링이 적합한 빈을 주입해 준다.

이러한 자동 연결은 빈 설정의 복잡성을 감소시키고, 객체 지향 설계 원칙에 더 충실한 코드 작성에 집중할 수 있게 한다. 또한, 의존성이 명시적으로 코드에 나타나기 때문에 클래스 간의 관계를 이해하기 쉽고, 스프링 컨테이너의 강력한 빈 관리 및 생명주기 지원을 자연스럽게 활용할 수 있게 해준다.

3. 사용 방법

3.1. 생성자 주입

생성자 주입은 @Autowired 어노테이션을 클래스의 생성자에 적용하여 의존성을 주입하는 방식이다. 이 방법은 주입 대상이 되는 객체를 생성자의 매개변수로 선언하고, 스프링 프레임워크가 해당 빈을 찾아 생성자를 호출할 때 자동으로 주입한다. 생성자 주입은 객체가 생성되는 시점에 모든 필요한 의존성이 확보되도록 강제한다는 점이 특징이다. 이로 인해 주입된 빈이 불변적으로 유지될 수 있으며, NullPointerException을 방지하는 데 유리하다.

생성자 주입은 스프링 4.3 버전부터 단일 생성자의 경우 @Autowired 어노테이션을 생략할 수 있다. 그러나 여러 개의 생성자가 존재할 경우, 주입을 원하는 생성자에 명시적으로 어노테이션을 붙여야 한다. 이 방식은 의존성 주입의 핵심 원칙 중 하나인 '필요한 모든 의존성을 명시적으로 요청한다'는 개념을 잘 반영한다. 또한 순환 참조 문제가 발생하는 경우, 애플리케이션 시작 단계에서 즉시 감지되어 오류를 발생시킨다는 장점이 있다.

단위 테스트를 작성할 때도 생성자 주입은 유리하다. 스프링 컨테이너 없이도 테스트 클래스 내에서 필요한 모의 객체를 생성자의 인자로 직접 넘겨 객체를 생성할 수 있기 때문이다. 이는 테스트의 격리성을 높이고 의존성을 더 쉽게 제어할 수 있게 한다. 따라서 명확성, 불변성, 테스트 용이성 측면에서 필드 주입이나 세터 주입보다 생성자 주입을 우선적으로 고려하는 것이 일반적인 권장 사항이다.

3.2. 필드 주입

필드 주입은 @Autowired 어노테이션을 클래스의 필드 위에 직접 선언하여 의존성을 주입하는 방식을 말한다. 이 방법은 코드가 매우 간결해진다는 장점이 있다. 개발자는 별도의 생성자나 세터 메서드를 작성할 필요 없이, 주입이 필요한 필드에 직접 어노테이션을 붙이기만 하면 스프링 프레임워크가 리플렉션을 통해 해당 필드에 빈을 자동으로 할당한다.

그러나 이 간결함에는 여러 가지 단점이 따른다. 첫째, 필드가 final로 선언될 수 없어 불변성을 보장하기 어렵다. 둘째, 의존 관계가 외부에 명시적으로 드러나지 않아 클래스의 의존성 주입 요구사항을 한눈에 파악하기 어려워 코드의 가독성과 유지보수성이 떨어진다. 셋째, 스프링 프레임워크와 같은 DI 컨테이너 없이는 객체를 생성하고 의존성을 수동으로 주입하는 단위 테스트 작성이 더 복잡해질 수 있다.

이러한 이유로 현대적인 스프링 프레임워크 및 자바 개발 커뮤니티에서는 생성자 주입을 더 선호하는 경향이 있다. 필드 주입은 주로 레거시 코드나 프로토타이핑, 또는 특정 프레임워크(예: JUnit 테스트 클래스 내의 목 객체)에서 제한적으로 사용된다.

3.3. 세터 주입

세터 주입은 @Autowired 어노테이션을 세터 메서드에 적용하는 방식이다. 이 방법은 스프링 프레임워크가 해당 빈을 생성한 후, 의존성을 주입하기 위해 세터 메서드를 호출한다. 필드 주입과 마찬가지로 객체 생성과 의존성 설정이 분리된다는 특징이 있다.

세터 주입은 선택적 의존성이나 설정 변경이 가능한 의존성을 주입할 때 유용하다. 또한, 의존성 주입을 위한 명시적인 메서드를 제공함으로써, 필드 주입에 비해 코드의 의도를 더 명확하게 보여줄 수 있다. 그러나 이 방식도 필수적인 의존성을 누락시키는 경우, 객체가 불완전한 상태로 생성될 수 있다는 단점이 있다.

주입 방식

적용 위치

주요 특징

세터 주입

세터 메서드

객체 생성 후 의존성 설정, 선택적 의존성에 유용

현대적인 스프링 개발에서는 생성자 주입이 불변 객체를 보장하고 테스트 용이성이 높아 권장되며, 세터 주입은 상대적으로 덜 사용되는 추세이다.

4. 주의사항 및 단점

4.1. 순환 참조 문제

  • Baeldung - Circular Dependencies in Spring

  • Spring 공식 문서 - Bean Dependencies and Circular References

  • 망나니개발자 - [Spring] 순환참조(Circular Dependencies)란?

  • 우아한형제들 기술블로그 - Spring Circular Dependency

  • 인프런 - 스프링 빈과 의존관계: 순환 참조 문제

  • DZone - Resolving Circular Dependencies in Spring

  • Stack Overflow - What is a circular dependency and how can I solve it in Spring?

4.2. 테스트 용이성 저하

@Autowired를 사용한 필드 주입 방식은 단위 테스트 작성 시 의존성을 외부에서 주입하기 어려워 테스트 용이성을 저하시킨다. 필드에 직접 의존성 주입이 이루어지기 때문에, 테스트 환경에서는 스프링 컨테이너 없이 해당 객체를 생성할 경우 필요한 의존 객체를 수동으로 설정할 방법이 명시적으로 존재하지 않는다. 이는 테스트 격리를 어렵게 만들고, 테스트 코드의 복잡성을 증가시킨다.

반면 생성자 주입을 사용하면 테스트 시 객체를 생성하는 단계에서 필요한 모의 객체나 스텁을 명시적으로 전달할 수 있다. 이는 의존 관계가 명확하게 드러나도록 하여, 스프링과 같은 프레임워크에 의존하지 않는 순수한 자바 객체로서의 테스트를 가능하게 한다. 결과적으로 테스트가 더 견고하고 유지보수하기 쉬워진다.

따라서 테스트의 용이성과 코드의 품질을 고려할 때, @Autowired를 필드에 적용하기보다는 생성자 주입 방식을 우선적으로 고려하는 것이 권장된다.

4.3. 명시성 부족

@Autowired 어노테이션을 사용한 자동 주입 방식은 코드의 명시성을 떨어뜨리는 단점이 있다. 의존성 주입이 어노테이션 하나로 처리되기 때문에, 해당 클래스가 어떤 의존성을 필요로 하는지 코드만으로 명확히 파악하기 어려울 수 있다. 특히 필드 주입 방식을 사용할 경우, 생성자나 세터 메서드가 없어 의존 관계를 한눈에 확인하기 더욱 힘들어진다.

이러한 명시성 부족은 코드의 가독성과 유지보수성을 저하시킨다. 새로운 개발자가 프로젝트에 투입되었을 때, 특정 빈이 주입받는 의존 객체들을 파악하려면 필드 선언부를 일일이 확인하거나 스프링 프레임워크의 컨테이너 설정을 살펴봐야 할 수 있다. 이는 생성자 주입처럼 모든 의존성을 생성자 파라미터로 명시적으로 나열하는 방식에 비해 불리한 점이다.

또한, 리팩토링 과정에서 실수를 유발할 수 있다. 예를 들어, 사용되지 않는 @Autowired 필드를 제거하지 않아도 컴파일 에러가 발생하지 않기 때문에, 불필요한 의존성이 그대로 남아 있을 가능성이 있다. 반면 명시적인 생성자 주입을 사용하면, 의존성이 제거될 경우 이를 사용하는 생성자 호출부에서 컴파일 시점에 오류가 발생하여 문제를 즉시 인지하고 수정할 수 있다.

따라서 코드의 명확성과 안정성을 높이기 위해서는 @Autowired를 통한 암시적인 주입보다는, 롬복의 @RequiredArgsConstructor를 활용하거나 직접 생성자를 정의하는 등 의존 관계를 명시적으로 표현하는 방식을 권장한다.

5. 대안 및 권장 사항

5.1. 생성자 주입 권장

스프링 프레임워크에서 의존성을 주입하는 여러 방법 중 생성자 주입을 권장하는 경향이 강하다. 이는 스프링 공식 문서에서도 제안하는 방식으로, 객체의 불변성을 보장하고 테스트 용이성을 높이며, 순환 참조와 같은 문제를 컴파일 타임에 방지할 수 있기 때문이다.

생성자 주입은 클래스의 생성자를 통해 필요한 의존성을 한 번에 주입받는 방식이다. 이 방식은 주입받을 필드를 final로 선언할 수 있어 객체 생성 후 의존 관계가 변경되지 않는 불변 객체를 만들 수 있다. 또한 생성자 호출은 객체 생명주기에서 가장 먼저 일어나므로, 주입된 빈이 완전히 초기화된 상태로 사용될 수 있다는 장점이 있다. 이는 필드 주입이나 세터 주입과 비교했을 때 명확한 이점이다.

특히 순환 참조 문제를 방지하는 데 유용하다. 생성자 주입을 사용하면 서로를 필요로 하는 두 빈이 존재할 경우, 애플리케이션 컨텍스트가 시작되는 시점에 BeanCurrentlyInCreationException이 발생하여 문제를 즉시 인지할 수 있다. 반면 다른 주입 방식은 애플리케이션이 실행된 후 실제 메서드가 호출될 때까지 문제가 드러나지 않을 수 있다. 또한 단위 테스트를 작성할 때 모킹 라이브러리 없이도 순수 자바 코드로 테스트 인스턴스를 쉽게 생성할 수 있어 테스트가 용이하다.

따라서 현대적인 스프링 애플리케이션 개발에서는 명시적이고 안전한 의존성 관리를 위해 생성자 주입을 기본 방식으로 채택하는 것이 일반적이다. 롬복의 @RequiredArgsConstructor 어노테이션을 함께 사용하면 final 필드에 대한 생성자 코드를 자동으로 생성해 주어 보일러플레이트 코드를 줄이면서도 생성자 주입의 장점을 그대로 누릴 수 있다.

5.2. @RequiredArgsConstructor 활용 (Lombok)

@RequiredArgsConstructor는 롬복(Lombok) 라이브러리가 제공하는 어노테이션으로, 클래스에 final로 선언된 필드나 @NonNull 어노테이션이 붙은 필드를 위한 생성자를 자동으로 생성해준다. 이 기능은 스프링 프레임워크에서 의존성 주입을 위한 생성자를 손쉽게 구현하는 데 널리 활용된다.

생성자 주입 방식을 사용할 때, 주입받아야 할 의존성이 많으면 생성자 코드가 길어지고 관리가 번거로워질 수 있다. @RequiredArgsConstructor를 클래스 레벨에 적용하면, 롬복이 컴파일 시점에 해당 필드들을 매개변수로 갖는 생성자를 자동으로 만들어준다. 이는 코드의 간결성을 유지하면서도 생성자 주입의 장점을 그대로 누릴 수 있게 해준다. 결과적으로 개발자는 의존성을 선언하기만 하면 되고, 반복적인 생성자 작성 작업을 줄일 수 있다.

사용 방법은 매우 직관적이다. 주입이 필요한 빈을 private final로 선언하고, 클래스에 @RequiredArgsConstructor 어노테이션을 추가하기만 하면 된다. 롬복이 생성해준 생성자 위에는 스프링이 의존성 주입을 수행할 수 있도록 @Autowired 어노테이션이 암시적으로 적용된다. 이 방식은 테스트 작성의 용이성과 불변 객체 생성을 장려한다는 생성자 주입의 이점을 그대로 가져가면서도, 보일러플레이트 코드를 현저히 줄여준다.

따라서, 최신 스프링 및 스프링 부트 프로젝트에서는 명시적인 @Autowired 생성자 표기를 생략하고, 롬복의 @RequiredArgsConstructor를 조합하여 깔끔하고 효율적인 의존성 주입 코드를 작성하는 것이 권장되는 패턴이다.

6. 관련 문서

  • Spring - @Autowired Annotation

  • Baeldung - Spring @Autowired

  • Spring - Field Injection

  • 망나니개발자 - @Autowired란?

  • 우아한형제들 기술블로그 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유

  • 인프런 - 스프링 핵심 원리 기본편

  • Oracle - Java Annotations

  • Spring - Dependency Injection

리비전 정보

버전r1
수정일2026.02.24 02:33
편집자unisquads
편집 요약AI 자동 생성