본문 바로가기

개인 학습 메모장

(103)
Spring의 TestContext와 주의할 점 최근 테스트 코드를 작성하다 생각지도 못한 오류를 경험하여 이야기해 보려 한다. 서버가 여러 대 있는 환경에서 미들웨어로부터 단 하나의 서버만 이벤트 콜백을 받아야 하는 상황에서 이를 테스트하고자 할 때 생길 수 있는 문제이다. 겪은 오류는 테스트 컨텍스트의 캐싱과 관련되어 있기에 이에 대해 먼저 설명하고 넘어가 보겠다. 스프링 프레임워크에서는 테스트 코드를 실행할 때 매번 컨텍스트를 초기화하지 않는다. 현재 실행하는 테스트 suite의 context에서 이전에 실행했던 테스트 suite의 context 가 동일하다면 두 테스트는 동일한 context를 사용한다.이때, 각 테스트 suite의 context 가 동일한지에 대한 판단은 다음의 키를 가지고 한다. locations (@ContextConfig..
리눅스 그냥 재미로 정말 오랜만에 글을 쓴다. 언제부터인가 잊고 싶지 않은 학습을 노션에 기록하기 시작하여 블로그에 글을 거의 남기지 않게 되었다. 아무래도 노션에 기록하는 것이 더 편하고, 내 멋대로(블로그도 멋대로지만 ㅋㅋ..) 기록한다는 그런 점에서 노션을 자주 쓰게 된 듯 싶다. 이렇게 오랜만에 다시 글을 올리게 된 이유는 최근 "리눅스 그냥 재미로" 라는 책을 읽어 다른 사람들도 한번 읽어봤으면 하는 마음에 쓰게 되었다. 이 책은 리눅스의 기술과는 전혀 관계가 없다. 리눅스를 개발한 리누스 토르발즈의 리눅스를 개발할 때 까지의 자서전이다. 이 책을 재밌게 읽을 수 있었던 까닭은 이 사람의 가치관과 생각에 꽤나 많이 공감을 했기 때문인 것 같다. 책의 내용을 간단하게 요약하자면 수학적 사고력이 타고난 한 아이가 우연..
전국 법정동 데이터 저장과 공간 데이터 글 쓰기에 앞서 최근 모두의 텃밭 프로젝트를 하던 중 공간 데이터를 마주치게 됐다. 프로젝트의 기능 중 많은 부분이 위치 정보를 기반으로 제공하는 기능이 많다. 예를 들어 현재 위치를 기반으로 주변 텃밭, 우리 동네의 작물 판매 정보, 커뮤니티 기능이 이에 해당하게 된다. 따라서 이를 위해서는 현재 위치가 어떤 동네에 포함되어 있는지 빠르게 검색할 수 있어야 하기 때문에 대한민국의 법정동 데이터를 db에 구축해 놓을 필요가 있었다. 공간 데이터 타입 dbms로 MySQL을 사용했기 때문에 MySQL에서 지원하는 공간 데이터 타입을 알아야 한다. 위와 같은 공간 데이터 중 우리 프로젝트에서는 법정동(예를 들어 서울 특별시 종로구 통인동과 같음)에 해당 주소의 중심 좌표(Point), Multipolygon..
내가 작성하지 않은 코드를 개선해보자 개요 최근 프로젝트 한개를 이어받게 됐다. 프로젝트에 대해 간단하게 소개하자면 농림축산식품부 창업 경진대회에서 우승한 프로젝트이며 광고비를 지원받고 실제 사용자를 모을 수 있다는 점에 매료되어 참여를 결심했다. 간단하게 설명하자면 텃밭에 대해 임대인과 임차인 간 연결을 해주는 플랫폼이다. 주말 농장을 하고 싶어하는 분들 또는 텃밭 체험을 하고 싶지만 텃밭 정보를 구하기 어려워 하는 분들을 위해 좋은 경험을 제공하는 목적을 갖고 있다. 실제 사용자가 편하게 이용할 수 있게 하나씩 고민했고 코드적인 문제가 가장 눈에 띄었다. 문제 정의 가장 먼저 개선한 부분은 날씨 정보를 제공하는 API이다. 기존의 코드에는 날씨 정보를 제공하는 API가 존재했고 이는 공공데이터 날씨정보로부터 받아오는 구조였다. 엔드포인트..
성능 최적화 (S3업로드 병렬 처리와 이미지 리사이징) 이미지 리사이징 현재 톰캣, Nginx의 기본 설정으로 인해1MB 이상의 이미지는 받지 않도록 설정 되어 있다. 현재 프론트 단에서 따로 압축을 해주지 않았기 때문에 사용자는 높은 화질의 이미지를 업로드 할 수 없는 불편함을 겪게 될 것이다. 이에 사용자의 경험을 좋게 해주고 저장 공간도 효율적으로 관리하기 위해 리사이징 처리를 해주는 것이 좋을 것 같다. 내가 사용한 이미지는 9MB 크기의 고용량 이미지다 초기 상태 보는 바와 같이 이미지의 용량이 크더라도 전혀 압축되지 않고 S3에 업로드 된다. 저장 공간을 비효율적으로 쓰고 있을 뿐만 아니라, 사용자가 위 이미지를 볼 때 렌더링 되는데 소요되는 시간도 클 것이다. 아래는 실제 결과이다. 하나의 이미지를 로드하는데 4.2초가 걸렸고 크기 또한 9.8M..
Loki, Promtail, Grafana 로그 대시보드 구성 로그 모니터링의 필요성 프로젝트를 진행하며 클라이언트와 엔드포인트를 연결하고 성능테스트를 하는 과정에서 수많은 오류들을 겪었다. 이때마다 매번 서버에 접속해서 로그를 읽는데 로그가 너무 쌓여 가독성도 좋지 못하고, 접속하는 과정 자체만으로도 시간이 소요되었기 때문에 생산성이 많이 떨어지게 됐다. 이로 인해 로그의 모니터링을 구축하고 이를 적용하는 과정을 기록하고자 글을 쓰게 되었다. Loki Loki는 프로메테우스로부터 영감을 받아 만들어진 그라파나 랩에서 만든 오픈소스다. 수평적으로 확장이 가능하며 가용성이 높은 여러 테넌트(사용자 그룹)를 지원하는 로그 집계 시스템이며, 자원을 굉장히 효율적으로 사용하며 운영이 쉽게 설계되어 있다. 또한 elasticsearch와는 다르게 log의 컨텐츠를 인덱싱 하..
성능 최적화(캐시) 이번 글이 이번 프로젝트의 성능 최적화 글 중 마지막이 될 것이다. db io가 발생하지 않는다면 어플리케이션의 성능은 극대화 된다. 하지만 Redis와 같은 캐시서버의 운영 비용은 만만치 않으니 신중하게 선택하자. 나의 경우 로컬 캐시인 카페인 캐시를 이용해 캐시를 운영했다. 사용한 이유는 러닝 커브가 매우 낮다는 점이 가장 크다. 또한 성능이 매우 우수하다고 한다.https://github.com/ben-manes/caffeine/wiki/Benchmarks Benchmarks A high performance caching library for Java. Contribute to ben-manes/caffeine development by creating an account on GitHub. gi..
성능 최적화 (DB 복제와 로드밸런싱) 지난 글에 이어 목표 TPS로 가기 위한 여정을 떠나보자. DB 복제 현재 question 조회에 대한 tps는 17.5인 상황이다. db 서버의 cpu가 매우 많이 오르는 것으로 보아 여전히 db가 병목이다. 이에 DB 서버를 한대 더 늘려 tps를 올려보도록 하자. RDS를 이용하고 있다면 읽기 전용 복제본을 생성하면 된다. 복제된 DB는 마스터 DB의 바이너리 로그를 읽어서 동기화 작업을 하는데, 방법에는 쿼리 기반으로 복제, 행 기반으로 복제, 두 방법을 혼합해서 복제 하는 방법이 있는데, 나는 RDS의 기본 값인 혼합하는 방식을 사용했다. 다른 방법이나 더 세밀한 설정을 하고 싶다면 파라미터 그룹의 설정을 변경하도록 하자. 코드 코드는 아래와 같다. 어플리케이션의 입장에서는 마스터, 슬레이브의 ..