Spring REST Docs
·
TDD
API 개발을 완료하고, 엔드포인트를 공유해주기 위해 스펙을 정의한다.- 해당 스펙을 정의하는 툴에는 여러가지가 있지만 그 중 하나가Spring Rest Docs 이다.  Spring REST Docs테스트 코드를 통한 API 문서 자동화 도구API 명세를 문서로 만들고 외부에 제공함으로써 협업을 원할하게 한다.기본적으로 AsciiDoc을 사용하여 문서를 작성한다. REST Docs 와 Swagger 를 비교REST Docs장점테스트를 통과해야 문서가 만들어진다. (신뢰도가 높다)프로덕션 코드에 비침투적이다.단점코드 양이 많다,설정이 어렵다.Swagger장점적용이 쉽다.문서에서 바로 API 호출을 수행해 볼 수 있다.단점프로덕션 코드에 침투적이다.테스트와 무관하기 때문에 신뢰도가 떨어질 수 있다.  RE..
값이나 환경을 바꿔가며 테스트 하고 싶을 때
·
TDD
@ParameterizedTest@DisplayName("상품 타입이 재고 관련 타입인지를 체크한다.")@CsvSource({"HANDMADE,false","BOTTLE,true","BAKERY,true"})@ParameterizedTestvoid containsStockType3(ProductType productType, boolean expected) { // when boolean result = ProductType.containsStockType(productType); // then assertThat(result).isEqualTo(expected);}private static Stream provideProductTypesForCheckingStockType() { return ..
JSCODE 데이터베이스 모의면접 스터디 회고
·
회고
참가 계기퇴근 후에 심심할 때마다 개발 공부를 했지만, 어느 순간 매너리즘에 빠진 것 같았다.공부를 해도 실력이 느는 것 같지가 않고 ~  뭘 해야 할지 잘 모르겠고... 어느날 직장동료한테 이야기를 해보니 "스터디를 하면 도움이 많이된다"는 소리를 듣고 스터디를 찾아보기 시작했다. 그렇게 발견한게 JSCODE 모의면접으로 학습하는 CS, 자바 스터디였다!     위는 JSCODE 스터디의 소개다. 아래 [학습 목적으로 해당 스터디에 참여하는 것도 추천드립니다.] 라는 작은 글씨가 있었는데, 면접 목적이 아닌 나도 이 문구를 보고 참가를 결정하게 되었다. 그리고 이 스터디에는 멘토가 있다!!  내가 참여한 스터디는 JSCODE의 CS 면접 끝장내기 - 데이터베이스편이었다. 해당 스터디에는 운영체제, 자바..
더 나은 테스트를 작성하기 위한 고민
·
TDD
한 문단에 한 주제!하나의 테스트는 하나의 주제를 가져야 한다.ex) 테스트 코드에서 반복문이나, 분기문 같은 논리 구조 등이 들어가지 않는 형태로 만들어야한다. 만약 테스트에 로직이 들어갔다면, 테스트 케이스가 두 개 이상이다 라는 것을 방증 하기때문에, 별도의 테스트 케이스로 분류해야한다. 완벽하게 제어하기테스트를 하기 위한 환경을 조성할 때 완벽하게 제어할 수 있어야 한다.public Order createOrder() { LocalDateTime currentDateTime = LocalDateTime.now(); LocalTime currentTime = currentDateTime.toLocalTime(); if(currentTime.isBefore(SHOP_OPEN_TIME) || cu..
Mockito로 Stubbing 하기
·
TDD
Stubbing 데이터를 메일로 전송해주는 기능을 Mocking 테스트를 해보자! 왜냐면 메일 mailSend 같은 테스트는 매번 외부로 보내서 테스트 해야하는데, 이런 경우 테스트가 힘들 수 있다. 따라서, mailSendClient 컴포넌트의 sendEmail를 Mocking 처리해보자이걸 Mocking 으로 Stubbing 한다고 말한다.@MockBeanprivate MailSendClient mailSendClient;@DisplayName("결제완료 주문들을 조회하여 매출 통계 메일을 전송한다.")@Testvoid sendOrderStatisticsMail() {// given//products 생성 및 저장 .. 생략 productRepository.saveAll(products);//생성한 ..
[데이터베이스] 락과 DB 회복
·
Database
개발하며 가장 고민하게 되는 문제중 하나가 바로 동시성 문제라고 생각한다. 예로, 두 트랜잭션이 동일한 데이터를 갱신할 때, 마지막 트랜잭션 내용만 반영되여 다른 트랜잭션 작업이 유실되는 문제이다.이것을 갱신손실문제라고 한다. ex) 게임을 하고있을때 피가 10인데, 치유 50과 공격 30이 동시에 들어왔는데, 가장 마지막에 들어온 공격만 들어와서 내 캐릭은 죽어버림 (치유 작업은 유실!)그럼 이러한 문제를 어떻게 해결하느냐 그 방법 바로 Lock이다. DB 락트랜잭션 간 충돌을 방지하기 위해 데이터 대한 접근을 제한한다.Shared Lock: 읽기 전용 트랜잭션을 위한 락.Exclusive Lock: 쓰기 트랜잭션을 위한 락.DB 데드락두 개 이상의 트랜잭션이 서로의 락을 기다리면서 무한 대기해결 : ..
[데이터베이스] Transaction (트랜잭션)
·
Database
트랜잭션이 뭘까?일이 처리되기 위핸 가장 작은 단위이다.내가 B라는 대상자에게 10,000원을 계좌이체 한다고 하자.1. 내 통장의 잔액 10,000원 감소2. B 통장의 잔액 10,000원 증가→ 1.인출과 2.입금이라는 두 과정이 있다.→ 1.인출만되고, 2.입금은 실패하면 치명적인 결과가 나온다.이 두 과정은 동시에 성공하던지 동시에 실패해야한다.이 두 과정을 동시에 묶는 방법이 트랜잭션이다. 즉 이것을 데이터 베이스와 어플리케이션의 데이터 거래 에 있어서 안정석을 확보하기 위한 방법이 트랜잭션이다.→ 따라서 데이터베이스에서 테이블을 읽어 온 후 다른 테이에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면 결과를 재반영 하는 것이 아닌 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성..
응답 예외처리와 책임 분리
·
TDD
컨트롤러 응답성공했을 때, 그냥 데이터를 보내는 것 보단, 일정한 형식을 통해 항상 동일하게 보내주는 것이 좋다.public class ApiResponse { private int code; private HttpStatus status; private String message; private T data; public static ApiResponse of(HttpStatus httpStatus,T data) { return of(httpStatus,httpStatus.name(),data); }}//controller단 @PostMapping("/api/v1/product/new")public ApiResponse createdProduct(@Vali..