전체 글
가천대학교 소프트웨어학과에 재학중인 천진우입니다. 좋은 글을 주기적으로 작성하기 위해 노력합니다.
-
전 회사에서도, 이번 회사에서도 webclient 를 쓰는 코드가 존재하며, 명확하게 알지 못하고 사용하여 문제가 발생했습니다. org.springframework.web.reactive.function.client.WebClientRequestException: readAddress(..) failed: Connection reset by peer; connection reset by peer 면, 상대방이 연결을 끊었다는 뜻이 아닌가 ... ? 그러나 요청을 받은 서버쪽에는 아무런 요청이 찍혀있지 않았습니다. "그러면 LB 쪽에서 끊는건가? " https://repost.aws/ko/articles/ARIFCVXv6-QV2HIvnJ4px1Zw/network-load-balancer-nlb-troubl..
[Spring] WebClient failed: Connection reset by peer; 해결해보기전 회사에서도, 이번 회사에서도 webclient 를 쓰는 코드가 존재하며, 명확하게 알지 못하고 사용하여 문제가 발생했습니다. org.springframework.web.reactive.function.client.WebClientRequestException: readAddress(..) failed: Connection reset by peer; connection reset by peer 면, 상대방이 연결을 끊었다는 뜻이 아닌가 ... ? 그러나 요청을 받은 서버쪽에는 아무런 요청이 찍혀있지 않았습니다. "그러면 LB 쪽에서 끊는건가? " https://repost.aws/ko/articles/ARIFCVXv6-QV2HIvnJ4px1Zw/network-load-balancer-nlb-troubl..
2024.04.14 -
"기능을 개발했는데, 이 기능은 언제 배포되나요?" xxx: "그냥 merge 하시면 바로 배포됩니다." "배포가 바로 된다구요?" xxx: "네" "음? 스테이징도 없고 QA도 없어요?" xxx: "네" 이전에 경험한 배포 프로세스 이전에 온프레미스 패키징 기반 배포를 경험하다가, 새롭게 넘어온 조직에서는 배포 프로세스가 완전히 달랐습니다. 이전 회사에서의 배포 및 개발 프로세스는 위와 같았습니다. 하나의 기능이 나가기 위해서 수많은 confirm 이 필요했고 QA 조직이 꽤나 크게 존재했습니다. 직접 경험한 문제들 문제 1. 배포 주기가 너무 길어서, 피드백이 느리다 문제 2. 피드백에 대한 대응이 느리다 문제 3. 우선적으로 구현해야하는 기능이 있다면, 병목이 너무 길어진다 문제 4. 기획자와 QA..
Trunk Based Development 에서 Feature Flag 경험하기"기능을 개발했는데, 이 기능은 언제 배포되나요?" xxx: "그냥 merge 하시면 바로 배포됩니다." "배포가 바로 된다구요?" xxx: "네" "음? 스테이징도 없고 QA도 없어요?" xxx: "네" 이전에 경험한 배포 프로세스 이전에 온프레미스 패키징 기반 배포를 경험하다가, 새롭게 넘어온 조직에서는 배포 프로세스가 완전히 달랐습니다. 이전 회사에서의 배포 및 개발 프로세스는 위와 같았습니다. 하나의 기능이 나가기 위해서 수많은 confirm 이 필요했고 QA 조직이 꽤나 크게 존재했습니다. 직접 경험한 문제들 문제 1. 배포 주기가 너무 길어서, 피드백이 느리다 문제 2. 피드백에 대한 대응이 느리다 문제 3. 우선적으로 구현해야하는 기능이 있다면, 병목이 너무 길어진다 문제 4. 기획자와 QA..
2024.03.02 -
어떻게 읽게 되었나? 새로운 회사로 합류하게 되면서, 같이 업무를 진행하실 분께 여쭤보았습니다. "합류 전까지 어떤 책을 읽고 합류하면 좋을까요?" 그렇게 추천받은 책이 이 단위 테스트 책입니다. 이직 텀 동안 국내 / 해외 여행을 계획했는데, 비행기와 다양한 지역의 카페에서 여유있게 읽게 되었습니다. 어떤 책인가? 블라디미르 코리코프 가 작성한 책이며, 단위 테스트에 대한 내용을 넘어서 어떻게 '잘' 테스트 할 것인가에 대한 내용을 담고 있습니다. 이 분의 블로그도 아주 알찬 내용이 많은 것 같습니다. 그래서 생각했던 것 보다 디테일한 예제는 많지 않고, 개념을 정리하고 간단한 예제들을 보여주는 식의 전개입니다. 간략하게 어떤 내용들을 담고 있는가를 살펴보면 다음과 같습니다. 테스트가 왜 중요한가? ..
서평 - 단위 테스트 (Unit Testing)어떻게 읽게 되었나? 새로운 회사로 합류하게 되면서, 같이 업무를 진행하실 분께 여쭤보았습니다. "합류 전까지 어떤 책을 읽고 합류하면 좋을까요?" 그렇게 추천받은 책이 이 단위 테스트 책입니다. 이직 텀 동안 국내 / 해외 여행을 계획했는데, 비행기와 다양한 지역의 카페에서 여유있게 읽게 되었습니다. 어떤 책인가? 블라디미르 코리코프 가 작성한 책이며, 단위 테스트에 대한 내용을 넘어서 어떻게 '잘' 테스트 할 것인가에 대한 내용을 담고 있습니다. 이 분의 블로그도 아주 알찬 내용이 많은 것 같습니다. 그래서 생각했던 것 보다 디테일한 예제는 많지 않고, 개념을 정리하고 간단한 예제들을 보여주는 식의 전개입니다. 간략하게 어떤 내용들을 담고 있는가를 살펴보면 다음과 같습니다. 테스트가 왜 중요한가? ..
2024.02.18 -
사내 컨플루언스에 히스토리 저장 목적으로 작성했던 글을 가져왔습니다. 문제 분석과 해결 과정을 나타낸 글이라서, 두서가 없는 글입니다. 가볍게 읽어주세요 :) 환경 AWS EC2 or ompremise JDK 17 Spring Boot 2.7 H2 Database 1.4.200 file write mode jdbc:h2:file:/data/happy;CACHE_SIZE=2097152;WRITE_DELAY=300;DB_CLOSE_DELAY=30;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE; 문제 발생 메모리가 지속적으로 증가하고, 지속적으로 스프링 서버가 죽는다는 제보를 받았습니다. 해당 도커 컨테이너는 4코어 메모리 2GB 환경에서 실행되고 있었고, 처리량과 서버 스팩을 생각해..
Heap Dump로 Memory Leak 분석하고 해결하기 (H2 CacheLongKeyLIRS memory leak)사내 컨플루언스에 히스토리 저장 목적으로 작성했던 글을 가져왔습니다. 문제 분석과 해결 과정을 나타낸 글이라서, 두서가 없는 글입니다. 가볍게 읽어주세요 :) 환경 AWS EC2 or ompremise JDK 17 Spring Boot 2.7 H2 Database 1.4.200 file write mode jdbc:h2:file:/data/happy;CACHE_SIZE=2097152;WRITE_DELAY=300;DB_CLOSE_DELAY=30;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE; 문제 발생 메모리가 지속적으로 증가하고, 지속적으로 스프링 서버가 죽는다는 제보를 받았습니다. 해당 도커 컨테이너는 4코어 메모리 2GB 환경에서 실행되고 있었고, 처리량과 서버 스팩을 생각해..
2024.01.07 -
insert into B테이블 SELECT UNIX_TIMESTAMP(NOW()) -68, project_key ,segment_key, tenant_id , sum(active_user), sum(waiting_user), max(concurrent_user) from A테이블 where uts>= UNIX_TIMESTAMP(now()) -68 and uts< UNIX_TIMESTAMP(now()) -8 group by tenant_id, project_key, segment_key 회사에서 기존에 H2 Database를 사용해서 실제 운영환경에 적용했습니다. 그러다가 새로운 서비스로 마이그레이션 하면서 MariaDB 를 활용하게 되었는데, 기존에 없었던 데드락 문제가 발생했습니다. 데드락이 발생한 쿼..
[DB] 통계 테이블에서 데드락 해결하고 성능 개선하기insert into B테이블 SELECT UNIX_TIMESTAMP(NOW()) -68, project_key ,segment_key, tenant_id , sum(active_user), sum(waiting_user), max(concurrent_user) from A테이블 where uts>= UNIX_TIMESTAMP(now()) -68 and uts< UNIX_TIMESTAMP(now()) -8 group by tenant_id, project_key, segment_key 회사에서 기존에 H2 Database를 사용해서 실제 운영환경에 적용했습니다. 그러다가 새로운 서비스로 마이그레이션 하면서 MariaDB 를 활용하게 되었는데, 기존에 없었던 데드락 문제가 발생했습니다. 데드락이 발생한 쿼..
2023.12.24 -
트랜잭션 단위는 일반적으로 짧게 가져가고 것이 이상적입니다. 그 이유에 대해서 살펴보고, 어떻게 구성해야 하는지에 대해서 고민해 보겠습니다. @Transactional 남용의 문제점 @Transactional 어노테이션은 너무나도 편리합니다. 매번 트랜잭션의 시작과 종료를 코드로 명시하지 않아도, Spring AOP를 통해 간단하게 어노테이션으로 트랜잭션 범위를 설정합니다. 공통적인 횡단 관심사를 해결하는 Spring AOP의 대표적인 사례라고 볼 수 있겠습니다. 그렇지만 데이터 관점의 트랜잭션을 실제 비즈니스 로직 관점에서 적용하다 보면, 분명 트랜잭션 적용 범위에 대한 괴리가 발생하게 됩니다. 다음 게시글 작성 예시를 보면서 해당 매서드의 범위가 실제로 이상적인 트랜잭션의 범위인지 고민해봅시다. @T..
[Spring] 트랜잭션(Transaction) 우아하게 분리하기트랜잭션 단위는 일반적으로 짧게 가져가고 것이 이상적입니다. 그 이유에 대해서 살펴보고, 어떻게 구성해야 하는지에 대해서 고민해 보겠습니다. @Transactional 남용의 문제점 @Transactional 어노테이션은 너무나도 편리합니다. 매번 트랜잭션의 시작과 종료를 코드로 명시하지 않아도, Spring AOP를 통해 간단하게 어노테이션으로 트랜잭션 범위를 설정합니다. 공통적인 횡단 관심사를 해결하는 Spring AOP의 대표적인 사례라고 볼 수 있겠습니다. 그렇지만 데이터 관점의 트랜잭션을 실제 비즈니스 로직 관점에서 적용하다 보면, 분명 트랜잭션 적용 범위에 대한 괴리가 발생하게 됩니다. 다음 게시글 작성 예시를 보면서 해당 매서드의 범위가 실제로 이상적인 트랜잭션의 범위인지 고민해봅시다. @T..
2023.09.24 -
최근 일주일 동안 주변 사람들과 '사이드 프로젝트의 매몰 비용'에 대한 이야기가 오고 갔다. 이번 년도에 여러개의 토이 프로젝트를 진행하면서 다양한 이유로 놓지 못하고 있었던 프로젝트들이 많았고, 이런저런 생각들을 공유해야겠다. #1 포착 - 1월동안 9월까지 진행한 프로젝트 (015B - 1월부터 6월까지) 1. 현실적으로 만들 수 있는 규모인가 ? 2. 모두가 일정 시간 이상의 시간을 투자할 수 있는가 ? 우리 동아리는 2개월 만에 빠르게 런칭하는 프로젝트였다. 그렇지만 초기 기획의 Feature가 너무 비대했던 탓에, 제시간에 런칭하지 못해서 장기 프로젝트가 되었다. 이후에 '동아리'라는 강제 요소가 없이 직장인 분들과 함께 프로젝트를 진행하다 보니, 한계점이 명확해졌다. 이 후에 투자할 수 있는 ..
[프로젝트] 사이드 프로젝트에서 발생한 매몰비용최근 일주일 동안 주변 사람들과 '사이드 프로젝트의 매몰 비용'에 대한 이야기가 오고 갔다. 이번 년도에 여러개의 토이 프로젝트를 진행하면서 다양한 이유로 놓지 못하고 있었던 프로젝트들이 많았고, 이런저런 생각들을 공유해야겠다. #1 포착 - 1월동안 9월까지 진행한 프로젝트 (015B - 1월부터 6월까지) 1. 현실적으로 만들 수 있는 규모인가 ? 2. 모두가 일정 시간 이상의 시간을 투자할 수 있는가 ? 우리 동아리는 2개월 만에 빠르게 런칭하는 프로젝트였다. 그렇지만 초기 기획의 Feature가 너무 비대했던 탓에, 제시간에 런칭하지 못해서 장기 프로젝트가 되었다. 이후에 '동아리'라는 강제 요소가 없이 직장인 분들과 함께 프로젝트를 진행하다 보니, 한계점이 명확해졌다. 이 후에 투자할 수 있는 ..
2023.09.12 -
요즘 아주 재미있게 즐겨보고 있는 이중석님의 유튜브입니다. 올라온 당일날 봤었는데, 이번에 리팩토링을 진행하면서 딱 좋은 케이스가 생겨서 적용해봤습니다. 기존 코드는 어땠는가 간소화해서 가져왔지만, 리팩토링 전의 코드기도 하고 Login 로직은 쬐끔 복잡합니다. OAuth provider 확인해서 적절한 bean 꺼내오기 (외부 통신) OAuth provider에 요청 보내서, 유효한 로그인인가에 대한 검증 진행하기 회원가입 한 적이 없다면 DB에 유저 생성하기 (외부 통신) FCM 토큰 검증하고 저장하기 @Override public Long login(String provider, LoginRequestDto requestDto) { OAuthProviderEnum providerEnum = OAut..
[Java] Default 접근제어자로 견고한 테스트 만들기요즘 아주 재미있게 즐겨보고 있는 이중석님의 유튜브입니다. 올라온 당일날 봤었는데, 이번에 리팩토링을 진행하면서 딱 좋은 케이스가 생겨서 적용해봤습니다. 기존 코드는 어땠는가 간소화해서 가져왔지만, 리팩토링 전의 코드기도 하고 Login 로직은 쬐끔 복잡합니다. OAuth provider 확인해서 적절한 bean 꺼내오기 (외부 통신) OAuth provider에 요청 보내서, 유효한 로그인인가에 대한 검증 진행하기 회원가입 한 적이 없다면 DB에 유저 생성하기 (외부 통신) FCM 토큰 검증하고 저장하기 @Override public Long login(String provider, LoginRequestDto requestDto) { OAuthProviderEnum providerEnum = OAut..
2023.08.24