컴포넌트 스캔과 자동 의존관계 설정

Sunny·2023년 2월 8일
0

지금까지는 MemberService와 Repository를 만드는 것을 해보았다. Member 객체도 만들었고, Service를 통해서 회원가입을 하고, Repository에 그 정보를 저장했다. 그리고 Repository에서 데이터가 조회되도록 하는 과정을 구현했었다. 마지막으로 JUnit을 통해 코드들이 제대로 돌아가는지 테스트까지 했었다.

이제는 화면을 붙이는 작업을 하려고 한다. 그러기 위해서는 다음과 같은 것들이 필요하다.

  • Controller와 View 템플릿이 필요하다.
  • 회원가입하고, 회원가입 결과를 HTML에 뿌려줘야한다.
  • MemberController가 필요한데, MemberController는 MemberService를 통해서 회원가입하고 데이터를 조회할 수 있어야한다.
    = 이를 의존관계가 있다고 표현한다.

이 작업을 스프링스럽게 해보자!


🌱 Controller 만들기

• 경로 : /main/hello/hellospring/controller
• 클래스명 : MemberController

@Controller
public class MemberController {
    
}

👉 여기까지 만들었을 때!

  • 스프링 컨테이너라는 스프링 통이 생긴다.
  • @Controller 애노테이션이 있으면 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를 포함하고 있기 때문에 스프링 빈으로 자동 등록되는 것이다.

profile
개발에 재미를 붙여보기 :)

0개의 댓글