이 글은 김영한 님의 스프링 입문 강의(https://inf.run/hcic)를 수강하며 학습한 내용을 정리한 글입니다.
컴포넌트 스캔과 자동 의존관계 설정
회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비
1. MemberController클래스 생성
@Controller
애노테이션이 있으면 스프링이 뜰 때 스프링 컨테이너에 등록이 되며, 컨트롤러가 컨테이너를 관리하게 된다
Controller의 생성자가 실행된다
참고: helloController는 스프링이 제공하는 컨트롤러여서 스프링 빈으로 자동 등록
@Controller가 있으면 자동 등록됨
2. MemberService 객체
MemberController는 MemberService 객체가 필요하지만 new를 통해 생성하는 건 올바르지 않다
Constructor로 매개변수를 MemberService로 하는 생성자를 만든다
@Autowired
애노테이션을 생성자에 붙이면 스프링이 연관된 객체(MemberService)를 스프링 컨테이너에서 찾아서 연결한다
→ 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다
생성자가 1개일 때는 @Autowired 생략 가능
※ 객체 의존관계를 외부에서 넣어 주는 것: DI(Dependency Injection), 의존성 주입
이전 포스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해 준다
🚨 실행 시 오류 발생
MemberService.java: 순수한 자바 클래스라서 스프링이 다룰 수 있는 방법이 없다
💡 @Service
MemberService 클래스 앞에 @Service 애노테이션을 붙여서 스프링에게 Service임을 알려 준다
스프링이 이를 확인하고 스프링 컨테이너에 MemberService를 등록한다
++
@Repository
스프링 빈을 등록하는 2가지 방법
1. 컴포넌트 스캔과 자동 의존관계 설정 - 이번 포스트 내용
2. 자바 코드로 직접 스프링 빈 등록하기
컴포넌트 스캔 원리
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다
@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다
@Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다
@Controller @Service @Repository
정리
1. @Service을 붙이면 스프링이 Service임을 인식하고 MemberService를 컨테이너에 등록한 후 생성자를 호출
2. @Autowired가 붙은 생성자가 호출되면 연관된 객체(MemberRepository)를 연결하면서 필요로 하는 객체임을 인식 후, 스프링 컨테이너에 있는 MemberRepository를 연결시켜 준다
3. 현재 MemoryMemberRepository가 구현체로 있으므로 스프링은 MemoryMemberRepository를 서비스로 주입해 준다
→ @Component를 포함하는 @Controller @Service @Repository 모두 마찬가지
스프링이 각각 하나씩 객체로 만들어서 스프링 컨테이너에 등록한다
@Autowired는 연관 관계를 맺어 준다
참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다
package hello.hellospring;
'Back-End > Spring' 카테고리의 다른 글
[Spring] 회원 관리 예제 - 웹 MVC 개발 | 회원 웹 기능 - 홈 화면 추가 (0) | 2022.02.25 |
---|---|
[Spring] 스프링 빈과 의존관계 - 자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.02.25 |
[Spring] 회원 관리 예제 - 백엔드 개발 / 회원 서비스 테스트 (0) | 2022.02.23 |
[Spring] 회원 관리 예제 - 백엔드 개발 / 회원 서비스 개발 (0) | 2022.02.23 |
[Spring] 회원 관리 예제 - 백엔드 개발 / 회원 리포지토리 테스트 케이스 작성 (0) | 2022.02.23 |
댓글