본문 바로가기

분류 전체보기

(42)
Java 8 LocalTime 직렬화 오류 1. 문제 정의 Redis를 이용해서 DB 캐시를 구현하려는 도중, LocalTime 타입의 경우 Serialization Error가 계속 발생했습니다. 이전에 직렬화 에러는 implements Serializable을 사용할 경우 해결한 경험이 있어 시도했지만, 에러는 해결되지 않았습니다. 2. Jackson 직렬화 의존성 추가 implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'이 의존성을 추가하면 해결할 수 있는 문제였습니다. Java 8 LocalTime 타입의 경우, 라이브러리를 통해 직렬화 에러를 해결할 수 있습니다. 의존성을 추가한 후, LocalTime 타입에서 직렬화와 역직렬화 정의를 해주어야 합니..
Loki를 통한 로그 모니터링 이 포스팅은 제가 작성한 UPbrella 프로젝트의 기술 블로그에 작성한 Loki를 통한 로그 모니터링 포스팅을 옮겨온 것입니다. 1. 문제 정의 업브렐라 서버팀은 ELK를 사용하여 로그 모니터링을 하려고 했습니다. 하지만 무거운 ELK를 감당하기에는 서버 비용이 부담이 들었고, 비교적 가볍게 실행할 수 있는 Grafana를 로그 모니터링 툴로 선택하게 되었습니다. 2. Grafana 2 - 1 Grafana란? Grafana는 오픈 소스로 제공되는 대시보드 및 시각화 플랫폼입니다. 이번 포스팅을 통해 Loki와 Promtail로 수집한 데이터를 Grafana로 시각화하는 방법에 대해서 알아보겠습니다. 2 - 2 Grafana 설치 wget으로 Grafana를 다운받고, 압축을 해제해줍니다. wget h..
nGrinder 자동화 이 포스팅은 제가 작성한 UPbrella 프로젝트의 기술 블로그에 작성한 nGrinder 자동화 포스팅을 옮겨온 것입니다. 1. 문제 정의 nGrinder를 사용해서 부하테스트를 하는 이유는 지난 게시글를 통해 알아보았습니다. 하지만 매번 배포를 할때마다 개발자가 nGrinder 서버를 띄워서 테스트 하는건 자원의 낭비라고 생각해서 자동화하기로 결정하였습니다. 2. nGrinder 자동화 도입 2-1 설정하기 java 11 과 docker가 설치되었다고 가정하고 진행하겠습니다. 도커로 ngrinder를 pull 하고 실행해줍니다. sudo docker pull ngrinder/controller:3.5.5-p1latest 버전이 아닌 3.5.5-p1을 명시해준 이유는 3.5.6 이상부터는 Script E..
JPA Repository는 Entity만을 조회해야 할까? 이 포스팅은 제가 작성한 UPbrella 프로젝트의 기술 블로그에 작성한 JPA Repository는 Entity만을 조회해야할까?를 옮겨온 것입니다 1. 문제 정의 대여 기록을 관리하기 위해서는 여러 테이블과의 조인이 필요합니다. 문제는 여기서 발생하는데요, 기존의 업브렐라 개발팀은 개발 속도 및 편의를 위해 JPA Repository에서 Entity만 조회하였습니다. 하지만 이는 성능에 많은 영향을 미치고 있었습니다. 2. 대여 기록 분석 대여 기록은 여러 테이블을 조인하는데 비해 적은 수의 데이터를 반환하고 있습니다. 코드를 먼저 살펴보겠습니다. @Override public List findAll(HistoryFilterRequest filter, Pageable pageable) { return..
AES 암호화 1. 문제 정의 개인정보는 정보통신망법에 의해 암호화해서 저장해야 합니다. 따라서 업브렐라 개발팀은 AES / ECB 방법을 채택하여 사용자의 정보를 저장하려고 했습니다. 하지만 AES / ECB 방법의 허점을 인지하고 더 안전한 방법은 AES / CBC 방법을 채택하려고 합니다. 2. AES AES란 ‘Advanced Encryption Standard’의 약자로, 현대 보안 시스텡믜 핵심 기술 중 하나입니다. AES 암호화는 미국 정부가 2001년에 표준으로 채택한 대칭키 암호화 방식입니다. 이 방식은 128, 192, 256 비트의 세 가지 키 길이를 지원하며, 블록 암호화 방식으로 데이터를 암호화하고 복호화합니다. AES 암호화 방식에도 여러가지 방법이 있습니다. 이번 포스팅을 통해서는 ECB와 ..
Index를 활용한 성능 개선 1. 문제 정의 저번 게시글을 통해 bulk insert를 하니, 단순 조회 api도 오랜 시간이 걸리는 것을 경험할 수 있었습니다. 서비스가 활성화될 수록 데이터는 쌓일 것이기 때문에, 이를 해결해보도록 하겠습니다. 2. 쿼리 분석 조회 쿼리를 분석해보니, Full Table Scan을 하고 있는 것을 알 수 있습니다. Full Table Scan이란 -----. 따라서 이러한 쿼리들이 많이 있다면 API 성능은 떨어질 수 밖에 없습니다. 3. 문제 해결 3 - 1. Index 추가 위의 문제를 해결하기 위해 Index를 추가해보도록 하겠습니다. select umbrella0_.id as id1_9_, umbrella0_.created_at as created_2_9_, umbrella0_.delete..
Bulk Insert 이 포스팅은 제가 작성한 UPbrella 프로젝트의 기술 블로그에 작성한 대용량 데이터 삽입 적용기 포스팅을 옮겨온 것입니다. 1. 문제 정의 데이터 베이스 성능을 개선하는 것은 품질 좋은 서버를 유지하기 위해서 필수적입니다. 하지만 개발자들이 수작업으로 데이터를 삽입한 후 테스트 하는 것은 한계가 있습니다. 따라서 업브렐라 개발팀은 Data Bulk Insert를 통해 DB에 대용량의 데이터를 삽입하고 성능 개선을 해보도록 하겠습니다. 2. Bulk Insert 2 - 1 데이터 만들기 우선 간단한 테이블인 협업지점 분류에 대한 데이터를 만들어보겠습니다. classification 테이블은 id, type, name, latitude, longitude를 필드로 가지고 있는데, 이에 해당하는 데이터를 ..
nGrinder 적용기 이 포스팅은 UPbrella 프로젝트의 기술 블로그에 작성한 nGrinder 적용기 포스팅을 옮겨온 것입니다. 1. 문제 정의 업브렐라 서비스를 출시하기 전, 업브렐라 서비스의 안정성을 확인하기 위해 QA팀을 통해 부하 테스트를 했습니다. 하지만, 전문적인 QA팀이 없는 업브렐라 팀에서 새로운 버전이 나올때 마다 부하테스트를 직접 하기에는 어려움이 있기에, 업브렐라 개발팀은 부하테스트를 도입하기로 결정했습니다. 2. nGrinder 도입 2 - 1. 부하 테스트란? 부하 테스트는 시스템의 성능을 검증하기 위한 테스트 방법 중 하나로, 시스템이 예상되는 사용자 부하 혹은 트래픽 하에서 제대로 작동하는지, 그리고 기대하는 성능 지표를 충족하는지 확인하는 것을 주 목적으로 합니다. 부하 테스트의 주요 특징과 ..
WireMock 적용기 이 포스팅은 UPbrella 프로젝트의 기술 블로그에 작성한 WireMock 적용기 포스팅을 옮겨온 것입니다. 안녕하세요, 저는 업브렐라에서 백엔드 개발을 담당하고 있습니다. 업브렐라에서 부하테스트를 할 때, 외부 API 의존성을 어떻게 해결하였는지 적어보려 합니다. 1. 문제 정의 업브렐라 서비스는 로그인한 유저만 사용할 수 있기 때문에, 로그인 하는 과정은 필수적입니다. 하지만 kakao oauth 로그인을 통해서만 접근이 가능하기 때문에 nGrinder 부하 테스트는 시작부터 어려움에 봉착하고 말았습니다. 이를 해결하기 위해 wiremock 이라는 mock server를 도입하기로 결정하였습니다. 2. WireMock 2 - 1. WireMock이란? Flexible API Mocking for T..
분산 서버 환경에서의 로그인 이 포스팅은 UPbrella 프로젝트의 기술 블로그에 작성한 분산 서버 환경에서 세션 로그인 포스팅을 옮겨온 것입니다. 안녕하세요, 저는 업브렐라에서 백엔드 개발을 담당하고 있습니다. 이번 글에서는 분산 서버 환경에서 세션 로그인을 구현하는 방법에 대해 알아보겠습니다. 1. 문제 정의 업브렐라 서비스의 특성 상 비가 올 경우 사용자가 급증하기 때문에 분산 서버 환경을 구성하고 있습니다. 하지만 분산 서버 환경에서 세션 로그인 방법을 사용한다면 한 가지 문제점을 맞이하게 됩니다. 각 Spring Application은 자신만 접근할 수 있는 장소(일반적으로 서버의 메모리)에 세션을 저장하고 있지만, 분산 환경에서는 문제가 될 수 있습니다. Spring Application #2 가 세션 #3의 요청을 받는..