본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2025 1학기 스프링부트 스터디] 김민서 #4주차

반응형

스프링 빈을 등록하는 두 가지 방법을 살펴보자!

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

회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있도록 하자

@Autowired 를 하면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌 -> 객체 의존관계를 외부에서 넣어주는 것 DI(Dependency Injection), 의존성 주입 / 생성자가 1개만 있으면 생략 ㄱㄴ

근데 오류 나요

왜??

memberService가 스프링 빈으로 등록되어 있지 않으니까.

Like...

컴포넌트 스캔 원리를 알아보면

@Component가 있으면 스프링 빈 자동 등록, @Component를 포함하는 @Controller, @Service, @Repository도 스프링 빈으로 자동 등록된다

 

그런데 현재 멤버 서비스는 그냥 순수한 자바 클래스니까 스프링이 이 친구를 안을 수 있는 방법이 없다

-> @Service를 넣어주자!

리포지토리에는 @Repository

 

짜잔

memberService와 memberRepository가 스프링 컨테이너에 스프링 빈으로 등록되었당

 

* 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 유일하게 하나만 등록해서 공유한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.

 

자바 코드로 직접 스프링 빈 등록하기
package hello.hello_spring;

import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MemoryMemberRepository;
import hello.hello_spring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

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

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

이렇게 쓰면 된다

 

DI방법에는 필드 주입, setter 주입, 생성자 주입이 있다. (생성자 주입 권장)

* @Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않음

반응형