[스프링 입문 by 김영한] 4. 스프링 빈과 의존관계

Hazel Park·2021년 2월 14일
0
post-custom-banner
  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록하기

스프링 빈으로 등록해서 사용하면 장점(AOP 등)이 많음.

화면을 붙이기 위해 Controller와 뷰 템플릿이 필요하다.

Controller는 Service를 이용해서 Repository 에 데이터를 입력/조회
다시 말해, Controller가 Service를 의존한다. (의존관계가 있다)

회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비한다.

Controller -> Service -> Repository

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

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

컴포넌트 스캔 원리

  • @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
  • @Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
    • @Controller
    • @Service
    • @Repository

패턴

  1. (컨트롤러) 외부 요청 받음
  2. (서비스) 비즈니스 로직 만듦
  3. (리포지토리) 데이터 저장

서비스에서 사용하는 객체를 new로 생성하지 않고
Spring 컨테이너에 등록하고 하나만 생성해서 공용으로 사용하도록 한다.

의존성 주입이란?

@Autowired
생성자

생성자에 @Autowired 를 사용하면 스프링이 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다(넣어준다).

이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection, 의존성 주입)이라 한다.

참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.

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

DI 방법 3가지

  1. 필드 주입 // 비추천. 중간에 바꿀수 있는 방법 없음.
  2. setter 주입 // 비추천. 중간에 바꿀 일이 없는데 public으로 노출시키는 문제.
  3. 생성자 주입

의존관계가 실행중(런타임)에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.

그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

MemoryMemberRepository를 다른 영향 없이 다른 구현클래스로 바꿔치기 할 수 있게 해준다.
예) MemoryMemberRepository -> DbMemberRepository를

profile
금융에 진심인 개발자
post-custom-banner

0개의 댓글