패캠 JAVA 16일차
자바 웹프로그래밍 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() {
[...]
}
}