Codeit 18

[모두의 플리] watcherCount를 Redis로 리팩토링

상황프로젝트에서 실시간 콘텐츠 시청 세션 기능을 구현했다. 사용자가 영상 페이지에 들어오면 시청자로 집계되고, 나가면 집계에서 빠져야 한다. 이 숫자는 웹소켓을 통해 모든 사용자에게 실시간으로 브로드캐스팅되어야 했다.문제점프론트에서 콘텐츠를 불러올 때, 요구하는 dto에 watcherCount가 들어있다.그래서 기존 코드는 콘텐츠 엔티티에 watcherCount 필드를 사용했다. 그래서 WatchingSessionService에서 watchingSession이 업데이트 될때마다 이 콘텐츠의 필드도 업데이트 하는 방식으로 했다:contentRepository.incrementWatcherCount(content.getId());contentRepository.decrementWatcherCount(cont..

Codeit/프로젝트 2025.12.23

[코드잇 스프린트] Spring 백엔드 4기 수료 후기 및 회고

어느새 7개월이 지나갔고...긴 시간처럼 느꼈던 부트캠프가 끝났다. 5월부터 12월까지 수강했었고, 그 동안 정말 많은 일이 일어났다. 그래서 오늘은 반년동안 코드잇 스프린트 Spring 백엔트 4기 후기를 작성해보자 한다!정보보다는 개인적인 생각과 회고가 많이 담겨있는 글이다. 👩🏻‍💻 왜 코드잇 부트캠프를 선택했을까? 일단 나는 전공자이지만, 스스로가 느끼기에는 기본기가 많이 부실한 편이었다. 아직 졸업은 하지 않았지만 졸업을 하면 바로 취직 준비를 해야한다는 생각에, 자신이 너무 너무 준비가 안됐다고 느꼈다.그래서 4학년으로 올라가기 전에 휴학을 하기로 선택했고, 이 기간 동안 스스로가 무엇을 좋아하는지 탐색해보려고 했다.(나중에 든 생각이지만 휴학은 정말 잘한 선택이었던 것 같다.. 학교 ..

Codeit 2025.12.19

[모두의 플리] ES 성능 테스트!

ES 검색기능을 구현 후, 성능 테스트를 해봤다. 먼저 TimeConfiguration을 빈드로 수동 등록해줘야 했다:@Configurationpublic class TimerConfiguration { @Bean public TimedAspect timedAspect(MeterRegistry meterRegistry) { return new TimedAspect(meterRegistry); }} ContentController: @Timed("search.sql") @GetMapping("/test/sql") public CursorResponseContentDto findContentsRepository(@Valid @ModelAttribute ContentSearchRequest r..

Codeit/프로젝트 2025.12.09

[모두의 플리] 트러블슈팅 - 실시간 시청 세션 동기화와 Race condition

내가 짰던 코드 흐름WatchingSessionController현재 시청자 목록을 조회(GET)하여 화면에 렌더링하는 역할WebSocketEventListenerSessionSubscribeEvent 발생시 여기서 시청 세션 (WatchingSession 엔티티)를 생성하고, 그 정보를 가져다 payload로 보내서 실시간 입장 브로드캐스트SessionUnsubscribeEvent / SessionDisconnectEvent 발생 시 삭제된 WatchingSession 의 정보를 가져다 payload로 보내서 실시간 퇴장 브로드캐스트결국 화면에 보이는 실시간 참여자 수를 실시간으로 업데이트가 되게 해준다.컨트롤러의 조회 API는 이미 들어와 있던 사람들 정보를 볼 수 있게 해주고, WebSocketEv..

Codeit/프로젝트 2025.12.02

Elastisearch 토이 프로젝트 만들어보기 (프로젝트를 위한 준비..)

https://www.youtube.com/@liliumbosniacumcode/videos Lilium CodeTrying to share my knowledge as best as I can. All code is available on github https://github.com/liliumbosniacumwww.youtube.com이분이 올리신 강의를 따라하면서 받아적은 노트들이다!elasticache를 사용하기 위해 일단 docker compose를 만들었다:version: '3.7'services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10 container_name: elasticsea..

Codeit/프로젝트 2025.11.27

[모두의 플리] 고도화 - redis를 이용한 분산환경 고려 (pub/sub)

AWS ECS 등을 활용해 서버를 2대 이상 증설하는 분산 환경(Scale-out)에서는 기존 WebSocket 구현 방식에 문제가 발생한다. 이를 해결하기 위해 Redis Pub/Sub를 도입한 과정을 정리한다. 현재 WebSocketConfig:@Configuration@EnableWebSocketMessageBroker@RequiredArgsConstructorpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer { private final AuthChannelInterceptor authChannelInterceptor; @Override public void registerStompEndpoints(StompEnd..

Codeit/프로젝트 2025.11.26

[모두의 플리] 트러블 슈팅 - 웹소켓 환경에서 유저 정보 가져오기

문제 상황실시간 채팅 기능을 구현하기 위해 Spring WebSocket(STOMP)을 도입했다. ChatController에서 메세지를 받아 전파하는 로직을 짰고, 기존 REST API에서 하던 것처럼 @AuthenticationPrincipal을 사용해 유저 정보를 가져오려고 했다:@Controller@RequiredArgsConstructorpublic class ChatController { private final SimpMessagingTemplate messagingTemplate; // (adds /pub) client -> server // 엔드포인트: SEND /pub/contents/{contentId}/chat @MessageMapping("/contents/{contentI..

Codeit/프로젝트 2025.11.26

[모두의 플리] 트러블슈팅 - @AuthenticationPrincipal을 가진 컨트롤러 테스트

특정 컨텐츠의 시청 세션 목록 조회 컨트롤러의 테스트를 구현해야 했었다: // 특정 콘텐츠의 시청 세션 목록 조회 (커서 페이지네이션) @GetMapping("/contents/{contentId}/watching-sessions") public ResponseEntity getWatchingSessionsPerContent( @PathVariable UUID contentId, @Valid WatchingSessionRequest request, @AuthenticationPrincipal CustomUserDetails userDetails ) { log.info("[실시간 세션] 특정 콘텐츠의 시청 세션 목록 요청 수신. contentId = {}", cont..

Codeit/프로젝트 2025.11.19

[Monew] 트러블슈팅 - CICD

1. CI/CD pipeline에서 region mismatchecr로 올릴때는 public registry라서 제공되는 지역 us-east-1로 AWS CLI 로그인을 해야한다ecs로 올릴때는 프로젝트의 지역으로 AWS CLI 로그인을 해야한다 (ap-northeast-2)Github Secrets로부터 가져옴deploy-to-ecs: runs-on: ubuntu-latest needs: build-and-push steps: # AWS 자격 증명 설정 - name: AWS CLI 설정 uses: aws-actions/configure-aws-credentials@v2 with: aws-access-key-id: ${{ secr..

Codeit/프로젝트 2025.09.16