[8월의 디버깅] 성능 테스트
·
메모
최근 성능적으로 병목이 많이 생기는 부분에 대해서 원인과 해결 방안을 찾기 위해서 성능 테스트를 수행했다. 성능 테스트는 목록 조회 API로 MSA 구조로 된 서버 환경 특성 때문에 꽤 많은 I/O 작업이 동반되는 작업이었는데 헷갈렸던 부분이 중간에 데이터 조합 과정에서 Event loop delay가 발생하는 것이 아닌지 의심이 되는 상황이었다. 결론적으로 말하면 I/O 작업이 문제였고, Event loop delay가 의심되던 곳은 트래픽이 몰렸을 때 기준으로 I/O 통신 구간에 비해서 1/1000ms도 안 됐다. 이 글에선 그중 흥미로웠던 부분으로 Node.js 버전을 18.19.0에서 21.7.2로 수정하는 것만으로 400ms에서 60ms로 Event loop delay가 약 7배가 개선되었다. ..
[8월의 디버깅] 테스트 코드에서의 MikroORM 영속성
·
메모
현재 재직 중인 회사의 백엔드 코드 구조는 도메인 와 ORM 엔티티가 분리된 구조다. 각 레이어 간의 이동은 맵퍼를 통해서 변환해 이동하게 되는데, 이런 구조의 특징 상 MikroORM의 영속성 콘텍스트를 사용하기 어렵다. 그래서 각 영속성 계층에서는 영속성 콘텍스트에 변경된 내용이 있다면 바로 데이터베이스와 동기화하도록 구성된다. 그렇지만 오늘 문제가 된 테스트 코드는 데이터를 삭제 후 제대로 삭제가 됐는지 검증하는 테스트 코드로서 큰 고민 없이 코드를 작성했다.it('The class should be deleted', async () => { await courseRepository.delete(course); const deletedCourse = await courseRepository.f..
교육 AI
·
공부
어릴 적 나는 공부에 관심이 없었다. 지금 생각하면 너무 아둔한 생각이지만, 초등학교 당시의 나는 "한국어 할 수 있고, 거스름 돈 계산 정도만 할 줄 알면 되는 거 아니야? 공부를 잘할 필요가 있어?" 같은 생각을 했던 것 같다. 또 고집이 쎄 학원을 다니고, 학교를 다녀도 꼭 해야 하는 것만 했다. 수업 시간에 수업 듣고, 공책 제출을 못하면 맞으니, 맞기 싫어서 공책 정리를 했다. 당연히 그렇게 했던 공부는 머리에 남지도 않고 시험을 못 쳐 빡지(틀린 문제를 반복해서 적는)만 줄줄이 썼던 기억이 난다. 당시에 내가 이런 생각을 했던 이유는 내가 되고 싶었던 무언가가 없었기 때문이라고 생각한다. 내가 공부에 대해서 관심이 생기고, 노력하려고 했던 건 개발자란 명확한 꿈을 가지게 된 것 같다. 중학교 ..
NGINX reverse proxy
·
메모
최근에 사이드 프로젝트에서 사용할 Redis, Database를 구축하는 과정에서 나뿐만 아니라 팀들도 접속이 가능해야 하는 상황이 생겼다. 이전까진 대부분 이런 인프라 도구는 내가 가진 서버 위에 올려두고 내부 네트워크를 이용해 접속하다 보니 다른 팀원들이 접근하기가 어려웠다. 하지만 집에서 운영하고 있는 서버라 외부에 너무 많이 공개하게 되면 내 개인생활이 위험할 수 있어 최대한 노출을 안하려고 했는데 그러다 보니 나만 접근을 하다 보니 팀원들이 개발을 하며 이런저런 확인할 부분이나 테스트를 하기 어려워 문제가 많았는데, 이참에 nginx를 통해서 reverse proxy를 설정했다.STREAM reverse proxy이전에도 웹에 대해선 리버스 프록시를 통해 운영하고 있어 큰 문제없이 추가할 수 있..
스프링에서 빈 등록 과정 분석해보기
·
공부
SringApplication context = this.createApplicationContext(); context.setApplicationStartup(this.applicationStartup); this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner); this.refreshContext(context); this.afterRefresh(context, applicationArguments); 우리가 사용하는 SpringApplication이 실행되면 application context를 생성하고, 초기화 작업이 수행된다. 여기서 빈이 등록되는 부분은 thi..
자바의 동시성 이해하기
·
카테고리 없음
Effective Java의 '동시성' 챕터를 정리한 내용입니다. 많은 언어에서 동시성이란, 여러 작업을 동시에 처리되는 것을 의미한다. 이펙티브 자바의 '동시성'도 같은 맥락 안에서 자바에 대해서 설명한다. 가변 데이터 동기화 자바에서 동시성을 접한다면 가장 먼저 synchronized 키워드에 대해서 알게 된다. 해당 챕터를 읽기 전까지 synchronized 키워드는 독립된 두 스레드가 특정 임계 영역에서 하나만 존재하도록 하는 배타적 실행 키워드로 알기 쉽지만, '동기화' 측면에 대해서는 쉽게 접하지 못한다. 스레드가 필드를 읽을 때 항상 ‘수정이 완전히 반영된’ 값을 얻는다고 보장하지 만, 한 스레드가 저장한 값이 다른 스레드에게 ‘보이는가’는 보장하지 않는다. - 이펙티브 자바 p.414 먼저..