Search

스프링 빈과 의존관계

스프링빈을 등록하고 의존관계를 어떻게 설정하는지 알아본다.

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

html에 데이터를 뿌려줄려면 멤버 컨트롤러가 필요하다.
멤버 컨트롤러가 멤버 서비스를 통해서 회원 가입하고, 멤버 서비스를 통해서 데이터를 조회해야한다.
이걸 서로 의존관계라고 한다.
먼저 멤버 컨트롤러 생성.
@Controller public class MemberController { }
Java
복사
@Controller 어노테이션을 추가하게 되면
스프링이 해당 어노테이션을 보고 MemberController 객체를 생성해서 스프링이 들고 있다
그래서 스프링 컨테이너에서 스프링빈이 관리된다고 표현한다.
김영한 강사님의 자료 사진입니다
어노테이션이 있으면 스프링이 뜰 때 생성을 해서 자기가 관리를 한다.
private final MemberService memberService; @Autowired public MemberController(MemberService memberService) { this.memberService = memberService; }
Java
복사
생성자 만들어서 주면 memberService부분에 에러가 나는데
김영한 강사님의 자료입니다.
MemberService에 @Service 어노테이션을 추가해주면 된다.
MemoryMemberRepository에도 @Repository를 추가
김영한 강사님의 자료입니다.
연결 시켜줄때 @Autowired 를 사용하는데
이렇게 생성자에 쓰면은 멤버 컨트롤러가 생성이 될 때 스프링 빈에 등록되어있는 멤버서비스 객체를 가져다가 넣어준다. 이게 바로 DI (Dependency Injection)이다.

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

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

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

@Component 어노테이션이 스프링 빈을 자동으로 등록해준다.
@Controller
@Service
@Repository
다 @Component 컴포넌트 스캔으로 자동 등록이 된거다.
@Repository 어노테이션에 들어가면 해당 컴포넌트 어노테이션이 존재한다.

참고

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 싱글톤으로 등록. 같은 스프링 빈이면 모두 같은 인스턴스다.

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

자바 코드로 직접 스프링 빈 등록하는 방법을 진행한다.
SpringConfig.java 파일을 생성해서
@Configuration 어노테이션을 붙여준다.
@Configuration public class SpringConfig { @Bean public MemberService memberService(){ return new MemberService(); } }
Java
복사
스프링이 @Configuration을 보고 이건 스프링빈에 등록하라는 뜻이다.
그리고 스프링이 @Bean 보고 인식한다. 그러면 이 멤버 서비스를
@Bean public MemberService memberService(){ return new MemberService(); }
Java
복사
요 로직 그대로 호출해서 등록해준다.
@Configuration public class SpringConfig { @Bean public MemberService memberService(){ return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } }
Java
복사
이렇게 잡아주면
김영한 강사님의 참고자료입니다.
이 그림처럼 연결된다.

참고

DI에는
필드 주입 -권장하지 않는다.
setter 주입 - 권장하지 않는다.
생성자 주입 - 의존관계가 실행중에 동적으로 변하는 경우가 없어서 생성자 주입으로 추천
이렇게 3가지 방법이 있다.
@Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작한다. (ex) memberService, helloController)
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작 x.
졍형화된 컨트롤러, 서비스 ,레포지토리 → 컴포넌트 스캔 사용
정형화 되지 않은 컨트롤러, 서비스 ,레포지토리 → 설정을 통한 스프링 빈으로 등록

*참고