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