토비의 스프링 요약 (ch2 -테스트)(2)

Autowired : xml에 등록한 Bean과 같은 타입을 찾아서 DI해준다.

절대바뀌지 않는 상황에도 인터페이스를 활용한 DI를 적용해야할까?

  • YES!!
    • 절대로 바뀌지 않는것은 없다
    • 다른 차원의 서비스를 도입 할 수 있다 - (예: 부가기능으로 count를 한다던지..)
    • 효율적인 테스트를 위해서

테스트 코드에 의한 DI

  • 테스트에서, 실제로 사용하는 DB를 사용? -> 위험
  • 테스트 코드 내에서 직접 DI하기 \
  • @DritiesContext : 해당 테스트에서 에플리케이션 컨텍스트 상태를 변경하겠다 (예 : db변경)

테스트를 위한 별도 DI설정

  • 수동으로하면 번거롭다
  • test-applicationContext.xml 생성!
<!-- url 부분에 test시에 사용할 DB로 바꿈! -->
<bean id="dataSoource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
	<property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/testdb" />
    <property name="username" value="user" />
    <property name="password" value="pass" />
</bean>
  • test시에 @ContextConfiguration에 있는 lotation 을 test용으로바꿈,

컨테이너 없이 DI테스트

  • 목적이 분명하다면 해당 Object를 직접 생성하여 만든다
  • API에 의존하지 않고 관심에만 집중하여 깔끔하게 만든다.
  • API에 종속되지 않고 비 침투적 기술로, 스프링에 의존하지않고도 DI가능

어떤것이 좋은가??

  • 일단 컨테이너 없이 테스트 하는것을고려
  • 복잡하다면 Spring 설정을 사용
  • 영향을 주지 않게 하려면 테스트 설정을 따로 만든다.

학습테스트 - learning test

  • 다른사람이 만든 코드와 기능에 대한테스트
  • 프레임워크나 라이브러리에 대해서도 테스트

학습 테스트의 장점

  • 해당 코드의 기능을 다양한조건을 활용해서 쉽게 확인할 수 있음
  • 테스트 코드를 참고하여 개발에 활용 할 수 있음.
  • 업데이트할때 호환성 검증
  • 테스트 코드 작성 훈련
  • 새로운 기술을 배울대 즐거워짐…??? (오래 기억에 남는다)

버그테스트

  • 요류를 알려줄 수 있는 테스트
  • 버그를 알았을 경우, 그 버그로 인해 실패할만한 케이스를 만들고 성공하도록 코드수정
  • 장점
    • 테스트의 완성도가 높아짐
    • 버그의 내용을 명확하게 분석 할 수 있다.
    • 기술적인 문제를 해결하는데 도움이 됨.

정리

  • 테스트는 자동화, 빠르게실행가능해야함 -> JUnit사용
  • 일관성 보장, 순서에따라 달라지며안됨
  • 테스트하기 좋은코드가 좋은코드
  • 테스트를 먼저 만들고 이를 성공으로바꿔가는 TDD방법
  • @Before, @After와같은 작업으로 공통코드를 줄일 수 있음
  • 스프링 테스트 컨텍스트 프레임워크를 사용하여 성능 향상 가능
  • @Autowired를 사용하여 오브젝트에 DI 할 수 있음
  • 오류에 대비해 버그테스트를 만들어 놓으면 좋음
  • 기술의 사용방법을 익히고 이해를 돕기위해 학습 테스트를 작성하자.


토비의 스프링 요약 (ch2 - 테스트)


[ 2.1 UserDaoTest 다시보기 ]

문제점

  • main()에서 테스트 수행
  • UserDao를 가지고와서 직접 호출
  • 테스트할 값 직접 입력
  • 테스트 결과는 콘솔로…

작은단위의 테스트 (Unit Test)

  • 테스트 대상을 쪼개서 분석하고자 하는 대상에만 집중
  • ‘관심사의 분리’라는 원리가 테스트에도 적용
  • 기능에 따라 웹 인터페이스, 서버 등의 기능과 분리
  • 개발자가 의도한대로 동작하는지 스스로 빨리 확인하기 위해!

[ 2.2 UserDaoTest 개선 ]

자동으로 수행되게!

  • 테스트 결과를 콘솔창으로 출력하기 때문에 개발자가 눈으로 확인하는 절차를 줄여야함.

효율적인수행과 결과관리

  • main()으로 테스트 : 규모가 커지면 부담… -> JUnit
  • JUnit이 개발자가만든 코드를 실행 -> IoC의 동작원리
  • JUnit테스트 프레임워크가 수행해주는 조건
      1. 메소드가 public 으로 선언
      1. @Test 라는 애노테이션 붙이기
  • 검증코드의 전환
//main에서 테스트하던 UserDaoTest
if(!user.getName().equals(user3.getName())){
	System.out.println("테스트 실패 (name)");
}
//JUnit으로 개선된 코드
//is() : .equals()의 역할을 대신함
assertThat(user2.getName(), is(uiser.getName()));

[ 2.3 개발자를 위한 테스팅 프레임워크 JUnit ]

테스트실행

  • 다양한 IDE가 지원함 (이하 이클립스 기준)
  • Run As - JUnit Test 로 한번에 실행가능
  • Alt+Shift+x , t
  • Ant, Maven같은 빌드 툴, 슼므립트 사용가능

