분류 전체보기 (199) 썸네일형 리스트형 [핵심 정리] 대규모 트래픽 처리를 위한 부하테스트 입문/실전 해당 내용은 인프런 강의 [대규모 트래픽 처리를 위한 부하테스트 입문/실전]을 듣고 개인적인 공부 목적으로 핵심적인 내용을 정리한 요약본입니다. 자세한 원리 혹은 개념 설명이 궁금하시다면 강의를 참고하시는 것을 권장드립니다. 부하테스트란?: 시스템의 트래픽 수용량을 테스트하는 것주요 측정량 1) 처리량(Throughput) : 1초당 처리할 수 있는 트래픽 양: 단위 TPS(Transaction Per Seconds) : 1초당 처리한 트랙잭션의 수 2) 지연 시간(Latency): 요청에 대한 응답 시간ex) latency가 2.5초이다. == 하나의 API에 요청을 보내고 응답을 받기까지 2.5초가 걸렸다병목지점전체 시스템에서 특정 서버자원(CPU, Memory 등)이 한계에 도달해 전체 성능이 저.. deleteAll vs deleteAllInBatch : 성능차이 + 영속성 컨텍스트 반영여부 SimpleJpaRepository에 구현된 deleteAll을 보면 내부적으로 엔티티를 하나씩 순차적으로 돌면서 delete() 메서드를 호출하고 있습니다. 이말은 즉슨 엔티티의 개수만큼 delete 쿼리가 나가게된다는 것을 의미합니다.문제 상황 : deleteAllInBatch를 사용한 메서드 테스트 오류 디베이트 타이머 1차 스프린트의 주요 내용은 디베이트 시간표와 시간표를 구성하는 타임박스들의 CRUD를 구현하는 것이었습니다. 그중 의회식 토론 테이블의 삭제 로직을 구현하는 과정에서 더 나은 성능을 위해 deleteInBatch 메서드를 사용했습니다. @Transactional public void deleteTable(Long tableId, Member member) { .. CI 과정에서 jacoco를 활용한 테스트 커버리지 확인하기 안녕하세요 브로콜리입니다. 프로젝트를 진행하며, CI 스크립트를 맡게 되었습니다. CI 과정에서는 작성한 테스트가 모두 통과하는지 검증해 품질이 보장된 코드가 merge되도록 하였습니다. 그러나, 단순히 테스트의 결과를 검증하는 것은 테스트 결과를 보장할 뿐입니다. 오히려, 코드가 통합되는 과정에서는 다음과 같은 질문이 중요할 수 있습니다.- 내가 작성한 코드를 검증할만한 테스트를 작성하였는가?- 팀의 전반적인 테스트 커버리지는 어느정도 되는가? 그리고 이렇게 테스트에 대한 커버리지 컨벤션을 확인할 수 있도록 도와주는 것이 바로 jacoco 라이브러리입니다. 오늘은 CI 과정에서 테스트 커버리지를 검증하기 위해 사용했던 jacoco의 설정부터 CI 스크립트에 적용한 과정까지를 기록으로 남겨두고자 합니다... JsonDeserializer 커스텀으로 외부 API 에러 핸들링하기 Situation : 에러에도 200을 응답하는 외부 API 지각 방지 서비스 오디에서는 A지점에서 B지점까지의 대중교통 소요시간을 측정하기 위해 ODsay API를 활용하였습니다. 외부 API를 활용하면서 외부 API에서 에러를 반환하는 상황에 대한 핸들링도 자연스레 신경을 써야했습니다. 처음에는 자연스레 ResponseErrorHandler를 만들어서 해결하려 했습니다. 밸덩 글에 수록된 ResponseErrorHandler의 예시를 보겠습니다.@Componentpublic class RestTemplateResponseErrorHandler implements ResponseErrorHandler { //에러인지 판단 @Override public boolean hasError(C.. MapStruct로 Domain - Dto 쉽게 매핑하기 안녕하세요 브로콜리입니다. 최근 가까운 사람이 회사 면접을 보면서 Dto, Entity, Domain 간의 객체 매핑 과정에서 MapStruct를 사용해보는 것은 어떻겠냐는 조언을 들었습니다. 여기서 MapStruct라는 키워드를 알게되었고, Domain to Dto 나 Dto to Domain은 개발자에게 참으로 지루한 작업 중 하나이므로 손쉽게 매핑이 가능한 라이브러리가 있다면 한번 알아보고 쉽다는 욕심이 생겼습니다. 이로써 오늘은 MapStruct의 공식문서를 기반으로 실습 코드를 작성하며 학습한 내용을 정리해보려 합니다. MapStruct란?- 객체간 매핑을 손쉽게 도와주는 라이브러리- AnnotationProcessor를 통해 build 타임에 MapperImpl을 getter/setter를 기.. [디베이트 타이머 - 1차 스프린트] 코드 & Git 컨벤션 정하기 이 글은 지난 1차 OT 이후 글 이후의 과정을 담았습니다. 지난 1차 OT에서 각 파트의 프로젝트 요구사항으로 지정했던 것은 코드 컨벤션과 Git 전략에 대한 서술이었습니다. 코드 컨벤션 : 코드 작성 시 팀원끼리 지켜야할 합의된 규칙을 의미합니다.Git 브랜칭 전략 : 브랜치 생성 / 삭제 / 병합에 대한 팀원간의 합의된 규칙을 의미합니다. 이번주 진행사항은 파트끼리 합의한 하나의 규칙을 선정하는 것이었습니다.따라서, 1차적으로 제가 진행했던 프로젝트 `오디`의 백엔드 컨벤션을 기반으로 각 팀원이 추가하고픈 내용 / 삭제하고픈 내용을 자율적으로 적어와 회의가 진행되도록 하였습니다. 그럼 컨벤션 회의에서는 어떤 내용들이 오고갔을까요? 코드 컨벤션백엔드 코드 컨벤션은 크게 3가지로 나누어졌습니다.1) .. FCM 알림 비동기 + 이벤트 리스닝으로 리팩터링 하기 - 2편(테스트) 안녕하세요 브로콜리입니다. 지난 글에서는 동기화되어 있던 FCM 알림 로직을 비동기 + 이벤트 리스닝을 방식으로 리팩터링한 과정에 대해 소개해드렸습니다. 그 과정에서 1) 알림 로직과 비즈니스 로직간의 결합도 감소 2) latency 성능 개선 이라는 이점을 얻을 수 있었습니다. 그러나, 모든 구현의 완성은 테스트인만큼 비동기 + 이벤트 리스닝 방식을 어떻게 테스트할지 고민이 생겼습니다.Situation : 비동기 + 이벤트 리스닝 방식을 테스트하자! 다시한번 상황을 짚어보겠습니다. 비동기 + 이벤트 리스닝 방식으로 개선된 알림 서비스는 다음과 같은 모습입니다.1) 상위 모듈은 fcmEventPublisher를 통해 이벤트를 발행합니다.2) 발행된 이벤트는 fcmEventListener를 통해 수신합니다.. [디베이트 타이머 - 1차 스프린트] 팀 빌딩과 프로젝트 OT 우아한테크코스 6기를 백엔드를 수료함과 동시에 정말 많은 미련이 남은 활동은 역시나 프로젝트였습니다. 그 아쉬움을 구체화해보자면 다음과 같습니다.- 명확한 문제정의를 통해 그것을 해결하는 서비스를 만들고 싶다.- 실사용자가 있었으면 좋겠다. (== 사용자를 가정한 리팩터링을 하고 싶지 않다)- 서비스의 점진적 성장을 사용자와 함께 하고 싶다 인생 어차피 한번 사는거... 할 생각이 있으면 해야죠!! 실력은 부족하더라도 들이박아보고 싶었습니다.그래서 직접 아이디어를 만들고 프로젝트를 리딩하기로 결정했습니다. 1. 나는 어떤 문제를 해결하고 싶은가 : 아이디어 구체화 이에 레벨4 종료시기에 맞추어 제가 활동했던 도메인들에서 만들고 싶었던 서비스 아이디어를 구체화하기 시작했습니다. 여러가지 도메인이 있었지만 .. 이전 1 2 3 4 5 ··· 25 다음 목록 더보기