본문 바로가기
내일배움캠프

내일배움캠프 TIL - Spring Bean

by Kiwimel0n 2024. 1. 23.

저번에는 DI를 통하여 의존성 주입을 하는법을 알아 보았다.

하지만 DI를 사용하기위해선 객체 생성이 우선되어야 한다. 그렇다면 언제 어디서 누가 객체를 생성해주느냐

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들의 이름들은 클래스의 앞글자가 소문자로 변경된다.

Memoservice -> memoservice

인텔리제이에서 보면 Bean으로 저장된 클래스는 Bean 아이콘이 표시된다

 

 

Bean 사용법

 

@Autowired

 

Spring에서 IoC컨테이너에 저장된 memoRepository 'Bean'을 해당필드에 DI 의존성 주입을 해준다.

 

@Component
public class MemoService {
		
    @Autowired //필드 위에 @Autowired
    private MemoRepository memoRepository;
		
		// ...
}

 

 

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부터 생략이 가능해지게 되었다.

 

단 생성자 선언이 한개일때만 생략가능하다.

public class A {
	@Autowired // 생략 불가
	public A(B b) { ... }

	@Autowired // 생략 불가
	public A(B b, C c) { ... }
}

 

 

Lombok의 @RequiredArgsConstructor를 사용하면 @Autowired 를 생략한 코딩이가능하다.

 

@Component
@RequiredArgsConstructor // final로 선언된 멤버 변수를 파라미터로 사용하여 생성자를 자동으로 생성합니다.
public class MemoService {

    private final MemoRepository memoRepository;
    
//    public MemoService(MemoRepository memoRepository) {
//        this.memoRepository = memoRepository;
//    }

		...

}

 

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;
    }

		...		
}