Chanmin Dev Log
close
프로필 사진

Chanmin Dev Log

github: @denev6

  • 분류 전체보기 (53)
    • 개념 (14)
    • 프로젝트 (17)
    • 트러블슈팅 (15)
    • 활동 회고 (2)
    • 일상 (5)
  • 홈
  • 태그
  • 방명록

Naver Cloud Platform에서 Kubernetes 기반 CI/CD 구축하기

1. 배포 플로우Source Build는 Naver Cloud Platform의 Source Commit 저장소에 있는 소스 코드를 기반으로, Dockerfile을 사용해 애플리케이션 이미지를 빌드한다. 빌드가 완료된 이미지는 Container Registry로 자동 푸시되어 배포에 사용할 수 있는 상태가 된다.Source Deploy는 Container Registry에 업로드된 최신 이미지를 참조하여, 지정된 manifest 경로의 Kubernetes 설정 파일을 클러스터에 apply한다. 이를 통해 쿠버네티스 클러스터 내에서 새로운 버전의 애플리케이션이 자동으로 배포된다.Source Pipeline은 이러한 Source Build → Source Deploy 과정을 하나의 파이프라인으로 연결해준다...

  • format_list_bulleted 프로젝트
  • · 2025. 10. 14.

로컬 캐시 활용해서 조회 성능 향상시키기(+ Redis Pub/Sub을 활용한 데이터 동기화)

현재 리플 프로젝트에서는 게시물 목록 조회 API를 개발하여 운영하고 있다. 이 기능은 프로젝트의 핵심 기능 중 하나로 사용자들의 이용 빈도가 매우 높을 것으로 예상되기 때문에 빈번한 조회 요청이 발생할 수밖에 없다.하지만 단순한 조회 기능임에도 매 요청마다 데이터베이스를 직접 조회하게 되면, 불필요한 부하가 누적되어 전체적인 성능 저하로 이어질 수 있다. 이를 개선하기 위해 캐시를 도입하여 성능을 향상시키는 작업을 진행하고자 한다.기존에는 Redis만을 활용해 조회 목록에 대한 글로벌 캐시(Global Cache)를 운영하고 있었다. 오늘은 여기에 Redis의 Pub/Sub 기능을 활용한 캐시 갱신 방식과 함께 성능을 더 끌어올리기 위해 로컬 캐시(Local Cache)를 추가로 도입하려고 한다.캐시로..

  • format_list_bulleted 프로젝트
  • · 2025. 6. 25.
에러 로깅하기 (+디스코드 웹훅 연동하기)

에러 로깅하기 (+디스코드 웹훅 연동하기)

문제 상황리플 프로젝트에서는 백엔드 서버를 EC2에 Docker를 사용하여 Spring Boot 애플리케이션을 컨테이너 형태로 배포해 운영하고 있다. 컨테이너는 정상적으로 작동하고 있었고 애플리케이션에서 발생하는 로그는 log.info, log.error 등을 통해 출력되도록 구현되어 있다.에러 로그를 확인할 때는 다음 명령어를 통해 로그를 추적했다docker logs ripple(컨테이너명)그러나 이 명령어로는 다음과 같은 문제점이 있었다.표준 출력(stdout), 표준 에러(stderr)가 섞여서 출력된다.쿼리 로그, 일반 정보 로그, 에러 로그가 뒤섞여 있어 실제 에러 원인 파악이 어려웠다.컨테이너가 오래 실행될수록 로그가 길어지고, 문제 발생 시점을 추적하기 어렵게 되었다.실시간 대응이 불가능하며..

  • format_list_bulleted 트러블슈팅
  • · 2025. 6. 22.
@EventListener와 @TransactionalEventListener

@EventListener와 @TransactionalEventListener

리플 프로젝트에서는 댓글이 달리거나 좋아요가 눌리면 실시간 알림이 전달된다. 이를 위해 SSE(Server-Sent Events)와 Redis Pub/Sub을 활용해 스케일아웃 환경에서도 잘 작동하는 실시간 알림 시스템을 구축했다.그런데 이 상황에서 예방하지 못한 문제가 하나 있었다. 댓글이나 좋아요에 대한 정보가 DB에 저장되지 않았음에도 알림이 사용자에게 전송되는 경우가 발생할 수 있다는 것이다.이번 글에서는 그 문제의 원인을 파악해보고, @TransactionalEventListner 를 통해 어떻게 해결했는지를 정리해보았다.기존 방식이벤트 기반 처리기존 코드에서는 예를 들어 댓글이 작성되면 알림을 보내야 하는 것처럼, 어떤 행위에 반응해 다른 로직을 실행할 때 이벤트 기반 아키텍처(Event-Dr..

  • format_list_bulleted 트러블슈팅
  • · 2025. 6. 15.

Redis Pub/Sub을 활용하여 실시간 알림 기능 개선

기존 SSE 활용 방식리플 프로젝트에서는 SSE(Server-Sent Events)를 활용해 실시간 알림 기능을 구현했다.알림을 보내기 위해 사용자의 SseEmitter 객체를 ConcurrentHashMap에 저장해두는 방식이다.private final Map emitters = new ConcurrentHashMap();private final Map eventCache = new ConcurrentHashMap();public SseEmitter save(String emitterId, SseEmitter sseEmitter) { emitters.put(emitterId, sseEmitter); return sseEmitter;}이 구조는 단일 서버 환경에서는 문제가 없지만, 스케일 아웃..

  • format_list_bulleted 프로젝트
  • · 2025. 6. 13.
No EntityManager with actual transaction 예외

No EntityManager with actual transaction 예외

문제 상황@Overridepublic void createLocation(LocationCommand command) { User user = loadUserPort.findById(command.userId()) .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); Location location = Location.of( command.placeName(), command.latitude(), command.longitude(), command.pinned(), user ); locationPort.save(location);}@Overridepublic void deleteLocation(Long locationId, Lo..

  • format_list_bulleted 트러블슈팅
  • · 2025. 6. 11.
  • navigate_before
  • 1
  • 2
  • 3
  • 4
  • ···
  • 9
  • navigate_next
공지사항
  • 블로그 이전
전체 카테고리
  • 분류 전체보기 (53)
    • 개념 (14)
    • 프로젝트 (17)
    • 트러블슈팅 (15)
    • 활동 회고 (2)
    • 일상 (5)
인기 글
전체 방문자
오늘
어제
Copyright © chanminee 모든 권리 보유.
SKIN: Copyright © 쭈미로운 생활 All rights reserved. Designed by JJuum.
and Current skin "dev-roo" is modified by Jin.

티스토리툴바