백엔드/인프런_스프링

4. 스프링 빈과 의존관계

smallsilver_west 2024. 11. 16. 20:14

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

: 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있도록 의존관계 준비

 

회원 컨드롤러 의존관계 추가

package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
    
@Controller
public class MemberController {
	private final MemberService memberService;
    
	@Autowired
	public MemberController(MemberService memberService) {
		this.memberService = memberService;
    }
}

 

@Autowired

스프링이 연관된 객체를 스프링 컨테이너에 찾아 삽입

 

DI

Dependency Injection, 의존성 주입, 객체 의존관계를 외부에서 넣어주는 것을 의미

@Qutowired에 의해 스프링 주입

 

memberServie 스프링 빈 등록 전

: error message

Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.

* helloController는 @Controller를 이용해 자동 등록

 

스프링 빈 등록 방법

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

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

 

컴포넌트 스캔

@Component: 애노테이션이 있는 경우 스프링 빈 자동 등록

* 컴포넌트 스캔으로 @Controller 컨트롤러가 스프링 빈으로 자동 등록

 

@Component를 포함하는 애노테이션도 스프링 빈 자동 등록

- @Controller

- @Service

- @Repository

 

회원 서비스 스프링 빈 등록

@Service
public class MemberService {

	private final MemberRepository membeRepository;
    
    @Autowired
    public MemberService(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}

* 생성자에 @Autowired를 사용하는 경우, 객체 생성 시, 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입, 생성사자 1개인 경우 생략 가능

@Repository
public class MemoryMemberRepository implements MemberRepository {}

그림 1) 스프링 빈 등록

 

: memerService와 memberRpository가 스프링 컨테이너에 스프링 빈으로 등록됨

 

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

: 회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션 제거 후 진행

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.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();
    }
 }

* 향후 메모리 리포지토리를 변경할 예정이므로 컴포넌트 스캔 대신 자바 코드 사용