개발/Spring

Spring 프레임워크에서 Repository 주입 방법 (@Autowired, @Resource, @Inject)

피터JK 2025. 2. 1. 16:22
728x90

Spring 프레임워크에서 Repository 또는 Service 등을 주입할 때 여러 가지 방법이 있습니다.
대표적으로 @Autowired, @Resource, @Inject가 있으며, 각각의 차이점과 사용법을 정리해보겠습니다.


1. @Autowired (Spring 제공)

  • @Autowired는 Spring에서 제공하는 의존성 주입(DI) 어노테이션입니다.
  • 타입(Type) 기반으로 Bean을 검색하여 주입합니다.
  • 기본적으로 주입 대상이 없으면 예외(NoSuchBeanDefinitionException)가 발생합니다.

✅ 사용법

1.1. 필드 주입 (비추천)

@Component
public class MyService {
    @Autowired
    private MyRepository myRepository;
}

비추천 이유: 테스트 및 유지보수가 어렵고, Mocking이 불가능함.

1.2. 생성자 주입 (추천)

@Component
public class MyService {
    private final MyRepository myRepository;

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

추천 이유: final 키워드를 사용할 수 있어 불변성이 보장됨.

1.3. Setter 주입

@Component
public class MyService {
    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

✅ 선택적 의존성 주입에 유용하지만, 불변성이 깨질 가능성이 있음.


2. @Resource (JDK 제공, Spring 지원)

  • 이름(name) 기반으로 Bean을 검색하여 주입.
  • name을 명시하지 않으면 필드 이름과 동일한 Bean을 찾고, 없으면 타입(Type) 기반으로 검색.

✅ 사용법

@Component
public class MyService {
    @Resource
    private MyRepository myRepository;
}

Spring 독립적이므로 Java EE 환경에서도 사용 가능.

단점: @Autowired처럼 @Primary, @Qualifier 등을 활용할 수 없음.


3. @Inject (JDK 표준, Spring 지원)

  • @Autowired와 유사하며, 타입 기반 주입을 수행.
  • @Autowired(required = false)처럼 빈이 없어도 예외를 발생시키지 않게 하는 기능이 없음.

✅ 사용법

@Component
public class MyService {
    @Inject
    private MyRepository myRepository;
}

JSR-330 표준을 지원하며, Spring에 의존하지 않음.


4. @Autowired vs @Resource vs @Inject 비교 정리

어노테이션 제공 주체 주입 방식 주입 대상이 없을 때 추가 기능
@Autowired Spring 타입 기반 예외 발생 (기본) @Primary, @Qualifier 지원
@Resource Java EE 이름 기반 (없으면 타입) 예외 발생 name 속성으로 특정 빈 지정 가능
@Inject JSR-330 타입 기반 예외 발생 @Qualifier 지원 (Spring 환경에서만)

5. 결론 - 어떤 것을 사용할까?

✅ Spring 환경에서 @Autowired가 가장 일반적이고 추천됨

@Component
public class MyService {
    private final MyRepository myRepository;

    public MyService(@Qualifier("myRepositoryImpl") MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

✅ @Resource는 Spring이 아닌 Java EE 환경에서도 동작해야 할 때 고려

@Resource(name="myRepository")
private MyRepository myRepository;

✅ @Inject는 JSR-330 표준을 따르고 싶다면 사용 가능

@Inject
private MyRepository myRepository;

🚀 최종 정리

  • @Autowired (추천): Spring 공식 지원, 타입 기반, @Qualifier, @Primary 지원.
  • @Resource: Java EE 표준, 이름 기반, Spring 없이도 사용 가능.
  • @Inject: @Autowired와 유사하지만, JSR-330 표준을 따름.

Spring 프로젝트라면 @Autowired + 생성자 주입 방식을 사용하세요! 

728x90