주니어 개발자 성장기

4. 스프링 빈 등록 본문

Spring/입문

4. 스프링 빈 등록

Junpyo Lee 2022. 7. 1. 19:52

스프링 컨테이너 안에 스프링 빈으로 등록하는 방법

 

1. 컴포넌트 스캔과 자동 의존관계 설정

 

각 클래스 바로 위에 

 

@Controller

@Service

@Repository

 

등의 어노테이션을 추가하면 해당 클래스는 Component가 된다.

(이것은 각각의 어노테이션을 찾아가 보면 안에 @Component 어노테이션이 존재하기 때문이다.)

 

Spring이 실행될 때 컴포넌트 스캔을 하는데 이 때, @Component이 들어가 있는 클래스들은 

Spring 컨테이너 안에 객체가 하나씩 자동으로 생성이 된다. <- 그리고 이것을 스프링 빈으로 등록되었다고 한다.

 

그리고  클래스의 생성자(Constructor) 바로 위에

@Autowired를 써주면 스프링 컨테이너에서 파라미터에 해당하는 객체를 가져와서 생성자에 넣어주게 된다.

즉, Autowired란 @Component로 생성된 스프링 빈들을 자동으로 선(Autowired)으로 연결해주는 것이다.

 

이것을 바로 의존성 주입(Dependency Injection)이라고 한다.

 

다음 코드를 참조하면 될 것이다. (이 방법은 생성자 주입방식)

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired		//@Repository가 있는 클래스의 객체를 Spring 컨테이너에서 가져와서 자동으로 넣어준다.
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

*컴포넌트 스캔의 범위는 스프링 실행 자바 파일에 있는 패키지 내부에 한정된다.

**스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록한다)

설정으로 변경 가능하지만, 보통 싱글톤을 쓴다.

 

 

2. 자바 코드로 직접 스프링 빈 등록하기

@Configuration
public class SpringConfig {

    @Bean   //Bean을 등록한다는 의미
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
        
    }
}

Configuration을 담을 클래스를 하나 만들고

@Configuration 어노테이션,

-> 스프링이 실행될 때 컴포넌트 스캔시 해당 어노테이션이 있으면 직접 스프링 빈을 등록한다.

 

@Bean 어노테이션을 통해서 

스프링 빈을 수동으로 등록한다.

 

*컨트롤러는 스프링이 관리하기 때문에 수동으로 하면 안되고

@Controller와 @Autowired를 써야한다.

 

DI 방식 3가지

1. 생성자 주입 <- Best

 

예시코드)

@Autowired
public MemberController(MemberService memberService) {
    this.memberService = memberService;
}

 

2. 필드 주입

별로 좋은 방법은 아니지만 Test코드를 짤때 편하게 쓰기 위해서

그냥 쓰기도 한다.

 

예시 코드)

@Autowired MemberService memberService;
@Autowired MemoryMemberRepository memberRepository;

 

3. Setter 주입 <-Set method가 Public으로 노출되어야 하기 때문에 문제가 생길 가능성이 있음

 

 

 

실무에서는 주로 정형화된 컨트롤러 서비스, 리포지토리 같은 코드는 컴포넌트 스캔(1번 방식),

 

정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.(2번방식)

-> 나중에 상황에 따라 구현 클래스를 변경하기 용이하다.

 

EX) 나중에 MemoryMemberRepostiory가 아니라 DbMemberRepository로 MemberRepository를 바꾼다면

return new MemoryMemberRepository();를

return new DbMemberRepository(); 로 바꾸면 된다.

'Spring > 입문' 카테고리의 다른 글

6. AOP란?  (0) 2022.07.05
5. Jdbc의 비교  (0) 2022.07.05
3. Test Case 작성  (0) 2022.06.30
2. 인텔리제이 단축키, 편의 명령어  (0) 2022.06.30
1. 웹 개발 기초  (0) 2022.06.27