개발공부/[spring]김영한_스프링입문

[2]스프링 빈과 의존관계 _ 컴포넌트 스캔, 자바코드로 직접 등록

개발자 덕구🐾 2022. 7. 20. 16:14
728x90

 

 

 

 

 

스프링은 스프링 컨테이너에 스프링빈을 등록하여 사용한다. 

기본적으로는 싱글톤 (하나의 클래스에 하나의 객체만을 등록한후 공유)으로 등록한다.

즉, 같은 스프링 빈이면 모두 같은 인스턴스인 것이다. 

<아니게 설정할 수 있지만, 대부분 싱글톤>

 

 

이 스프링빈을 등록하는 방법에는 2가지가 있다.

1.  컴포넌트 스캔

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

 

 

정형화된 코드의 경우 컴포넌트 스캔방식을 주로 사용한다.

정형화 되어있지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 직접 스프링 빈으로 등록한다. 

 

 


 

 

1. 컴포넌트 스캔 

 

@Component 애노테이션이 있다면 스프링 빈으로 스프링 컨테이너에 객체로 자동 등록된다.

 

@Component를 포함하는 

@Controller, @Service, @Repository도 스프링 빈으로 자동 등록이된다. 

 

@Autowired는 스프링 컨테이너의 스프링 빈들을 연결시켜준다.(연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.)

이처럼 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection)이라고 한다. 

 

 

 

코드 예시 : 

@Controller
public class MemberController {
    private final MemberService memberService;

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

 

이렇게 @Controller가 있는 클래스인 MemberController는 스프링 컨테이너에 객체를 만들어 스프링이 들고있는다. 

 

 

 

Memberservice 객체가 만들어지는데 

@Service
public class MemberService {
}

이렇게 @service를 추가해주어 memberservice도 스프링 빈으로 등록되게 만들어준다. 

 

그리고 @Autowired를 통해 연관된 객체를 스프링 컨테이너에서 찾아 넣어준다. 

 

 

 

2. 자바 코드로 등록 

 

SpringConfig라는 자바 파일을 따로 생성한다. 

 

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
}

 

@Bean을 통해 memberService, memberRepository 스프링 빈 객체를 만들어준다. 

 

 

 

 

 

 

 

 

반응형