자바 웹프로그래밍 2기 강의 16일차 내용을 정리한 포스팅입니다.

테스트의 중요성!

테스트 용도

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

  • 학습 목적으로의 테스트

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

  • ORM을 쓴다면 DAO쪽에는 test 코드를 작성할 필요가 없다.

  • 한 번에 한 가지 작업에 집중할 수 있도록 도와준다.

  • 구현 단계

    • Test Case를 추출하기 위한 요구사항 분석 (가장 중요)

    • Test Case 구현을 위한 클래스, 메소드 기본 구조 설계

    • 각 Test Case별 구현

    • 리팩토링

학습 목적으로의 테스트

  • 새로운 API에 한정해 테스트 진행하는 것이 가능함.

  • API를 사용하고 피드백을 받는 시간이 1,2초 이내

    • 기존 production code에 통합되어 피드백을 받는 시간이 최소 1분 이내
  • 빠른 피드백 사이클은 더 많은 삽질을 가능하게 함

  • 빠른 피드백 흐름은 학습에 대한 동기부여를 제공함.

  • 익숙해지는데 6개월 정도 걸리셨다.

다시 AOP

AOP 용어

  • targer : 대상

  • advice : 타겟에 추가 기능을 붙인다.

  • pointcut : 선택적으로 advice를 적용

AOP를 구현하는 3가지 방법

  • Proxy (Decorator 패턴) : 타켓 클래스에 감싸는 클래스를 만든다.

  • Jdk dynamic Proxy, cglib, AspectJ

    • AspectJ는 문법만 쓰고 실제 구현은 cglib를 쓴다.

// cglib
@EnableAspectJAutoProxy(proxyTargetClass = true)

// jdk proxy
@EnableAspectJAutoProxy(proxyTargetClass = false)


@Component
@Aspect
public class LoggingAspect {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class);

    @Before("within(next.dao..*)")
    public void loggingForDao (JoinPoint jp) {
        Object[] args = jp.getArgs();

        for (Object arg : args ) {
            LOGGER.debug(arg + "");
        }
    }
}

AOP 장점

  • 프로덕션 코드 수정없이 추가 기능을 덧 붙일 수 있다.

트랜잭션!

  • propagation

  • isolation

  • RunTimeException , CompileTimeException

@Transaction 에서 알아야 할 개념

  • 주로 비지니스 레이어에서 트랜잭션이 이루어진다.

  • Isolation Level

    • 트랜잭션이 두개 이상이 있을때, 서로간에 어떤 영향을 미칠것이냐 정하는 level

    • select book, update book 동시에 일어나면

    • select book은 A 혹은 B 가 된다. (격리 수준에 따라서)

    • 더티리드 : 커밋도 하기전에 다른 쿼리에 영향

    • 논 리피트 리드 : 커밋 했을때 다른 쿼리에 영향 (update, delete에 한함)

    • 팬텀 리드 : 커밋 했을때 다른 쿼리에 영향

  • propagation

    • PROPAGATION_REQUIRED : 트랜잭션이 있으면 있는 트랜잭션을 재사용한다. (Default)

    • PROPAGATION_REQUIRES_NEW : 기존 트랜잭션은 대기하고 새로운 트랜잭션을 만들어서 시작한다. 새로운 트랜잭션이 끝나면 기존 트랜잭션이 커밋된다.

    • PROPAGATION_SUPPORTS : 트랜잭션이 없으면 트랜잭션이 없는 상태로 시작한다.

spring-boot-statrter-web

  • dispatcherServlet 들고 있음

  • https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

TIP

JPA 학습시 유용


@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest {
  @Autowired
  private UserRepository repository;
    @Test
    public void findByNameTest() {
    [...]
  }
}