지금까지는 MemberService와 Repository를 만드는 것을 해보았다. Member 객체도 만들었고, Service를 통해서 회원가입을 하고, Repository에 그 정보를 저장했다. 그리고 Repository에서 데이터가 조회되도록 하는 과정을 구현했었다. 마지막으로 JUnit을 통해 코드들이 제대로 돌아가는지 테스트까지 했었다.
이제는 화면을 붙이는 작업을 하려고 한다. 그러기 위해서는 다음과 같은 것들이 필요하다.
이 작업을 스프링스럽게 해보자!
🌱 Controller 만들기
• 경로 : /main/hello/hellospring/controller
• 클래스명 : MemberController
@Controller
public class MemberController {
}
👉 여기까지 만들었을 때!
이제, MemberController에서 MemberService를 가져다 써야한다.
private final MemberService memberService = new Memberservice();
를 써서 MemberService를 가져다 쓰는 방법이 있지만, new를 사용했을 때의 문제는 MemberService를 MemberController 뿐만이 아니라 다른 Controller도 MemberService를 사용하는 문제가 나타난다.
스프링을 사용한다면 스프링이 관리할 수 있도록 스프링 컨테이너에 등록을 하고, 스프링 컨테이너로부터 받아서 쓰도록 해야한다.
MemberService를 스프링 컨테이너에 등록해서 사용하는 방법을 알아보자.
생성자를 만들어서 Controller와 Service를 연결한다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
👉 MemberController는 스프링 컨테이너가 뜰 때 생성되는데, 그때 생성자를 호출하게 된다.
👉 생성자에 @Autowired 애노테이션이 있다면, MemberService를 스프링이 가져와서 MemberController와 연결을 시켜주는 기능을 한다.
👉 즉, 생성자에서 @Autowired를 쓰면 MemberController가 생성이 될 때, 스프링 빈에 등록되어 있는 MemberService 객체를 가져다가 넣어준다. 이것이 바로 Dependency Injection(의존성 주입)이다.
👉 선행으로 스프링이 Service와 Repository의 존재를 알도록 MemberService 클래스에 @Service를 달아줘야하고, MemberRespository 구현체인 MemoryMemberRepository 클래스에 @Repository을 달아줘야한다.
MemberController가 MemberService가 필요하듯이,
MemberService도 MemberRepository가 필요하므로 위와 같은 작업을 동일하게 해준다.
그러면 다음과 같은 그림처럼 구현이 된 것이다.
이번 실습은 컴포넌트 스캔과 자동 의존관계 설정을 통해 스프링 빈을 등록해보았다. 참고로 스프링 빈을 등록하는 또 다른 방법으로는 자바 코드로 직접 스프링 빈을 등록해보는 방법이 있다.
tmi로.. 컴포넌트 스캔이라고 말하는 이유는 원래 @Component를 쓰는데 @Controller,@Service,@Repository 애노테이션에는 @Component를 포함하고 있기 때문에 스프링 빈으로 자동 등록되는 것이다.