말하는 감자

[스프링부트 스터디] 스프링 빈과 의존관계 본문

Backend

[스프링부트 스터디] 스프링 빈과 의존관계

개똥벌레25 2021. 7. 11. 12:23
728x90

저번까지 도메인, 리파지토리, 서비스에 대한 로직 개발방법과 테스트 방법론에 대해 배웠다.

이제 그 결과들을 화면에 나타내주는 컨트롤러는 어떻게 개발해야 하는지 살펴보기 위해, 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비한다.

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

- 객체를 등록할 때 스프링 컨테이너에 딱 한개만 등록한다(싱글톤). 컴포넌트 스캔 어노테이션: @Repository, @Service

- 스프링 컨테이너에서 관리되는 스프링 빈 중 하나 등록된 객체를 찾아 사용한다. 자동 의존관계 설정 어노테이션: @Autowired

- 그 범위의 기준은 SpringBootApplication이 있는 패키지 단위이다. 그 범위밖에 아무리 컴포넌트 어노테이션을 넣어도 스프링 컨테이너에서 관리하지 않는다.

@Controller
public class MemberController {
    private final MemberService memberService;

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

    // MemberService 객체 생성될 때 별도의 리파지토리를 갖지 않도록 (Dependency Injection)
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
...
}
@Repository
public class MemoryMemberRepository implements MemberRepository {
...
}

※ DI(Dependency injection) 필드 주입

@Controller
public class MemberController{

	@Autowired private MemberService memberService;
}

※ DI(Dependency injection) setter 주입, public으로 노출

@Controller
public class MemberController{

    private MemberService memberService;
	
    @Autowired 
    public void setMemberService(MemberService memberService){
    	this.memberService = memberService; 
    }   
}

DI는 보통 생성자로 초기에 세팅한다.

 

 

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

- 컨트롤러의 컴포넌트 스캔과 Autowired는 그대로 둔다.

- 새로운 클래스를 작성해서 스프링 빈 어노테이션을 지정한다: @Configuration, @Bean

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

설정을 통해 스프링 빈으로 등록하는 것의 장점은, DB가 바뀌어서 리포지토리를 바꿀 때 간단하게 할 수 있다는 것이다.

Comments