Fast-Campus Java Web Programming Camp 16일차

강의 정리

Posted by kingbbode on January 9, 2017

Recently by the same author:


스프링캠프 2018-Consumer Driven Contract

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

You may find interesting:


Spring 에서 @ConditionalOnClass, @ConditionalOnBean 사용할 때 주의할 점

Spring Boot 기반의 자동 설정을 위한 AutoConfiguration 클래스를 만들다가 발생한 이슈 공유 (ClassNotFoundException, ArrayStoreException)


Spring Boot 와 Properties(or Yaml) Environment

Spring의 PropertySource 의 Yaml 미지원과 ConfigurationProeprties 의 locations Deprecated 의 배경을 알아보자!.

열여섯번째 강의

테스트 용도

  • 기능 구현에 대한 단위 테스트
  • 학습 목적으로의 테스트

기능 구현에 대한 단위 테스트

  • 한 번에 한 가지 작업에 집중할 수 있도록 도와준다.
  • 구현 단계
    • Test Case를 추출하기 위한 요구사항 분석
    • Test Case 구현을 위한 클래스, 메소드 기본 구조 설계
    • 각 Test Case별 구현
    • 리팩토링

학습 목적으로의 테스트

  • 새로운 API에 한정해 테스트 진행하는 것이 가능함.
  • API를 사용하고 피드백을 받는 시간이 1,2초 이내
    • 기존 production code에 통합되어 피드백을 받는 시간이 최소 1분 이내
  • 빠른 피드백 사이클은 더 많은 삽질을 가능하게 함
  • 빠른 피드백 흐름은 학습에 대한 동기부여를 제공함.

AOP

3요소

  • advice
  • target
  • pointcut

Jdk dynamic proxy vs cglib vs aspectJ

  • JDK dynamic proxy
    • JDK Proxy는 인터페이스에 대한 Proxy만을 지원하며, 클래스에 대한 Proxy를 지원할 수 없다는 것이 큰 단점이다.
  • Cglib
    • CGLIB Proxy 또한 JDK Proxy처럼 Runtime시에 Target 메써드가 호출될 때 해당 메써드의 Advice적용 여부를 결정하게 된다. 그러나 CGLIB는 메써드가 처음 호출 되었을때 동적으로 bytecode를 생성하여 이후 호출에서는 재사용하는 과정을 거치게 된다. 이 같은 과정을 통하여 두번째 호출 이후부터는 실행속도의 향상을 가져올 수 있는 방법을 사용하고 있다. 또한 CGLIB Proxy는 클래스에 대한 Proxy가 가능하다.
  • AspectJ
    • Runtime이 아닌 Compile 시점에 Aspect를 적용한다.

이미 구현되어 있는 애플리케이션에 Proxy기능을 추가할 때 JDK Proxy를 사용한다면 클래스로 구현되어 있는 소스에서 인터페이스를 추출한 다음 Proxy를 적용할 수 밖에 없다는 단점이 있다. 이와 같이 클래스에 Proxy를 적용하고자 할 경우에는 CGLIB Proxy만을 사용해야 한다.

@EnableAspectJAutoProxy(proxyTargetClass = true)
  • defualt는 false로 JDK dynamic prox를 사용.
  • true 일 때 Cglib를 사용

대표적인 AOP의 사용은 Transactional

Isolation Level

두 개 이상의 Transaction을 갖을 때 서로 간의 영향에 대한 레벨 설정

3가지 read 방식

  • Dirty Read
    • Commit과 상관없이 데이터를 변경
  • NonRepetable Read
    • Update, Delete에 한해서만 Commit하였을 때 데이터를 변경
  • Phantom Read
    • 모든 쿼리에 대해서 Commit하였을 때 데이터를 변경

isolation1

isolation2

Propagation Behavior

트랜젝션을 분리할 때 사용하는 레벨

Propagation


  • 전달 행위
    • 필수 값으로서 Spring 프레임워크 전달행위 중의 하나를 사용할 수 있다.
  • 격리 레벨
    • 선택 값으로 Spring 프레임워크 격리 레벨 중의 하나를 사용할 수 있다.
  • readOnly
    • 선택 값으로 실행하는 트랜잭션이 읽기 전용일 경우에 사용가능하다. 일반적으로 트랜잭션 내에서 SELECT 쿼리만을 실행하는 경우에 이 속성을 사용한다.
  • Rollback 규칙
    • Spring 프레임워크 트랜잭션의 디폴트 설정은 RuntimeException이 발생할 경우에는 Rollback, CheckedException이 발생하는 경우에는 Commit되도록 하고 있다. 그러나 트랜잭션의 속성을 지정할 때 Rollback 규칙을 이용하여 디폴트 설정을 변경하는 것이 가능하다. 그림의 Rollback 규칙에서 마이너스(-)로 시작하는 Exception에 대해서는 무조건 Rollback, 플러스(+)로 시작하는 Exception은 무조건 Commit되도록 규칙을 변경할 수 있다.