Fast-Campus Java Web Programming Camp 14일차

강의 정리

Posted by kingbbode on January 5, 2017

Recently by the same author:


3년차 웹 개발자

4년차로 접어든 웹 개발자의 3년차 늦은 회고

You may find interesting:


SpringOne Tour Seoul - Spring Cloud Gateway

스프링 원 투어 서울 컨퍼런스 중 정윤진님의 Spring Cloud Gateway 세션


스프링캠프 2018-Consumer Driven Contract

Consumer Driven Contract 기법을 활용한 마이크로서비스 API의 진화

열네번째 강의

테스트하기 쉬운 코드라는 것은?

  • 새로운 기능이 추가되었을 때 확장하기 쉬운 구조.
  • 기능이 변경되었을 때 기능을 변경하기 쉬운 구조.

배운 것

DI

Singleton

class MemberService {
  private TeamRepository teamRepository = TeamRepository.getInstance();
  private MemberRepository memberRepository = MemberRepository.getInstance();
}

Singleton 패턴의 단점

  • 생성자가 private이기 때문에 상속을 할 수 없다.
  • Singleton 패턴을 사용하는 경우 객체 간 의존관계를 직접 연결함으로써 테스트하기 어렵다

Singleton 패턴 적용 없이 DI 1

DI를 자신이 아닌 다른 곳에 위임

class MemberService {
  private TeamRepository teamRepository;
  private MemberRepository memberRepository;

  public MemberService(TeamRepository teamRepository, MemberRepository memberRepository) {
    this.teamRepository = teamRepository;
    this.memberRepository = memberRepository;
  }
}

자바 코드를 통해 인스턴스를 직접 생성하고 DI를 연결하는 것이 가능하다. 하지만 이 방식으로 구현하는 경우 자바 객체 간의 의존관계가 깊어지는 경우 꼬 리에 꼬리를 물면서 인스턴스를 전달해야 하는 불편함이 있다.

ex)

TeamRepository teamRepository = new TeamRepository();
MemberRepository memberRepository = new MemberRepository();
this.memberService = new MemberService(teamRepository, memberRepository);

Spring 프레임워크는 이 같은 단점을 보완하기 위해 XML, 애노테이션과 같은 설정으로 빈(Bean) 간의 의존관계를 해결한다.

DI Annotation

@Autowire
  • 의존성 주입
@Autowire
@Qualifier(value="name")
  • 특정 이름의 Bean을 주입
  • 동일한 타입의 여러 Bean을 갖을 때 사용
@Autowire
@Qualifier(value="name")

@Resource(value="name")

과 같다.

DI 실습