[spring] @ComponentScan과 @Autowored

아는벌·2023년 2월 24일
0

web (2)

목록 보기
8/20

컴포넌트 스캔

사용법

@Bean을 이용한 빈 등록과 의존관계 주입
자바 설정파일에 애플리케이션에서 동작하는 모든 빈을 명시하는 것은 불편함
=> 컴포넌트 스캔을 이용하면 클래스를 작성하는 동시에 빈 등록 및 의존관계 설정이 가능 !

@Configuration  // 설정파일로 사용
// @Component가 명시된 클래스를 스캔하여 자동으로 빈 등록
@ComponentScan 
public class ComAppConfig {
}

@Configuration : 설정파일로 사용
@ComponentScan : @Component가 명시된 클래스를 스캔하여 자동으로 빈 등록

@Component
public class MemberServiceImpl implements MemberService{
    private final MemberStroragy memberStroragy;
    @Autowired
    public MemberServiceImpl(MemberStroragy memberStroragy) {
        this.memberStroragy = memberStroragy;
    }

Bean으로 등록할 클래스에 @Component 붙이고 생성자 위에 @Autowired를 붙여 의존관계를 설정한다.
@Component를 붙여 빈을 등록하면 클래스의 이름의 첫 문자를 소문자로 바꾼 것이 빈의 이름(id)가 된다! 직접 빈의 이름을 지정하고 싶으면 @Component("빈이름")을 사용하면 된다.

필터 사용하기

@Configuration  // 설정파일로 사용
// @Component가 명시된 클래스를 스캔하여 자동으로 빈 등록
@ComponentScan (
        // 제외 필터
    excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes =Configuration.class)
)
public class ComAppConfig {
}

includeFilters - 포함
excludeFilters - 제외

  • FilterType.ANNOTATION(기본값)
  • FilterType.ASPECTJ
  • FilterType.ASSIGNABLE_TYPE
  • FilterType.REGEX
  • FilterType.CUSTOM

탐색대상지정(basePackages)

  • 모든 자바 클래스를 스캔하여 @Component가 있는지 검사하는 것은 비효율적
  • 스캔 대상의 위치를 basePackages 옵션으로 설정 가능
  • 패키지가 여러 개일 경우 1) 배열 지정 2) @ComponentScan을 여러 개
  • basePackages의 기본 값 - @ComponentScan이 붙은 설정 정보 클래스의 패키지

컴포넌트 스캔 대상

  • @Component - 컴포넌트 스캔에서 사용, 스프링에서 관리되는 객체임을 나타내는 가장 기본이 되는 어노테이션
  • @Controller - 스프링 MVC 컨트롤러
  • @Repository - 스프링 데이터 접근 계층
  • @Service - 스프링 비즈니스 로직(빈의 역할을 분명하게 나타내기 위해)
  • @Configuration - 스프링 설정 정보

스프링부트 시작 시,,

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BookApplication {
	public static void main(String[] args) {
		SpringApplication.run(BookApplication.class, args);
	}
}

@SpringBootApplication 에 @ComponentScan 포함되어 있음

@Autowored

의존관계 자동 주입 방법

(Autowored의 위치에 따른 주입 방법 구분)

생성자 주입

	private 
    @Autowired MemberStroragy memberStroragy;
    public MemberServiceImpl(MemberStroragy memberStroragy) {
        this.memberStroragy = memberStroragy;
    }
  • 생성자에서 의존관계를 설정한다.

  • 생성자 주입은 빈을 생성할 때 의존성 주입도 같이 발생한다.

  • immutable
    - final 키워드 사용 가능

    • setter을 public으로 지정할 필요 없음
  • 테스트 코드 작성 편리

  • SRP(단일책임원칙)을 지킬 수 있음 - 생성자를 작성할때, 많은 인자가 필요하다면 이는 SRP위반을 알리는 신호가 될 수 있음

  • 순환 참조 방지
    - 필드/수정자 주입은 런타임시에, 생성자 주입은 컴파일 시에 발견

수정자 주입

@Autowired
public void setMemberStoragy(MemberStoragy memberStoray){
	this.memberStoray = memberStoray;
}
public MemberServiceimpl(MemberStoray memberStoray){
	this.memberStoray = memberStoray;	
}

setter를 이용하여 의존관계를 주입한다. 선택, 변경 가능성이 있는 의존관계에 사용한다.

필드 주입

@Autowired
private MemberStoragy memberStoragy;

필드에 @Autowired 어노테이션을 붙여주면 자동으로 의존성이 주입된다.

의존 관계 설정 시기

  • 수정자 / 필드 주입
    - 객체를 만들고 이후에 의존 관계 설정
  • 생성자 주입
    - 자신의 생성과 연관관계 설정이 동시에 발생!

어노테이션

@Autowired

  • 이름을 통해 빈을 검색
  • 스프링에만 존재
  • 기본적으로 특정 빈을 찾지 못하면 예외흫 던짐(단, required 속성으로 처리 가능)
  • 검색 방식 : 타입

@Resource

  • 자바 진영에서 @Autowired를 참고해 만든 어노테이션
  • 이름을 통한 검색 방지 -> POJO가 여럿일 때 대상이 모호하지 않고, 명확
  • @Autowirde + @Qualifier
  • 검색 방식 : 이름

@Inject

  • 자바 진영에서 @Autowired를 참고해 만든 어노테이션
  • 타입을 통한 검색 방식
  • 타입이 같은 POJO가 여럿일 때 커스텀 어노테이션을 작성
  • 검색 방식 : 타입

참고

https://bangu4.tistory.com/295

0개의 댓글