List<Throwable>
구조인 Suppressed 에 저장한 뒤, 이를 출력하여 발생한 모든 예외를 순서에 맞춰 보여주도록 설정할 수 있다.org.springframework.boot:spring-boot-starter-test 디펜던시에
Mockito, AssertJ, Junit5 가 포함된다.
Mock 객체를 쉽게 만들고 관리/검증할 수 있도록 도와주는 테스트 프레임워크
특정 클래스를 테스트할 경우, DI 가 없어서 의존 관계를 가지는 클래스를 직접 임포트하거나, @SpringBootTest 를 통해 의존관계를 주입해야 한다.
이 경우, 스프링부트 서버를 기동시키기 때문에 하나의 클래스를 테스트함에도 많은 시간이 소요된다.
또한 의존 관계를 가지는 클래스에 영향을 받기 때문에 목표 클래스를 온전히 테스트하기가 힘들다.
이를 해결하기 위해 의존 관계를 가지는 클래스를 원하는 동작만 하도록 만든 것이 Mock 객체이다.
// given
when(roomService.findRooms(owner.getId(), null)).thenReturn(rooms);
// when
var responseDto = roomController.findRooms(owner.getId(), null);
// then
Assertions.assertThat(responseDto.getResultCode()).isEqualTo("S001");
Assertions.assertThat(responseDto.getResponse().size()).isEqualTo(3);
BDD 기준으로 테스트 코드를 작성할 때, 시나리오에 맞게 테스트 코드가 읽힐 수 있도록 도와주는 (이름을 변경한) 프레임워크이다.
기존 Mockito 를 사용하는 경우와 달리 given 순서에 when 대신 given 코드가 사용된다.
// given
given(fcmV2Service.sendMessage(anyLong(), any())).willReturn(true);
// when
var apiResult = fcmController.sendMessage(userId, fcmSendMessageReqDto);
// then
assertThat(apiResult.getResultCode()).isEqualTo("S001");
assertTrue(apiResult.getResponse());
BDD : 행위 주도 개발(Behavior-Driven Development
) 로 테스트 대상의 상태 변화
를 테스트하는 것이 목표이다.
Given, When, Then
구조의 시나리오 기반 테스트를 권장한다.
Mockito Vs BDDMockito 비교글
TDD, BDD 참고글
여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 고립되어있는지 나타내는 레벨
특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용하는 정도를 나타낸다.
1) Dirty read
트랜잭션 내 다른 트랜잭션의 변경 내용을 Commit 전 읽은 뒤, Rollback 후 다시 읽었을 때 다른 결과가 나오는 현상
2) Non repeatable read
트랜잭션 내 같은 쿼리 두 번 실행 시, 대상 레코드를 다른 트랜잭션에서 수정/삭제하는 경우 동일 쿼리임에도 결과가 다르게 나타나는 비 일관성이 발생하는 현상
3) Phantom read
트랜잭션 내 같은 쿼리 두번 실행 시, 첫 번째에 검색되지 않던 레코드가 두 번째 쿼리 실행 시 나타나는 현상
다른 트랜잭션에서 Insert 하는 경우에만 발생한다.
격리 수준 | DIRTY READ | NON-REPEATABLE READ | PHANTOM READ |
---|---|---|---|
READ UNCOMMITTED | O | O | O |
READ COMMITTED | - | O | O |
REPEATABLE READ | - | - | O(InnoDB는 발생 X) |
SERIALIZABLE | - | - | - |
참고) InnoDB 기준 트랜잭션은 시퀀셜한 트랜잭션 번호를 가지고 있다.
undo 영역에 백업된 모든 레코드는 변경을 발생시킨 트랜잭션의 번호가 포함되어 있다.
PostgreSQL 에서는 READ UNCOMMITTED 레벨을 지원하지 않는다.
트랜잭션 격리수준 블로그 참고 글1) master
DROP, CREATE, ALTER TABLE
)2) slave
출처) MariaDB Maxscale ReadWritesSplit docs
Spring Boot Gradle Plugin 중 스프링 부트의 의존성들을 관리해주는 플러그인
프로젝트에 적용된 Spring Boot 버전에 맞춰 의존성을 자동으로 관리해준다.
plugins {
id 'org.springframework.boot' version '2.6.5'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
참고) Spring boot gradle plugin 은 Gradle 4.4 이상부터 지원된다.
운영 및 개발 작업 간 균형을 유지하는 것이 SRE의 핵심이다.