전체 글 59

[트러블 슈팅] Transaction Commit 전 서버에서 경매방이 생성되는 문제

문제 상황실시간 경매 시스템에서 메인 서버가 경매를 생성하고, WebSocket 서버에 경매방을 만들도록 요청하는 구조였다.그런데 다음과 같은 문제가 발생했다:❗ 메인 서버에서 경매 생성이 실패했는데도, WebSocket 서버에는 방이 생성돼버린다.경매를 생성할 때 유효성 검증 오류 등으로 DB에 저장이 되지 않았음하지만 그 시점에서 이미 WebSocket 서버에 경매방 생성 요청이 전달되어 실행됨이후 다시 요청을 보내면 auctionId가 달라져 두 서버 간 auctionId 불일치 문제 발생원인 분석문제의 핵심은 단순했다.Auction saveAuction = auctionRepository.save(auction);// ❌ 이 시점엔 아직 트랜잭션 커밋되지 않았음webSocketClient.crea..

내일배움캠프 2025.04.30

Redis를 활용한 스케줄링 서버 구현

이전에 작성한 WebSocket을 활용한 실시간 경매 서버에 이어 경매종료를 확인해 자동으로 상태를 변경하는 스케줄링 서버를 만들어보자 WebSocket을 활용한 실시간 경매 서버 구현파이널 프로젝트에 저희 팀으 선정한 주제는 "실시간 경매를 활용한 리셀"프로젝트입니다 실시간 경매 프로젝트를 진행하면서 제가 맡게된 파트는 웹소캣을 활용한 실시간 경매방과 자동 상태cork-7.tistory.com 스케줄링 서버는 웹소켓 서버에서 경매를 생성할 때 메인에서 요청한 종료시간에 맞춰 레디스에 지정한 TTL 만료를 감지하여 다시 웹소캣에 전달하는 역할을 한다 왜 웹소캣 서버에서 만료를 감지 하지 않고 따로 서버를 만들어야할까? 처음부터 스케줄링 서버를 만들려고 진행한것은 아니였다. 다만 웹소캣 서버를 진행하면..

내일배움캠프 2025.04.30

WebSocket을 활용한 실시간 경매 서버 구현

파이널 프로젝트에 저희 팀으 선정한 주제는 "실시간 경매를 활용한 리셀"프로젝트입니다 실시간 경매 프로젝트를 진행하면서 제가 맡게된 파트는 웹소캣을 활용한 실시간 경매방과 자동 상태 변경을 구현하는 것이 였습니다. 다른 서버에 존재하는 유저들이 딜레이없이 입찰가를 확인하며 입찰로그를 알아야한다는것이저희가 일상적으로 사용하는 SNS 카톡과 유사하다고 생각했고 실시간 통신을 중점으로 두고 프로젝트를 진행했습니다 실시간으로 통신하는 방식에는 HTTP를 활용한폴링 , 롱폴링 스트림 방식과 websocket을 활용한 tcp 방식이 있습니다폴링 과 롱폴링 그리고 스트림방식은 실시간으로 소통를 하는데 많은 무리가 있습니다 폴링 : 클라이언트가 일정 주기로 서버에 “새로운 데이터가 있나요?” 라고 반복요청을 하는 방..

내일배움캠프 2025.04.29

[Spring]_ 아웃소싱 프로젝트 트러블 슈팅

아웃소싱 프로젝트에서 jwt를 활용한 인증인가 및 유저 부분을 당담하게 됬다. 배달 어플를 만드는 프로젝트로 로그아웃을 하지않고 지속적으로 로그인 상태를 유지하는 방안으로 생각했고이를 위해 refresh token을 사용하기로 했다. Refresh Token을 서버에 저장리프레시 토큰을 서버에 저장함으로서 클라이언트와 백그라운드에서 리프레시 토큰을 통해 엑시스 토큰을 재발급받는다.DB에 저장함으로서 클라이언트가 리프레시 토큰을 보관하지 않고 탈취의 위험을 줄인다. redis는 인메모리 데이터 베이스로 RDBMS데이터 베이스보다 빠른 속도를 가진다. 다만 인메모리 데이터 베이스는 휘발성 데이터 베이스로 데이터가 손실될 우려가 있다.그렇기에 다양한 전략을 사용하여 데이터를 저장한다. 캐시(Cache), 캐싱..

