CODE_GARAGE
Preview Image

[Test] 테스트에서 @Transactional을 써도 될까

0. 서론 최근 우리 Moment의 기능을 추가하던중 기묘한 현상을 마주했다. 임시 질문을 사용하면 상태가 true로 업데이트되어야 하는데 프로덕션 환경에서는 이 처리가 되지 않았다. 애플리케이션 로그에서는 함수가 정상적으로 실행됐지만, DB로 쿼리가 날아가지 않은 것이다. 더 황당한 점은, 작성해둔 테스트 코드에서는 이 변경 사항을 정상적으로 ...

Preview Image

[Infra] SPOF 극복하기

초보 개발자에겐 서버 인프라를 만들어서 배포하는 것도 매우 힘든 일이다. 하지만 EC2에 서버를 올리고, DB에 연결하기만 하면 서비스를 위한 준비는 끝일까? 우리의 서버는 가끔, 위험한 상황을 마주한다. 그것이 악의적인 트래픽 공격일 수도 있고, 단순히 프로그래밍 실수로 인한 서버 자원 과부하일 수도 있다. 상황은 여러가지다. 하지만 유저가 겪는...

Preview Image

[DB] 쿼리 분리를 통한 조회 성능 99.9% 향상시키기

0. 쿼리를 개선해야 하는 이유 기능을 개발했다고 끝난 것은 아니다. 당장은 유저가 없고, 데이터가 적어서 조회 속도가 빠르겠지만, 데이터가 100만, 1000만이 되면 우리의 DB가 멀쩡할까? 우리가 평소에 사용하는 서비스들을 생각해보자. 로딩이 0.n초라도 느리면, 우리는 바로 새로고침을 누르거나 페이지를 나가버린다. 이만큼 속도 문제는 치명적...

Preview Image

[Architecture] API는 어떻게 설계해야 할까

0. 서론 팀 프로젝트를 하면서 다음과 같은 상황을 마주했다. 나의 모멘트(게시글) 페이지를 불러올 때, 해당 모멘트에 알림이 달렸는지 여부도 함께 불러와야 했다. 처음엔 기존 특정 유저의 모멘트들을 불러오는 API가 이미 존재하니, 이걸 건드리지 않고 특정 유저의 알림 정보를 불러와서 프론트에서 조합하게 만든다면 깔끔하게 해결된다고 생각했다. ...

Preview Image

[Refactoring] 메서드 하나에 너무 많은 책임이 있다면? Facade와 Event Listener로 리팩토링하기

이 글에서는 점점 비대해지는 메서드를 어떻게 분리하고, 유지보수하기 좋은 코드로 만들 수 있는지에 대한 리팩토링 과정을 공유하려 한다. 특정 기능 하나를 실행했을 뿐인데, 그 안에서 너무 많은 일이 벌어지고 있다. Facade 패턴과 Spring Event Listener를 활용해 해결한 과정을 공유한다. 대상 독자 하나의 메서드가 너무 많은...

Preview Image

[SpringBoot] 실시간 알림을 위한 SSE, 트러블 슈팅

서론 우아한 테크코스 Level3 과정을 진행하면서 처음으로 팀 프로젝트에 참여하고 있다. 프로젝트 도중 우리 사용자에게 실시간 알림을 보내야 할 필요성이 생겼고, 내가 이 알림 기능을 맡게 됐다. 약 3~4일 동안 구현하면서 정리한 지식과 트러블 슈팅을 기록하고자 한다. HTTP 통신이 실시간 알림에 부적합한 이유 먼저 생각한 것은 기존 H...

Preview Image

[Java] 람다식에서 final 변수만 사용해야 하는 이유

람다 표현식에서 변수를 사용하다보면, 어느순간 만나게 되는 경고 문구가 있다. 왜 람다식에서는 이런 제약이 있는 걸까? 이것을 알기 위해선 자바에서의 메모리 개념과, 람다식이 어떻게 자유변수를 사용하는지 알아야 한다. 1. Stack 메모리, Heap 메모리 자바에 존재하는 메모리 중 두 개의 메모리 작동 방식을 알아야 한다. 1.1 Sta...