테스트의 일관성

  • 반복되어도 항상 같은 결과가 나와야함 (일관성)
  • DB검사의 경우 deleteAll()과 같은 기능을 통해 확인가능 - deleteAll()도 테스트해야함

에러 테스트

  • 발생할 것으로 기대하는 예외 클래스 지정.( 예외 발생 안하면 테스트 실패)
//expected 라는 문구는, 정상수행시 fail하게 만든다!
@Test (expected = EmptyResultDataAccessException.class)
  • 작성하는 코드에는 예외 클래스로 던지게 만든다,
if(user == null) throw new EmptyResultDataAccessException(1);
  • 성공하는 테스트만 만들지말고, 실패하는 경우도 생각하자!
    • 내pc에는 되는데,.,,,
    • 항상 부정적인 테스트먼저 만들어 보자

테스트 주도 개발 (TDD - Test Driven Development)

  • 테스트 우선개발 (Test First Development) 이라고도 함.
  • 테스트 조건을 하나의 기능 정의서 처럼 생각함.
  • 테스트를 성공시키기위한 목적이 아닌 코드는 작성하지 않음.
  • 빠른 피드백과 확신
  • 작업의 주기가 짧아진다 (개발-테스트-원인파악-…)

테스트코드 최적화

  • 중복된 코드는 하나의 함수로 분리한다(ex. db 연결)
  • @Before 같은 애노테이션을 적극 활용
  • JUnit의 동작방식
  1. @Test, public, void, 파라미터없는것을 찾음
  2. 테스트 클래스의 오브젝트 만듬
  3. @Before를 수행
  4. @Test 를 호출하고 저장
  5. @After 수행
  6. 2~5반복
  7. 결과를 보여줌
  • 픽스처 fixture
    • 반복적으로 사용되는 데이터들 ex. DB에 넣기위한 user데이터들
    • private로 변수를 선언하고 @Before에서 초기화 하여 중복 제거

[ 2.4 스프링 테스트 적용 ]

출처 : 토비의 스프링 3.1 vol1. - 이일민 지음

2017-01-15-Toby-Spring-3.1(ch1)

토비의 스프링 - 요약

ch1 오브젝트와 의존관계

리팩토링 , 디자인페턴

  • 기능은 그대로,다른코드
  • 관심사항을 분리하고 , 영향을 끼치지 않게 독립적으로
  • GoF의 디자인페턴 , 헤드퍼스트 추천 !

템플릿메소드 페턴

  • 상속을 통해 슈퍼클래스의 기능을 확장
  • 슈퍼 : 추상메소드정의 , 기본알고리즘구현
  • 서브 : 구현해서 확자사용

펙토리 메소드 페턴

  • 상속을 통해 기능확장하는점은 같음
  • 주로 인터페이스형태로 리턴

OCD - ( Open - Closed Principle )

  • 확장에는 열려있고 변경에는 약하게

응집도와 결합도

  • 응집도 : 높을수록 하나의 관심사에 집중
  • 결합도 : 높을수록 다른 기능에 영향을 주고 받는다
  • 높은 응집도와 낮은 결합도를 가진 프로그래밍. 관심있는 기능끼리는 모으고, 관심외 분야에 영향을 적게 받게 만든다.

IoC 제어역전

  • 자신이 사용할 오브젝트를 스스로 결정하지 않는다.
  • 수동적으로 사용되게
  • 내가만든 코드가 어떻게 사용될지 모른다 !

라이브러리 vs 프래임워크

  • 라이브러리 : 에플리케이션이 라이브러리를 사용한다.
  • 프래임 워크 : 프레임워크가 에플리케이션 코드를 실행한다.

용어정리

  • bean
    • 스프링이 IoC 방식으로 관리하는 오브젝트
  • bean factory
    • IoC를 담당하는 핵심 컨테이너, 빈을 등록 생성 조회 반환 등 관리
  • application context
    • 빈 팩토리를 확장한 IoC컨테이너
  • configuration metadata
    • IoC를 적용하기 위해 사용하는 정보
  • IoC container
    • IoC방식으로 빈을 관리한다는 의미에서 bean factory나 application context를 container라고 함

동일성과 동등성

  • 동일성
    • ==
    • dentical
    • 사실상 같음
  • 동등성
    • equality
    • .equals()
    • 기능상 같음(같은기능을 하는)

싱클톤 레지스트리

  • private로 생성자를 만드는 싱글톤 기법을 사용하지 않고도 싱글톤을 보장함
  • 일반 싱글톤으로는 상속 불가, 테스트힘듬, 서버환경에서 싱글톤 보장불가 등 다양한 이슈가 있어서 이를 해결하기위해 나옴

DI 의존성 주입

  • 의존성 : A가 B에 의존적이다 : B에따라 A가 바뀐다 : A가 B를 사용하고 있다 : A - - -> B
  • 생성자 보다는 Setter !
  • 외부 (제 3자가 )에서 의존성을 맺어준다 ! - > application context , bean factory , IoC container

XML 설정

  • 위와같은 패턴으로 DI를 할 경우 반복적으로 정형화된 패턴이 나타나므로 XML포멧으로 나타 낼 수 있음 .
  • 예제는....

출처 : 토비의 스프링 3.1 vol1. - 이일민 지음

+ Recent posts