개발/spring1

14강(스프링 빈을 등록하고, 의존관계 설정하기)

LoafingCat 2022. 11. 19. 21:56

컨트롤러랑 템플릿이 필요함. 멤버 컨트롤러를 만들어야 하는데, 얘가 멤버 서비스를 통해서 회원가입 하고 데이터를 조회 할 있어야 하는데 이런걸 서로 의존관계가 있다고 한다. 컨트롤러가 멤버 서비스를 의존한다. 작업을 스프링스럽게? 할거다.

 

여기에 멤버 컨트롤러 만들기

 

 

Controller라는 어노테이션이 있으면 Spring 뜰때 생성을 해서 자기가 관리를 한다.

 

 

멤버 컨트롤러가 멤버 서비스를 가져다 써야함. 그런데 이렇게 객체를 new 했는데 멤버 서비스 자체에는 기능이 없기 때문에 여러 개의 인스턴스가 필요가 없다. 그래서 하나만 생성해서 공용으로 사용하면

 

스프링 컨테이너에 등록을 하고 쓰면

 

 

 

 

스프링 컨테이너가 멤버 컨트롤러가 생성이 되면 이때 생성자를 호출한다. 근데 생성자에 AutoWired라고 되어있으면

멤버 서비스를 스프링이 스프링 컨테이너에 있는 멤버 서비스를 가져다가 연결을 시켜줌

 

 

근데 위에 빨간줄이 뜨고 실행해보니 멤버 서비스를 찾을 수가 없다고 한다. 무슨 이야기인가 하니

 

헬로 컨트롤러는 스프링이 스프링 컨테이너에 등록이 . AutWired라고 되어 있으면 스프링 컨테이너에서 관리하는  멤버 서비스를 가져다가 스프링이 넣어주는데.. 근데 안됨. 멤버 서비스에 가보자

 

MemberService 그냥 순수한 자바 클래스다. 스프링이 얘를 있는 방법이 없음. 

그럼 구분할 있게 만들어주자. @Service라는 어노테이션을 붙여주면 스프링이 서비스네? 하고 알아보고 스프링 컨테이너에 멤버 서비스를 등록해줌. 리포지토리도 똑같이 해주자

 

 

컨트롤러 통해서 외부 요청을 받고, 서비스에서 비즈니스 로직을 만들고, 리포지토리에서 데이터를 저장하는 정형화 패턴.

 

이제 생성자에 AutoWired 쓰면 멤버 컨트롤러가 생성될 스프링 빈에 등록 되어있는 객체를 가져다가 넣어준다. 이게 바로 디펜던시 인잭션임.

 

 

이제 실행해보면 연결 됐다는 것을 있음.

 

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

 

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

 

지금 한게 컴포넌트 스캔이다. 

 

사실 서비스가 서비스가 아니고 컴포넌트임.. 서비스 안에 들어가보면 컴포넌트가 들어가 있음.

 

스프링이 올라올 컴포넌트 관련된 어노테이션이 있으면 걔들은 스프링이 객체를 생성해서 스프링 컨테이너에 등록을 . AutoWired 그것들을 연결해서 멤버 컨트롤러가 멤버 서비스를 있는거고 AutoWired 멤버 서비스가 멤버 리포지토리를 있게 되는 . 이게 바로 컴포넌트 스캔과 자동 의존관계 설정이다.

 

 

아무데나 @Component 있어도 되나? 기본적으로는 안됨. Hello.hellospring 하위 패키지만 자동으로 스프링이 뒤져서 등록하고 외에는 등록하지 않음. 물론 설정을 하면 다른 거도 되긴 하는데 기본적으론 안됨. 그냥 이런 있구나 하고 알면 .

 

스프링은 스프링 컨테이너에 스프링 빈을 등록할 , 기본으로 싱글톤으로 등록한다. 싱글톤은 하나만 등록하는 것이다. 등록하지 않음. 그러므로 같은 스프링 빈이면 모두 같은 인스턴스다. 특수 케이스 제외하면 싱글톤임.