spring - 입문3
인프런 김영한님 스프링 입문 강의를 듣고 정리한 내용입니다
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8#
스프링 빈과 의존관계
컴포넌트 스캔과 자동 의존관계 설정
스프링 빈(Spring Bean)
- Spring 컨테이너가 관리하는 자바 객체
- 스프링 빈으로 등록을 해야 Spring 컨테이너가 인식할 수 있음
스프링 빈 등록 방법
- 어노테이션을 활용한 컴포넌트 스캔과 Autowired 설정
- 자바 코드로 직접 스프링 빈 등록하기
- memberController 에서는 memberService 객체를 사용
- memberService 에서는 memberRepository 객체를 사용
1. 어노테이션을 활용한 컴포넌트 스캔과 Autowired 설정
controller/MemberController.java
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
✅ @Controller 어노테이션을 달면 MemberController라는 객체를 만들어서 스프링에 넣어서 관리 = 스프링 컨테이너에 스프링 빈으로 등록
✅ @Autowired가 있으면 스프링이 스프링 컨테이너에 있는 memberService를 가져다가 연결
-> MemberController 객체가 생성될 때 스프링 빈으로 등록된 memberService 객체를 가져다가 넣어줌 = DI(의존관계 주입)
service/Memberservice.java
@Service
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
//생략..
}
✅ 그냥 MemberService 는 스프링 빈에 등록 안 된 순수한 자바 클래스라서 @Service 어노테이션을 달아줘야 스프링 컨테이너에 스프링 빈으로 등록
📌 cmd + option + b 로 구현체로 navigate
repository/MemoryMemberRepository.java
@Repository
public class MemoryMemberRepository implements MemberRepository{
// 생략 ..
}
✅ 이것도 @Repository 어노테이션을 달아줘야 스프링 컨테이너에 스프링 빈으로 등록
📌 컴포넌트 스캔 범위
spring.hello.spring/HelloSpringApplication.java
package spring.hello.spring;
메인함수가 속한 패키지까지만 스프링이 스캔(여기선 hello.hellospring만)
2. 자바 코드로 직접 스프링 빈 등록하기
컨트롤러는 그대로 두고 @Service, @Repository지우기
SpringConfig.java 생성
@Configuration
public class SpringConfig {
@Bean //스프링 빈 등록
public MemberService memberService() {
return new MemberService(memberRepository()); //memberService는 memberRepository 사용하도록 함
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
📌 Bean 등록 경우
- 정형화된 코드(컨트롤러, 서비스, 리포지토리)는 컴포넌트 스캔을 쓰는 것이 편리
- 정형화되지 않거나 상황에 따라 구현 클래스를 변경해야 하면 직접 스프링 빈을 등록하는 것이 편리