카테고리 없음 2025.03.07

[Spring]_JWT Refresh token

1. JWT란?JWT(JSON Web Token)는 JSON 형식으로 만들어진 토큰 기반 인증 방식이다사용자 인증을 진행할 때 서버에 세션 정보를 저장하지 않고, 토큰만으로 인증을 처리하는 방식2. JWT 등장 배경기존에는 세션(Session) 방식이 많이 사용되었다.다만, 세션 방식은 사용자의 인증 정보를 서버에 저장하기 때문에 사용자가 많아질수록 서버에 부담 커진다.이 문제를 해결하기 위해 JWT가 등장했다.3. JWT의 특징서버에 인증 정보를 저장하지 않고, 토큰에 모든 정보를 담아 클라이언트가 보관합니다.서버는 토큰만 검증하면 되기 때문에 Stateless(무상태성) 구조가 됩니다.4. JWT의 단점JWT에도 단점이 존재한다, 바로 토큰 탈취의 위험입니다.만약 JWT가 탈취되면, 만료되기 전까지는..

[Spring]_뉴스피드 팀프로젝트 트러블 슈팅

⌘ 발단 - 유저 삭제 과정 오류 ⌘ 원인- 프로필에서 다양한 엔티티의 연관을 지어 메소드를 사용하고 있다. 그 상태에서 유저를 삭제하면 남아있는 연관관계에   오류가 발생해 500에러 발생@Transactionalpublic void deleteUserById(Long id, String oldPassword) { User user = userRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재 하지 않습니다")); // 기존 비밀번호를 틀리게 작성할 경우 에러 발생 if (!passwordEncoder.matches(oldPassword, user.getPasswo..

[Spring]_일정관리 Develop 트러블 슈팅

단계Lv1 - 일정 CRUD(생성,조회,수정,삭제/[필드 - 작성 유저명, 일정 제목, 할 일, 작성일, 수정일])Lv2 - 유저 CRUD(유저명, 이메일, 작성일 수정일/일정에서 작성유저명을 유저 고유식별자로 변경)Lv3 - 유저에 비밀번호 추가 Lv4 - Cookie/Session을 통해 로그인 기능 구현(이메일과 비밀번호 사용)Lv5 - 다양한 예외처리 적용Lv6 - 비밀번호 암호화Lv7 - 댓글 CRUDLv8 - 일정 페이징 조회 -- 구현 단계 Lv 4구현중 문제점일정/유저/회원가입/로그인 기능들을 만들고 연결하는 과정에서 지속적인 로그인 실패(아직 해결단계이며 예측상 일정을 생성할 때 세션이 전달되지않아 발생하는것으로 보임) 환경변수spring.application.name=scheduleDe..

[Spring]_MVC

Template Engine-  동적인 웹페이지를 생성하는데 사용하는 도구- 템플릿을 기반으로 정적/동적 데이터를 경합해 HTML, XML등 문서를 생성 >>자바 코드로 HTML을 만드는 것이 아닌 HTML문서에 동적으로 변경해야할 부분만 넣으면 편해서 만들어짐 1.  Thymeleaf- Spring과 통합이 잘되있음 (다양한 기능 포함)2.  JSP(Java Server Pages)-  요즘 안씀3. FreeMarker4. Velocity5. Mustache 1) MVC 패턴- 하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역으로 나눈것이다 ' Controller ( Servlet가 해당하는 영역)- HTTP Request를 전달받아 파라미터 검증- 비지..