본문 바로가기

개발일기장

(34)
xuni - 시간과 관련된 테스트는 어떻게 하면 좋을까? 목차 1. 주저리주저리 2. 해결책 - 테스트 환경에서만 시간 조작 - valueCreatedTime 를 변경하는 메서드 만들기 - 필드의 접근 레벨 변경 private 에서 protected 3. 3안을 채택한 이유 주저리주저리 종종 시간과 관련된 테스트를 해야할 때가 있다. 이럴 때 참 난감하다. 결국에는 공식 문서까지 살펴볼 때도 있었지만 그런 내용을 잘 포함하고 있지 않은 것 같다. 내 경험을 바탕으로 정리한 시간과 관련된 테스트는 두 종류이다. 1. 특정 시간에만 동작해야하는 로직 예를 들면 토요일에 주말 세일을 한다. 토요일에만 세일가가 적용되는지 테스트해야하는 경우가 이에 해당한다. 2. 시간 자체를 검증하는 테스트 예를 들어 인증을 위한 토큰을 발급했다고 해보자. 토큰에는 일반적으로 유효 ..
xuni 인증 도메인 - 회원 가입 로직과 트랜잭션 관리 회원 가입 기능에 대해 고민하고 구현하며 발생했던 일들을 기록해보았습니다. 목차 1. 회원 가입 로직 2. 트랜잭션 관리 3. 트랜잭션에서 발생한 예외에 대해 롤백하지 않도록 설정 회원 가입 로직 회원 가입 로직에 대해 설명하기 앞서 회원 가입과 관련된 의사 결정을 소개하겠습니다. (1) 이메일 회원 가입을 구현한다. (2) 본인 인증은 이메일을 활용한다. 이제 제가 생각해본 회원 가입 로직 2가지를 설명드리겠습니다. 회원 가입 로직 1안 1안 채택 시 - 회원 가입을 진행했지만 미인증으로 마무리된 회원 레코드는 사용도가 떨어질 것입니다. - 계정 활성화를 나타내는 속성을 테이블에 추가 되어야 합니다. 또한 로그인마다 활성화 속성을 확인해야 합니다. 회원 가입 로직 2안 2안 채택 시 - 인증 코드가 독..
Xuni - StudyGroup 테이블 Index 도입 배경 목차 1. StudyGroup Index 도입 배경 2. 결론 3. 성능 테스트 StudyGroup Index 도입 배경 1. StudyGroup 테이블 최대 레코드 수 = 스터디 상품 수 x 호스트 수 2. 사용자의 니즈 - 카테고리 별 그룹 조회 3. 카테고리 컬럼의 cardinality 1. StudyGroup 테이블 최대 레코드 수 = 스터디 상품 수 x 호스트 수 위 테이블을 통해 하고 싶은 말은 해당 테이블 레코드가 기하급수적으로 늘어날 수 있다는 점입니다. 예를 들면 회원 한 명이 제가 만든 서비스에 가입한다고 합시다. 그러면 회원 계정을 담은 Member 테이블에 레코드가 한 줄 추가 될 것입니다. 하지만 회원 한 명은 여러 StudyGroup 호스트가 될 수 있습니다. 그 말은 즉, 회원..
xuni - Spring Rest Docs 도입하기 해당 포스팅은 Spring Rest Docs 3.0.0 공식 문서와 개인적인 경험을 통해 작성되었습니다. 목차 1. 도입 배경 2. Spring Rest Docs 채택 이유 3. Spring Rest Docs 설정 4. Rest Docs 테스트 만들어보기 5. AsciiDoc으로 API 문서 만들기 6. Json Field Path, Mocking 을 통해 명세하기 도입 배경 팀 프로젝트를 진행할 당시, 백엔드 개발 담당이었던 나는 REST API로 프론트엔드 개발자에 데이터를 전달했어야 했다. 그래서 명세서를 만들기로 했고 지나보면 추억이지만 수기로 REST API 명세를 작성했었다. 문제는 인간은 기계보다 영리하지만 기계보다 꼼꼼하지는 못하다는 것이다. 다음은 수기로 API 명세를 만들 때 단점이다...
실행 분석 계획을 통해 인덱스 성능을 알아보자(삽질했어요.) 테이블 레코드 수 32563개 실제 불러와야 할 데이터 1119개, 인덱스 적용/미적용으로 비교합니다. 인덱스 적용 시 쿼리를 이해할 필요는 없고 인덱스가 적용되었다는 것만 알고가면 될 것 같습니다. 2행을 보시면 됩니다. index lookup은 특정 레코드를 조회하기 위해 인덱스가 사용되었음을 의미합니다. actual time 0.188..4.904 라는 의미는 첫 레코드에 접근한게 0.18ms 다 읽는데 평균 4.9ms가 걸렸다는 의미입니다. 인덱스를 적용햇기 딱 필요한 1119개만 스캔합니다. 인덱스 미적용 시 4행을 보면 ignore index가 보이시죠? index를 사용하지 않고 쿼리의 실행 분석을 보겠습니다. 여기서도 3행만 집중해서 봅시다. Table scan 은 테이블 전체 레코드를 순..
AWS 람다로 서버리스 서비스 만들기 (2) AWS lambda 적용 AWS 람다로 서버리스 서비스 만들기 (1) 로컬에서 테스트에 이어 작성합니다. 목차 1. 세팅 2. 적용 세팅 기존 환경 Java11, SpringBoot 2.7.11 1. build.gradle 에 다음 의존성을 추가합니다. implementation 'org.springframework.cloud:spring-cloud-function-adapter-aws:3.2.8' implementation group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.2.1' implementation group: 'com.amazonaws', name: 'aws-lambda-java-events', version: '3.9.0' 아마도 cloud-fun..
AWS 람다로 서버리스 서비스 만들기 (1) 로컬에서 테스트 사이드 프로젝트 Xuni를 진행하고 있습니다. 빨간색으로 밑줄 그어진 부분은 클라이언트의 요청이 없더라도 서버가 특정 이벤트를 마주하면 처리해야되는 부분입니다. 모두 시작일, 종료일이라는 트리거?가 존재합니다. 스프링 스케줄러를 이용하면 간단하게 해결가능합니다. 다만, 스케줄러를 이용하면 다음과 같은 고민이 필요할지도 모릅니다. (1) 멀티 서버 환경에서 서버 수 만큼 실행되는 스케줄러 이 경우 ShedLock이라는 것을 통해 해결할 수 있다고 합니다. (2) 스케줄러 동작 여부 슬랙 API를 이용하면 이 또한 해결할 수 있긴 합니다. 요즘 AWS 책 한 권을 사서 조금씩 보고있는데요. 무슨 바람이 든건지 AWS 람다를 활용하면 이 문제를 조금 더 효율적으로 해결할 수 있을 것 같다는 생각이 들었습니다...
도메인 주도 개발 시작하기 정리 - CQRS 패턴 시스템이 제공하는 기능은 크게 두 가지로 나눌 수 있다. 1. 상태를 변경하는 기능 ex) 새로운 주문 생성, 배송지 정보 변경 2. 상태 정보를 조회하는 기능 ex) 주문 상세 내역 보기, 회원 정보 보기 도메인 모델 관점에서 상태 변경 기능은 주로 한 애그리거트의 상태를 변경한다. 예를 들어 주문 취소 기능, 배송지 정보 변경 기능은 한개의 Order 애그리거트를 변경한다. 반면 조회 기능에 필요한 데이터를 표시하려면 두 개 이상의 애그리거트가 필요할 때가 많다. 상태를 변경하는 범위와 상태를 조회하는 범위가 정확하게 일치하지 않기 때문에 단일 모델로 두 종료의 기능을 구현하면 모델이 불필요하게 복잡해진다. 이러한 복잡도를 해결하기 위해 사용하는 방법이 CQRS다. CQRS Command Query ..