본문 바로가기
Framework/Spring

컴포넌트 스캔, 자동 의존관계

by 파2RI 2024. 1. 12.
@Controller
public class MemberController {
	}

 

@Controller 어노테이션을 붙여주면

스프링 컨테이너에서 Controller 객체를 생성해서 실행, 관리한다.

 

 

 

컨트롤러 생성 후 객체를 만들 때,

 private final MemberService memberService = new MemberService();

 

와 같이 new로 만들어서 따로 생성하기 보다는,

스프링 컨테이너에 하나만 등록해서 이것을 같이 쓰는 것이 좋다.

 

@Controller
public class MemberController {
    private final MemberService memberService;

    // @Autowired로 연결Spring 컨테이너에 등록
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

 

@Autowired라고 해주면,

스프링 컨테이너가 뜰 때 Controller 생성을 하는데,

그때 이 생성자를 호출한다.

그리고 @Autowired라고 되어있으면 스프링 컨테이너-멤버 서비스를 이곳에 연결을 시켜준다.

 

그리고 MemberService.java에 @Service 어노테이션을 해주면 되는데,

이를 통해서 스프링 컨테이너의 멤버 서비스를 이 클래스로 딱 등록해준다.

 

또 MemoryMemberRepository.java에는 @Repository라고 어노테이션 해주면 된다.

 

이렇게 보이다싶이, ~Controller.java에서는 @Controller

@~Service -.java 에서는 @Service

@~Repository.java 에서는 @Repository를 각각 어노테이션 해주어서

@Autowired 생성자에 연결해서 스프링 컨테이너가 뜰 때 이것들을 다 호출하는 것이다.

 

 

 

초록색 사각형이 @Component, 화살표가 @Autowired.

 

위 그림에서 helloController는 memberService가 필요하고, memberService는 memberRepository가 필요하므로 각각 @Autowired로 연결해준다.

 

@Service
public class MemberService {

    private final MemberRepository memberRepository;

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

 

MemberService 생성자 위에도 @Autowired 어노테이션을 넣어서

MemoryMemberRepository와 자동연결(autowire)해준다.

 

 

<스프링 빈을 등록하는 2가지 방법>

 

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

@Controller, @Service, @Repository를 붙여주는 것.

(원래는 @Component라고 해줘야 하는데 안에 다 들어있다.)

그리고 -> 가 @Autowired.

 

2. 자바 코드로 직접 스프링 빈 등록하기