[spring] 스프링빈과 의존관계 - 컴포넌트스캔과 자동의존관계 설정 (스프링 입문 by 김영한)

su_y2on·2022년 1월 13일
0

Spring

목록 보기
6/30
post-thumbnail

스프링빈과 의존관계 - 컴포넌트스캔과 자동의존관계 설정


지금까지 작성한 service를 controller와 이어주도록 하겠습니다. 먼저 MemberController를 생성해줍니다.

@Controller
public class MemberController {

    private final MemberService memberService;

    //생성자
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
    
    
 }

그리고 @Controller라는 어노테이션을 붙여주면 spring이 뜨면서 MemberController를 인식하고 컨테이너 안에 스프링빈으로 저장해놓습니다.

여기서 MemberService에 있는 함수들을 가져다가 쓰기위해 선언을 해줘야하는데요 이때 아래처럼 Controller안에서 독립적으로 생성해주면(new)안되고 컨테이너 안에 하나를 만들어 놓고 공유해야합니다.

private final MemberService memberService = new MemberService();

그렇지 않으면 memberService를 쓰는 모든 다른 Controller에서 모두 따로 만들어서 사용하게 되기 때문에 좋지 않습니다!

공유하는 방식은 @Autowired라는 어노테이션을 생성자에 붙여주는 것인데요. 이렇게 하면 스프링이 MemberService를 찾아서 만들어준뒤에 넣어줍니다. 바로 의존성을 주입해주는 것입니다.

하지만 이대로 실행하면 스프링이 컨테이너 안에 MemberService를 찾을 수 없기 때문에 오류가 납니다🥲 따라서 아래와 같이 @Service라는 어노테이션을 붙여줘서 스프링 컨테이너에 스프링빈으로 등록합니다

@Service
public class MemberService {

       private final MemberRepository memberRepository;
       
       @Autowired
       public MemberService(MemberRepository memberRepository) {
           this.memberRepository = memberRepository;
       }
}

그렇다면 같은 원리로 MemberRepository도 등록해줘야겠죠? 여기에는 @Repository 어노테이션을 붙여줍니다.

@Repository
public class MemoryMemberRepository implements MemberRepository {

	...
    	...
}




컴포넌트 스캐닝

지금처럼 스프링빈을 등록하는 방식을 컴포넌트 스캐닝이라고 합니다 즉 어노테이션을 활용해 직접 스프링이 스캔하고 스프링빈으로 등록해주는 방식입니다

@Component 어노테이션이 있으면 자동으로 스프링빈으로 등록됩니다. @Controller, @Service, @Repository 모두 @Component을 포함하고 있는 어노테이션이기 때문에 스프링빈으로 등록된 것입니다🍒



스프링 컨테이너에는 다음과 같이 등록되어있을 것입니다. 이때 스프링빈등록은 @Controller, @Service, @Repository 어노테이션을 통해, 화살표는 Autowired가 이어준것이라고 보면 됩니다

0개의 댓글