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

service 패키지 아래에 SpringConfig 클래스를 만든다. MemberService, MemberRepository 를 생성해서 스프링 빈에 등록하고, MemberRepository를 MmeberService에 연결시켜준다!

package hello.hellospring.service;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//memberService, memberRepository 생성해서 스프링빈에 등록하고, 후자를 전자에 연결시켜준다~!
@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository(){//인터페이스(MemberRepository)
        return new MemoryMemberRepository();//구현체(MemoryMemberRepository)
    }
}

장점 DB가 선정되지 않은 가정에서 MemberRepository를 인터페이스로 생성하고, MemeoryMemberRepository로 구현체를 생성하였는데 나중에 위의 설정 파일에서 아래처럼 DbMemoryRepository()하나만 변경해주면 DB 연결 손쉽게 가능하다!

package hello.hellospring.service;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//memberService, memberRepository 생성해서 스프링빈에 등록하고, 후자를 전자에 연결시켜준다~!
@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository(){//인터페이스(MemberRepository)
        return new DbMemberRepository();//구현체(MemoryMemberRepository)
    }
}
  • Dependency Injection

1. 필드 주입 : 스프링 뜰 때만 넣어주고, 중간에 바꿀 수 없다.

@Controller
public class MemberController{
    @Autowired private MemberService memberService;
    

2. Setter 주입 단점 : setMemberService가 public으로 열려있기 때문에 어느 개발자든 누구나 이것을 호출할 수 있게 된다. 어플리케이션이 조립될 때 딱 한번 주입되고 끝나야하는데 public의 Setter로 주입하게 되면 public의 특징으로 문제가 생길 수도 있다.

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

3. 생성자 주입 어플리케이션이 조립될 때 딱 한번 객체 넣어주고 끝난다.

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;


public class MemberService {
    //private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final MemberRepository memberRepository;//constructor를 이용해서 외부에서 넣어줄 수 있도록 바꾼다.

    public MemberService(MemberRepository memberRepository) {//아래처럼 외부에서 객체를 넣어주는 것을 DI(Dependency Injection)이라고 한다.
        this.memberRepository = memberRepository;
    }

Last updated