Spring

스프링 빈 등록 (Spring Bean)

yong_ღ'ᴗ'ღ 2022. 12. 11. 04:56

https://yong-codinglog.tistory.com/62

 

Spring Bean 생성

🔸 DI: Dependency Injection, 의존성 주입 ◼ new 키워드로 객체 생성을 직접하지 않고, 객체 생성을 외부에서 대신 수행 ◼ 클래스/인터페이스 타입의 멤버 변수만 선언하고, 생성자 구현 ✔ 객체를 생

yong-codinglog.tistory.com

이전에도 한 번 적은 거 있음


Spring Bean 생성

① 컴포넌트 스캔 방식 (Component Scan)

@Component

   - @Controller

   - @Service

   - @Repository

 

@Controller, @Service, @Repository 어노테이션이 있으면, 스프링 빈으로 자동 등록된다.

 

ex) @Controller 어노테이션 있으니, MemberController를 스프링 빈으로 등록

      그 때, MemberController의 생성자를 호출

      그런데 생성자에 @Autowired 어노테이션 있으면,

      Spring이 스프링 컨테이너에 있는 MemberService를 가져다가 연결시켜 준다.

      이 때, MemberService는 스프링 컨테이너에 Bean으로 등록되어 있어야 한다.

      (MemberService에 @Service 어노테이션 붙어있거나, 직접 Bean 생성해주거나)

@Controller
public class MemberController {
    private final MemberService memberService;

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

 

② 자바 코드로 직접 등록 

Controller는 위와 동일하게 놔두고, Service와 Repository Class에서 어노테이션 제거

@Controller
public class MemberController {
    private final MemberService memberService;

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

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

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

 

 

스프링 빈으로 등록할 때, 기본으로 싱글톤으로 등록한다. 유일하게 하나만 등록해서 공유한다.

   MemberController 하나, MemberSerivce 하나, MemberRepository 하나 등록

  그 이후로 또 MemberController에서 MemberService 쓴다고 하면, 

  이미 만들어놓은 MemberService 공유해서 사용한다.