[Spring] IoC Container, Bean

thingzoo·2023년 6월 25일
0

Spring

목록 보기
21/54
post-thumbnail

DI를 사용하기 위해서는 객체 생성이 우선 되어야 했다. 이때 Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해준다.

Spring IoC 컨테이너

Spring Bean: Spring이 관리하는 객체
Spring IoC 컨테이너: Bean을 모아둔 컨테이너

Spring Bean 등록 방법

@Component

'Bean'으로 등록하고자하는 클래스 위에 설정

@Component
public class MemoService { ... }
  • Spring 서버가 뜰 때 IoC 컨테이너에 'Bean'을 저장 해줌

    • @Component가 설정된 클래스에 대해서 Spring이 해 주는 일
    // 1. MemoService 객체 생성
    MemoService memoService = new MemoService();
    
    // 2. Spring IoC 컨테이너에 Bean (memoService) 저장
    // memoService -> Spring IoC 컨테이너
    • Spring 'Bean' 이름: 클래스의 앞글자만 소문자로 변경
    • public class MemoServicememoServcie
      • 'Bean' 아이콘 확인 → 스프링 IoC 에서 관리할 'Bean' 클래스라는 표시

@ComponentScan

  • Spring 서버가 뜰 때 @ComponentScan에 설정해 준 packages 위치와 하위 packages 들을 전부 확인하여 @Component가 설정된 클래스들을 ‘Bean’으로 등록 해줌
@Configuration
@ComponentScan(basePackages = "com.sparta.memo")
class BeanConfig { ... }

Bean 사용 방법

1. @Autowired✨

Spring IoC 컨테이너에 의해 관리되는 클래스에서만 가능

필드 위에 @Autowired

@Component
public class MemoService {
	@Autowired
    private MemoRepository memoRepository;
    ...
}
  • Spring에서 IoC 컨테이너에 저장된 memoRepository ‘Bean’을 해당 필드에 DI 즉, 의존성을 주입 해줌

'Bean'을 주입할 때 사용할 메소드 혹은 생성자 위에 @Autowired

@Component
public class MemoService {
	private final MemoRepository memoRepository;

	@Autowired
    public MemoService(MemoRepository memoRepository) {
    	this.memoRepository = memoRepository;
    }
	...
}
  • 객체의 불변성 확보를 위해 일반적으로는 생성자를 사용하여 DI함!
  • set… Method를 만들고 @Autowired를 적용하여 DI도 가능

👍🏻 @Autowired 생략 조건

  • Spring 4.3부터 @Autowired 생략가능
    • 단, 생성자 선언이 1개일 때만
public class A {
	public A(B b) { ... }
}
  • Lombok의 @RequiredArgsConstructor 사용
@Component
@RequiredArgsConstructor // final로 선언된 멤버 변수를 파라미터로 사용하여 생성자를 자동으로 생성
public class MemoService {
    private final MemoRepository memoRepository;
	...
}

2. ApplicationContext(몰라도대 읽어만둬)

  • ApplicationContext: BeanFactory등을 상속하여 기능을 확장한 Container
  • BeanFactory: ‘Bean’ 의 생성, 관계설정등의 제어를 담당하는 IoC 객체

스프링 IoC 컨테이너에서 ‘Bean’을 수동으로 가져오는 방법

@Component
public class MemoService {
	private final MemoRepository memoRepository;

    public MemoService(ApplicationContext context) {
    	// 1.'Bean' 이름으로 가져오기
        MemoRepository memoRepository = (MemoRepository) context.getBean("memoRepository");

        // 2.'Bean' 클래스 형식으로 가져오기
        // MemoRepository memoRepository = context.getBean(MemoRepository.class);

        this.memoRepository = memoRepository;
    }

		...		
}

3 Layer Annotation ✨

Spring 3 Layer Annotation은 Controller, Service, Repository의 역할로 구분된 클래스들을 ‘Bean’으로 등록할 때 해당 ‘Bean’ 클래스의 역할을 명시하기위해 사용됨

  • @Component 대신 다음 annotation을 사용할 수 있음
  1. @Controller, @RestController
  2. @Service
  3. @Repository
profile
공부한 내용은 바로바로 기록하자!

0개의 댓글