[Spring] 입문 4-1. 컴포넌트 스캔과 자동 의존관계 설정

강우엉·2023년 6월 29일

Spring

목록 보기
12/359

💡 스프링 빈 등록, 의존관계 설정하기

앞서 만들었던 service와 repository를 구현하는 화면을 붙이려면 컨트롤러를 만들어야한다. 컨트롤러는 memberservice를 통하여야하는데 그걸 의존관계라고 한다.

controller 패키지에 MemberController를 만들고 아래와 같이 어노테이션을 붙인다. @Controller를 붙이면 MemberController 객체를 생성해서 스프링에 저장하고 관리한다. 이것을 spring 컨테이너에서 spring 빈이 관리된다라고 한다.

@Controller
public class MemberController {

}

memberService를 가져와서 써야하기 때문에 객체를 생성해보자.
new를 통해 생성할 수 있지만 인스턴스를 하나만 생성하면 되기 때문에 스프링 컨테이너에게 등록하고 쓰면된다.

생성자 코드를 적어주고 @Autowired 라는 어노테이션을 붙여준다.
MemberService를 스프링이 스프링 컨테이너에있는 MemberService와 연결해준다.

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

실행해보면 MemberService를 찾을 수 없다는 에러가 발생한다.
왜냐하면 MemberService 순수한 자바 클래스이기 때문에 스프링에서 관리를 해야하는지 알 수 없기 때문이다.

따라서 MemberService 클래스에 @Service라는 어노테이션을 붙여줘야한다.
어노테이션이 붙어있으면, 스프링이 올라올때 스프링 컨테이너에 등록하게된다.
마찬가지로 MemoryMemberRepository에도 가서 @Repository 어노테이션을 붙여준다. 역시 스프링 컨테이너에 등록이 되었다.

@Service
public class MemberService {
	
}

@Repository
public class MemoryMemberRepository implements MemberRepository {

}

연결되는 부분을 @Autowired로 연결해준다 이걸 의존관계를 주입한다라고 하는데 영어로 di 즉 Dependency Injection이다.

MemberService 클래스에서도 생성자에 @Autowired를 해주면 MemberRepository와 연결해준다.

@Service
public class MemberService {
	
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

그럼 아래와 같은 사진속 그림처럼 다 연결되게된다.

다시 빌드하면 에러없이 빌드되는걸 확인할 수 있다.

스프링 빈을 등록하는 2가지 방법이 있다.

  • 컴포넌트 스캔과 자동 의존관계 설정
  • 자바 코드로 직접 스프링 빈 등록하기

위에 방법이 컴포넌트 스캔이다.

@Service, @Controller, @Repository 어노테이션 말고 @Component 에노테이션을 붙여도된다. 다른 어노테이션 들어가보면 @Component 어노테이션이 붙어있다. 이러한걸 컴포넌트 스캔이다. (스프링이 올라올 때 어노테이션이 붙어있으면 객체로 생성해서 컨테이너에 등록한다.) @Autowired는 연결해주는 역할을 한다.

스프링 빈을 등록하고 사용하면 좋은점은 다음 시간에 알아보도록 하자.

아무데나 컴포넌트가 있어도될까? 생뚱맞은 패키지를 만들고 생뚱맞은 클래스에 컴포넌트를 붙이면 안된다. 왜냐하면 되는 경로는 기본적으로 hello.hellospring 하위 패키지 부분만 찾아서 등록한다.

참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다. 싱글톤이란 하나만 등록한다는 뜻 따라서 같은 스프링 빈이면 모두 같은 인스턴스이다.

profile
우엉이의 코딩 성장일기💻

0개의 댓글