[Spring Boot] 컴포넌트 스캔과 자동 의존관계 설정

GyeongEun Kim·2021년 6월 12일
0

Spring Boot

목록 보기
10/12
post-thumbnail
post-custom-banner

본 게시물은 인프런 김영한 강사님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 듣고 개인 공부용으로 작성되었음을 알립니다.


지금까지 MemberServiceMemberRepository를 만들었다. MemberService를 통해 회원가입을 할 수 있고 회원 조회를 할 수 있었다. 이제 이 동작을 화면으로 보여 주고 싶은데 그러려면 먼저 viewMemberController가 있어야 할 것이다.

MemberConrollerMemberService를 통해 회원가입을 하고, 데이터를 조회한다. 이를 서로 의존관계에 있다고 한다. 스프링에서 이 의존관계를 어떻게 설정해주는지 알아보도록 하자.

먼저 MemberController를 다음과 같이 작성하자.

@Controller
public class MemberController {}

이렇게 작성하면 스프링 컨테이너@Controller애노테이션을 보고 MemberController 객체를 만들어 스프링이 관리하는 대상에 추가해준다.

스프링 컨테이너에서 스프링 빈이 관리된다!


MemberControllerMemberService객체를 사용해야 하는데 매번 new를 통해 사용하는 것보다는, 이미 컨테이너에 등록되어 있는 것을 가져다 쓰는 것이 더 좋다. 따라서

@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

생성자를 통해 의존성을 주입해주는 방식으로 작성한다. @Autowired애노테이션은 컨테이너에 등록 돼 있는 memberService를 매개변수와 연결해주는 역할을 한다.

실행시 Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration. 와 같은 오류가 뜬다면 MemberService 클래스에 @Service애노테이션을 추가해준다.

@Service애노테이션이 있어야 MemberService도 스프링 빈으로 인정받을 수 있다

Repository도 같은 이유로 @Repository애노테이션을 추가해준다.
그러면 이제 MemberService, MemberController, MemberRepository가 모두 스프링 빈으로 등록이 되었다.
이 스프링 빈끼리 연결을 해주려면 아까 언급한 @Autowired애노테이션을 사용해야 한다. MemberService에도 추가해주자. 완료되면 스프링 빈들의 관계가 다음 사진처럼 된다. (출처- 김영한님 강의자료)

방금한 방법처럼 애노테이션을 이용해 스프링 빈과 그 관계를 설정해주는 것이 컴포넌트 스캔과 자동 의존관계 설정 방법이다.

@Service, @Repository, @Controller는 내부에 모두 @Component를 포함하고 있는데 컴포넌트 스캔은 @Component가 있는 클래스를 스프링 빈으로 자동 등록하는 원리이기 때문에 @Service, @Repository, @Controller를 가지는 클래스도 스프링 빈으로 등록된다.

컨테이너에 스프링 빈이 등록될 때에는 하나의 인스턴스만 등록이 된다. (싱글톤)


스프링 빈을 등록하는 방법은 한 가지가 더 있는데, 자바 코드로 직접 스프링 빈을 등록하는 방법으로 다음 게시물에서 알아보도록 하겠다

profile
내가 보려고 쓰는 글
post-custom-banner

0개의 댓글