티스토리 뷰





반응형

@Autowired란?

의존성을 주입 할 때 사용하는 어노테이션으로 의존 객체의 타입에 해당하는 bean을 찾아주는 역할을 한다.

 

사용 가능한 위치

  • 생성자(스프링 4.3부터 생략 가능)
  • Setter
  • 필드

생성자에 @Autowired (스프링 4.3부터 생략가능)

@Service
public class TestService {

    TestRepository testRepository;
    
    @Autowired
    public TestService(TestRepository testRepository) {
        this.testRepository = testRepository;
    }
}
public class TestRepository {
	....
}

위 코드에서 TestRepository의 의존성 주입이 작동할까?

 

당연히 작동하지 않는다. @Autowired는 의존 객체의 타입에 해당하는 bean을 찾아 주입하기 때문이다.

즉, TestRepository는 bean으로 등록되어 있지 않기 때문에 스프링이 bean을 찾기 못해 의존성을 주입할 수가 없다.

 

이를 작동하게 하기 위해서는 @Repository 또는 @Component 어노테이션을 이용해야한다.

@Repository
public class TestRepository {
	....
}

 

Setter에 @Autowired

@Service
public class TestService {

    TestRepository testRepository;
	
    @Autowired(required = false)
    public void setTestRepository(TestRepository testRepository) {
        this.testRepository = testRepository;
    }
}

 

필드에 @Autowired (해당하는 타입의 bean이 여러 개 일 때)

@Service
public class TestService {
	
    @Autowired
    TestRepository testRepository;
}
public interface TestRepository {
	....
}

@Repository
public class MyTestRepository implements TestRepository {
  // TestRepository의 구현체
}

@Repository
public class ExampleRepository implements TestRepository {
  // TestRepository의 구현체
}

이럴 경우 스프링은 개발자가 원하는 의존성을 알지 못하기에 bean을 2개 발견했다는 에러 메시지를 뱉는다.

이럴 때 해결법으로 @Primary 와 @Qulifier가 있다.

 

@Primary

같은 타입의 bean이 여러 개 주입될 경우 먼저 주입하겠다는 의미를 가진다.

public interface TestRepository {
	....
}

@Repository @Primary
public class MyTestRepository implements TestRepository {
  // TestRepository의 구현체
}

@Repository
public class ExampleRepository implements TestRepository {
  // TestRepository의 구현체
}

 

@Qulifier

주입받을 bean을 직접 선택한다.

@Service
public class TestService {
	
    @Autowired @Qulifier("myTestRepository")   // bean의 Id는 lower Camel Case를 사용한다.
    TestRepository testRepository;
}

 

 

추가 설명

Autowired는 기본적으로 의존성 주입이 반드시 성공한다고 가정한다. 그래서 주입할 타입에 해당하는 bean을 DI 컨테이너안에서 못찾는다면 NoSuchBeanDefinitionException 이라는 예외가 발생한다.

 

만약 이러한 필수 조건을 완화하고 싶다면 다음과 같이 @Autowired 애너테이션의 required 속성에 false를 설정하면 된다. 해당 타입의 빈을 찾지 못하더라도 예외가 발생하지 않고 의존성 주입은 실패했기 때문에 해당 필드의 값은 null이 된다.

 

컴포넌트 스캔

컴포넌트 스캔은 클래스 로더를 스캔하면서 특정 클래스를 찾은 다음, DI 컨테이너에 등록하는 방법을 말한다.

 

기본 설정으로 컴포넌트 스캔하기

  • @Component
  • @Controller
  • @Service
  • @Repository
  • @Configuration
  • @RestController
  • @ControllerAdvice
  • @ManagedBean
  • @Named

 

대표적인 스캔 대상 어노테이션

Annotation 설명
@Controller 클라이언트에서 오는 요청을 받고, 비즈니스 로직의 처리 결과를 응답으로 돌려보내는 기능을 한다. 이때 실제 비즈니스 로직은 @Service가 붙은 컴포넌트에서 처리하도록 위임한다.
@Service 컨트롤러에서 받은 입력 데이터를 활용해 비즈니스 로직을 실행하는 기능을 한다. 이때 영속적으로 보관해야 하는 데이터가 있다면 @Repository가 붙은 컴포넌트에서 처리하도록 위임한다.
@Repository 영속적인 데이터 처리를 수행하는 컴포넌트에 붙이는 애너테이션이다. ORM관련 라이브러리를 활용해 데이터의 CRUD를 처리하는 기능을 한다.
@Component 위의 세 경우에 해당하지 않는 컴포넌트에 붙이는 애너테이션

 

 

참고 : https://jjingho.tistory.com/6

반응형
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/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