컨트롤러가 멤버 서비스를 통해서 회원 가입을 하고, 멤버 서비스를 통해서 데이터를 조회할 수 있게 해야한다.
controller - service - repository 정형화되어있는 패턴
controller에서 외부 요청을 받고, 서비스에서 비즈니스로직을 만들고, 레포지토리에서 데이터를 저장하는 정형화되어있는 패턴
@Service
public class MemberService { }
@Repository
public class MemoryMemberRepository implements MemberRepository{
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 = new MemberService();
// 하나만 생성해서 공용으로 사용하기 위해 + spring container 등록을 위해서
private final MemberService memberService;
@Autowired // 멤버 서비스 - 멤버 컨트롤러와 연결해주는 어노테이션
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
왜냐하면 멤버 컨트롤러가 멤버 서비스를 통해 회원가입하고, @Autowired를 통해서 데이터 조회한다. 그렇기 때문에 스프링 컨테이너에 있는 MemberService를 가져와야 하는데, 스프링 컨테이너에는 MemberService가 없기 때문에
그래서 의존관계가 정상적으로 작동하기 위해서 MemberService 도 스프링 빈에 등록를 해줘야 한다.
📍 JavaConfig 추가
// 생성자 주입 의미
public MemberService(MemberRepository memberRepository){
this.memberRepository =memberRepository;
}
-- 필드 주입 --
@Autowired private MemberService memberService;
/**
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
*/
📍SpringConfig 클래스 파일 생성
@Configuration
public class SpringConfig {
// Spring bean에 MemberService 등록
@Bean
public MemberService MemberService() {
// Spring bean에 등록되어 있는 MemberRepository를 MemberService에 넣어줌
return new MemberService(memberRepository());
}
// Spring bean에 MemberRepository 등록
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
=> 스프링 컨테이너에 스프링 빈으로 등록이 되고, 서로 의존 관계를 가지게 된다.