Controller는 Service를 통해 회원가입을 하고 데이터를 조회할 수 있다.
이를 '컨트롤러가 서비스에 의존하고 있다'고 표현하며, '의존관계가 있다'고 할 수 있다.
hello-spring/src/main/java/hello.hellospring/controller/MemberController.java
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
// ...
}
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
MemberService가 스프링 빈으로 등록되어 있지 않아 위와 같은 오류 발생시, @Controller가 있으면 helloController는 스프링이 제공하는 컨트롤러에서 스프링 빈으로 자동 등록된다.
@Controller으로 컨트롤러를 만들어 두면 스프링 부트가 실행될 때 스프링 컨테이너가 해당 '컨트롤러 객체'를 생성해 스프링 컨테이너에 넣어 두고, 해당 객체는 스프링이 관리하는 대상이 된다. 이를 '스프링 컨테이너에서 스프링 빈이 관리된다' 고 한다.
스프링에 의해 관리되도록 하려면, 그 대상을 스프링 컨테이너에 등록해야 하며, 사용할 때도 스프링 컨테이너로부터 받아서 쓰도록 설계해야 한다. 즉, 사용할 객체를 매번 new로 만드는 것 보다, 한 번만 만들어서 스프링 컨테이너에 등록해 두는 것이 더 효율적이고 스프링에서 제공하는 여러 기능들도 사용할 수 있다.
hello-spring/src/main/java/hello.hellospring/service/MemberService.java
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// ...
}
hello-spring/src/main/java/hello.hellospring/repository/MemoryMemberRepository.java
@Repository
public class MemoryMemberRepository implements MemberRepository {
// ...
}
MemberController는 MemberService에, MemberService는 MemberRepository에 의존한다.
MemberService와 MemberRepository는 스프링 컨테이너에 스프링 빈으로 등록된다.
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. (유일하게 하나만 등록해서 공유함)
같은 스프링 빈이면 모두 같은 인스턴스다.
설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.