JMDevLog

클라이언트 소켓과 서버 소켓 운영 주의 사항 및 개선점 분석

TCP에 대해 학습을 진행하던 중 클라이언트 입장에서의 소켓과 서버 입장에서의 소켓이 동작하는 방식이 달라진다는 걸 알게되었다. 서비스 운영에 있어서 중요한 고려 지점이 될 것이라 생각해 좀 더 깊게 파해쳐보기로 했다. 클라이언트 소켓과 서버 소켓의 차이 시스템의 규모가 확장되고 비즈니스가 복잡해질수록 다른 서버와의 통신도 잦아진다. 이때 다른 서...

TCP 통신 시 발생 가능한 예외 케이스 분석

보통 네트워크는 예측할 수 없는 구간이라고 한다. 클라이언트와 서버가 물리적으로 떨어져있는 만큼 중간 노드(ex. NAT, Load Balancer, Switch)들을 경유하고 보안 장비(ex. SG, WAF)를 거치면서 패킷이 필터링 될 수도 있기 때문이다. 또한 서버와 어플리케이션 자체의 상태에 따라서도 에러 처리가 모두 다르다. 문제가 발생하면...

Redis pub/sub 내부 구현 방식과 특징 분석

프로젝트에 레디스 pub/sub을 적용하면서 내부 구현 방식과 다른 기술과의 차이점이 궁금해졌다. 먼저 내부가 어떻게 생겼는지 파악한 뒤에 구조는 다르지만 비슷한 기능을 제공하는 카프카와 비교 분석을 진행해보자. Redis pub/sub의 내부 동작 원리 레디스가 내부적으로 pub/sub을 어떻게 구현했는지 살펴보자. 레디스 pub/sub 내...

스프링 캐시 동작 과정 분석

프로젝트에 스프링 캐시를 도입하는 과정에서 어떤 방식으로 내부 구현이 되어 있는지 궁금해졌습니다. @Cacheable 어노테이션을 사용해서 캐시 조회 기능을 사용했을때 어떻게 동작하는지 위주로 분석해보겠습니다. 캐시 호출 시 가장 먼저 동작하는 클래스는 CacheAspectSupport이다. 해당 클래스는 AOP를 사용해 스프링 캐시의 구체 기술을 ...

DB 쓰기락 적용을 통한 동시성 문제 해결

오늘은 프로젝트에 DB 쓰기락을 적용해서 동시성 문제를 해결한 경험을 공유하겠습니다. 문제 상황 현재 서비스에서는 댓글에 좋아요를 누를 수 있는 기능을 제공합니다. 이때 여러명의 사용자가 동시에 좋아요 버튼을 누르면 동시성 문제로 인해 갱신 손실이 발생할 수 있습니다. 문제 해결 방법 선정 현재 서비스가 단일 서버로 운영된다고 생각해보겠습니...

분산락을 통한 동시성 문제 해결 예시

기존에 진행중이던 프로젝트의 댓글 좋아요 기능을 DB 쓰기락 기반 JPA 비관적락으로 동시성을 제어했습니다. 락 매커니즘 비교 대상에서 분산락은 오버엔지니어링의 관점에서 제거했지만, 만약 도입한다면 어떤 식으로 코드를 적용할 수 있을지 경험을 공유하고자 합니다. AOP를 사용한 분산락 구현 그렇다면 분산락을 코드에 어떻게 적용했는지 살펴보겠습니다....

스케쥴러를 사용한 푸시 알림과 배치 처리 기능 구현

이전 포스팅에서는 스프링에서 스케줄링을 사용하는 방법과 개선이 필요한 부분들을 살펴봤습니다. 먼저 마일스톤에는 어떤 기능들을 스케줄링으로 제공하는지 살펴본 뒤 앞에서 학습한 내용을 적용해나간 과정을 공유해보려 합니다. 푸시 알림 스케쥴러 개발 마일스톤에는 사용자가 선택한 요일과 시간에 리마인드 알림을 FCM 푸시를 통해 보내줍니다. 리마인드 알...

스케쥴러를 사용한 푸시 알림과 배치 처리 기능 구현 (이론편)

Spring은 어노테이션을 사용해서 손쉽게 스케쥴링을 사용하도록 도와줍니다. 하지만 @Scheduler 어노테이션만 붙여서는 실제 운영 시에 문제가 발생할 수 있습니다. 오늘은 어떤 문제들이 발생할 수 있는지 알아보고 이를 해결하는 방법들을 학습해보고자 합니다. ThreadPoolTaskScheduler 도입 첫번째로 발생 가능한 문제 상황을 설명...

멀티 모듈 분리와 객체 지향 설계에 대한 고민

프로젝트를 리팩토링하면서 좋은 구조는 무엇일지에 대해 고민을 많이 했습니다. 전체 구조를 여러번 수정하면서 제 나름대로 내린 결론은 확장에 열려있고 적절한 격리를 통해 유지 보수 시 코드 변경 지점을 최소화 하는게 좋은 구조라 생각하게 됐습니다. 지금부터 제 생각을 프로젝트에 녹여본 경험을 공유하고자 합니다. 멀티 모듈 구조 도입 Melly 프...