스프링 빈과 의존관계

황준하·2023년 6월 24일

Spring 기본

목록 보기
4/38
post-thumbnail

스프링 빈을 등록하고, 의존관계 설정

스프링 빈을 등록하는 방법

  1. 컴포턴트 스캔과 자동 의존관계 설정
  2. 자바코드로 직접 스프링 빈 등록하기

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

@Component을 포함하는 다음 애노테이션으로 자동 등록한다.

  • @Controller
  • @Service
  • @Repository
@Controller
public class MemberController {
    private final MemberService memberService;

        @Autowired
        public MemberController(MemberService memberService) {\
@Service
public class MemberService {
 private final MemberRepository memberRepository;
	
 @Autowired
 public MemberService(MemberRepository memberRepository) {
@Repository
public class MemoryMemberRepository implements MemberRepository {

스프링은 스프링 컨테이너에 스프링 빈을 등록할때, 기본으로 싱글톤으로 등록한다.

따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우가 아니면

모두 싱글톤으로 설정한다.

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

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();
    }
}

DI(dependency injection)

  1. 필드주입
  2. setter주입
  3. 생성자주입

필드주입

@Autowired private final MemberRepository memberRepository;

setter 주입

private MemberRepository memberRepository;
    
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

세터호출 단점 : 누군가가 MemberController를 호출할때 setMemberRepository가 public으로 노출되어 있어야한다.

도중에 변경되면 문제 발생

생성자를 통해 주입

public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

실무에서는 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

0개의 댓글