분류 전체보기

문제상황 실서버에서 Deadlock이 발생했다는 리포트가 올라왔다. Deadlock found when trying to get lock; try restarting transaction 로그를 확인해보니 1초 이내의 짧은 시간 동안 동일한 벌크성 POST 요청이 두 번 연속으로 들어왔다. 아마 우리 서버를 사용 중인 모바일 UI상에서 따닥 두 번 클릭을 한 모양이다. 원인 분석 코드단에서 먼저 분석했을 때, 데드락을 유발한 코드는 아래와 같았다. public void updateMailboxId(String mailboxIdToUpdate, List mailNoList) { jpaQueryFactory.update(mail) .set(mail.mailbox.id, mailboxIdToUpdate) .w..
· 개발자취
https://seongonion.tistory.com/145 생애 첫 오픈소스 컨트리뷰트 도전기 (1) https://seongonion.tistory.com/144 Java Mail API의 SharedFileInputStream 오류(로 추정되는 것) 수정해보기 SharedFileInputStream? A SharedFileInputStream is a BufferedInputStream that buffers data from the file and supports the mark and reset m seongonion.tistory.com 위 글과 이어지는 내용입니다. 테스트 코드를 추가하고 얼마 후, 리뷰를 해주던 jmehrens가 갑자기 살짝 갸우뚱한 얘기를 했다. 대략적으로 해석해보자면,..
· 개발자취
https://seongonion.tistory.com/144 Java Mail API의 SharedFileInputStream 오류(로 추정되는 것) 수정해보기 SharedFileInputStream? A SharedFileInputStream is a BufferedInputStream that buffers data from the file and supports the mark and reset methods. It also supports the newStream method that allows you to create other streams that represent subsets of the fil seongonion.tistory.com 위 수정사항을 Java Mail API에 PR로 ..
· 개발자취
SharedFileInputStream? A SharedFileInputStream is a BufferedInputStream that buffers data from the file and supports the mark and reset methods. It also supports the newStream method that allows you to create other streams that represent subsets of the file. A RandomAccessFile object is used to access the file data. Note that when the SharedFileInputStream is closed, all streams created with the..
멀티모듈 프로젝트를 구성하기 위해 프로젝트 패키지 루트 경로의 settings.gradle 파일에 각 프로젝트 디렉토리를 설정해줘야했다. 내가 만든 구조는 아래와 같았다. - boot - api-server - batch - kafka - core - domain - persistence 루트 패키지를 기준으로 쭉쭉 모듈들이 존재하는게 아니라 성격이 비슷한 모듈들을 하나의 디렉토리 내에 모아놓은 형태였다. 루트 패키지 내에 바로 존재하는 모듈을 include해주기 위해선 include 'foo' 처럼 해주므로, 느낌상 특정 디렉토리 하위에 있는 프로젝트는 include 'foo:bar' 처럼 해주면 될 것 같았다. 그래서 아래와 같이 설정했다. // settings.gradle rootProject.n..
· 개발자취
문제상황 사내에서 진행 중인 프로젝트의 테스트 코드와 관련된 문제는 꽤 오래전부터 체감되어왔다. 1. 테스트 코드 OOM(메모리 이슈) https://seongonion.tistory.com/140 에서 적은 바 있던 내용이다. 스프링 테스트코드 메모리(OOM)이슈 해결 아닌 회피기 어느 날 CI 파이프라인 중 테스트 실행 단계에서 지속적으로 OOM 에러가 나며 빌드에 실패하는 현상을 발견했다. 확인을 위해 로컬 환경에서 테스트 실행 시 현상이 재현되진 않았으나, 신기하게 seongonion.tistory.com 해당 문제를 분석하며 파악한 문제점은 다음과 같았다. @SpringBootTest 를 사용하는 테스트 코드들이 ApplicationContext 캐싱 hit rate가 낮아 매번 새로운 컨텍스트..
우리는 스프링에서 테스트 코드 수행시간을 측정하기 위해 일반적으로 IDE의 도움을 받는다. 이미 많은 사람들이 사용하고 있는 JetBrains의 IntelliJ에서는 테스트의 수행시간을 화면 상에 표시해준다. 하지만, 이와 같은 방법은 몇 가지 한계점이 있다. 바로 @SpringBootTest 혹은 @DataJpaTest 등에서 테스트 컨텍스트를 로딩하는 시간이 수행 시간에서 제외된다는 것이다. 사실, 테스트 자체를 수행하는 시간은 1초 이상을 넘기는 일이 잘 없으며 테스트 컨텍스트 로딩 시간이 우리가 체감하는 테스트 수행 시간의 대부분을 차지한다. 이 시간을 줄이기 위해선 우선 해당 시간을 정확히 측정해볼 필요가 있다. 컨텍스트 로딩 시간을 포함한 테스트 코드 전체 수행시간을 구하기 위해선 스프링 프레..
· 개발자취
어느 날 CI 파이프라인 중 테스트 실행 단계에서 지속적으로 OOM 에러가 나며 빌드에 실패하는 현상을 발견했다. 확인을 위해 로컬 환경에서 테스트 실행 시 현상이 재현되진 않았으나, 신기하게도 swagger를 업데이트 해주는 openapi3 task 중 현상이 발생했다. (왜 그런지 아시는 분? ㅠ) 처음에는 테스트코드에서 Mocking을 위해 읽어들인 파일 쪽에 문제가 생겨 발생한 것으로 추측하였으나, 확인 결과 해당 코드는 큰 문제가 없음을 확인했다. (byte로 직접 쓰는 부분이 없었다) 다행스럽게도 로컬환경에서 재현이 되었기 때문에 Heap Dump를 떠서 누수 원인을 분석해볼 수 있었다. Heap Dump 확인 결과, org.hibernate.metamodel.internal.Metamodel..
SeongOnion
'분류 전체보기' 카테고리의 글 목록 (4 Page)