[로아투두] JPA N+1 문제 해결과 쿼리 카운팅 기반 성능 테스트 인프라 구축
·
Project/LOATODO
개요이번 작업에서는 ScheduleService.search() 메서드에서 발생하던 N+1 문제를 해결하고, 향후 동일한 문제의 재발을 방지하기 위한 쿼리 카운팅 기반 성능 테스트 인프라를 구축했습니다. 본 글에서는 문제의 원인 분석, 해결 과정, 그리고 테스트 인프라의 설계 의도를 상세히 다룹니다.1. 문제 분석1.1 N+1 문제란N+1 문제는 ORM을 사용하는 애플리케이션에서 빈번하게 발생하는 성능 이슈입니다. 하나의 쿼리로 N개의 엔티티를 조회한 후, 각 엔티티의 연관 데이터를 가져오기 위해 N번의 추가 쿼리가 발생하는 현상을 말합니다.예를 들어 100개의 일정을 조회하고, 각 일정에 참여한 친구 목록을 가져와야 한다면:일정 목록 조회: 1회각 일정별 친구 조회: 100회총 101회의 쿼리 발생이 ..
[로아투두] O(n^2) 문제 해결과 partitioningBy
·
Project/LOATODO
1. 오늘 발견한 문제MarketService.updateMarketItemList() 메소드를 보다가 뭔가 이상한 걸 발견했다.for (Market market : newMarketList) { // O(n) Optional find = oldList.stream() .filter(item -> item.getLostarkMarketId() == market.getLostarkMarketId()) .findFirst(); // O(m) 😱 // ...}for문 안에서 stream으로 또 순회하고 있었다. 전형적인 O(n²) 패턴이다.데이터가 1,000개면 1,000 × 1,000 = 1,000..
[로아투두] Spring Security JWT 관리자 API 뚫려있었네...?
·
Project/LOATODO
1. 서론이번에 무료로 ChatGPT 5를 쓰게 되어서 시험삼아 Codex를 사용해서 프로젝트를 분석해봤다. 질문 1. 이 Spring 프로젝트를 분석하고 너가 생각했을 때 수정할만한거 있어?돌아오는 답변 중 하나src/main/java/lostark/todo/global/config/filter/JwtAuthenticationFilter.java:53 이후: 토큰 없음/검증 실패 시 sendErrorResponse만 호출하고 바로 filterChain.doFilter로 넘어가서 컨트롤러가 그대로 실행됩니다. 에러 응답을 썼다면 return으로 체인을 중단하거나 HttpServletResponse를 이용해 명시적으로 종료해야 합니다. 질문 2. 즉, 내가 만든 인증 필터에서 걸려도 그대로 실행된다는 건가..
[마인크래프트 / 코블버스(COBBLEVERSE)] 최케빈 유튜브 코블버스 댓글 답글들
·
개인/마인크래프트
0. 유튜브 댓글유튜브는 답글 쓰면 지멋대로 왜 계속 삭제하고 난리여!!홍보 댓글이나 잘잡지 1. 서버 열기아래 댓글에 대한 답글 입니다. 1. 설치 항목1) Feather Clienthttps://feathermc.com/ Feather ClientBest Minecraft launcher and clientfeathermc.com 마인크래프트 서버를 열 수 있는 클라이언트 입니다. 2) Modrinthhttps://modrinth.com/app Download Modrinth App!Modrinth App is a unique, open source launcher that allows you to play your favorite mods, and keep them up to date, all in..
[로아투두] 로그 저장 최적화 작업
·
Project/LOATODO
1. 서론로그, 타임라인 서비스 추가 후 서버가 계속 터짐...2. 원인 파악1) Jmeter 테스트Jmeter로 300명의 사용자 테스트 [에러 메시지]{"errorCode":400,"exceptionName":"CannotCreateTransactionException","errorMessage":"Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection"} -> JDBC 커넥션이 없다. 원인 파악application.properties 설정 후 로그 확인logging.level.org...
[로아투두] 에러 로그 출력 변경
·
Project/LOATODO
1. 서론기존에 서버에서 발생한 에러를 디스코드 웹훅으로 받고 있었음 여기서 불편한점따로 에러가 발생하지 않고 메시지만 출력되는 내용을 굳이 디스코드를 받아야할까?ex) "상위 관문을 먼저 제거하여 주십시오." 누가, 어느 API를 호출해서 발생한 에러인지 모른다. 이 문제를 해결하고자 한다.  2. 개발관련 커밋fix: 기존 에러 처리 변경 fix: 기존 에러 처리 변경 · minhyeok2487/LostarktTodoBackend@b12e28d- 간단한 에러는 webhook을 보내지 않음github.comfix: 에러에 헤더 수집 fix: 에러에 헤더 수집 · minhyeok2487/LostarktTodoBackend@4046729minhyeok2487 committed Mar 5, 2025githu..
[로아투두] bucket4j를 이용해 트래픽 요청 제한하기
·
Project/LOATODO
1. 서론최근 로아투두 사용자가 많아지면서 서버의 많은 부하가 걸렸다.패치날인 수요일 저녁같은 경우에는 감당하기 어려울 정도... 그러다가 2월 26일 오후 4시정도에 카톡이 많이와서 확인해보니로아투두 서버가 터졌다는 사용자들의 톡을 보게되었다. JDBC Connection이 부족해서 서버가 재실행된거 같은데...왜...??? Connection 연결 개수 모니터링 Connection 대기가 갑작스럽게 200개 가까이 늘어났다.근데... 나는 설정에 최대를 30개를 줬는데 왜 10개밖에 Active가 안된거지..? Request Count Increase 모니터링 음..... 원인 파악: 특정 API가 Connection을 많이 물고 있어서 알림을 체크하는 API 요청이 Connection을 가져오지 못..
[로아투두] 2025년 기획
·
Project/LOATODO
1. 가로모드고민...고민... https://app.loatodo.com/post/1024현재 로아투두는 그리드 형식으로 되어있음. 이렇게 되면 캐릭터가 많아졌을때 필연적으로 스크롤로 내려야함 그러지 말고 던파처럼 테이블 형식으로 있으면 어떨까 상단에서 필요한 항목만 체크해서 전체 캐릭터를 한번에 볼 수 있도록 하는 방식음.... 근데 이러면 API 많이 추가해야하고 체크할 항목 많아질지도... 2. 일정 개편2/4 분기 꼭 할꺼임 일정 기능은 뭔가 베타 버전이라고 봐야할 정도로 조잡함...해당 일정에 자동으로 체크된다던가... 한달 통으로 보여준다던가 하는게 좋을꺼같음 https://app.loatodo.com/post/1007 기타 커뮤니티 요청사항1. 깐부와 숙제 연동https://app.loat..
모던 자바: 자바 8에서 자바 21까지 심층 가이드
·
Language/Java
해당 글은 아래 링크의 내용을 번역 + 추가한 것 입니다.https://medium.com/java-and-beyond/modern-java-an-in-depth-guide-from-version-8-to-21-by-akiner-alkan-f89b50e13c72 0. 서론자바는 다재다능한 프로그래밍 언어로, 변혁의 여정을 걸어왔습니다.자바 8부터 흥미로운 기능들이 개발자들의 코딩 방식을 바꾸어 놓았습니다.  더 나은 기능을 위한 깔끔한 람다 표현식부터 데이터를 더 쉽게 다룰 수 있도록 해준 Stream API까지, 자바 8은 혁신적인 변화를 가져왔습니다.우리는 자바 21까지의 업데이트를 살펴볼 것입니다.이 현대적인 자바 기능들을 간단한 설명과 실용적인 예제로 풀어가며 함께 여정에 동참해 보세요.이 여정이..