[table-now] Spring Batch 개념과 정산 자동화 구조 정리
·
Dev Projects
🔍 Spring Batch란?배치 처리(batch processing)를 효율적으로 수행할 수 있도록 도와주는 Spring 기반의 오픈 소스 프레임워크입니다. 일반적으로 배치 작업은 대량의 데이터를 처리하거나, 주기적이고 반복적인 작업을 자동화하는 데 사용됩니다. 활용 예:로깅 및 추적트랜잭션 관리정기적인 대량 데이터 처리 Spring Batch와 Scheduler항목Spring BatchScheduler역할- 대량의 데이터 처리- 로그 처리등의 무거운 작업을 처리하는 배치 프레임워크→ 무엇을 처리할 지특정 시점/주기로 작업을 스케줄링해서 실행하는 기능→ 언제 실행할 지주요 기능Reader, Processor, Writer 구조로복잡한 데이터 처리 흐름 구성주기적으로 특정 메서드를 실행하게 함(`@Sc..
[table-now] 1:1(예약자:가게) 채팅 기능 고도화를 위해 RabbitMQ Relay를 적용한 이유
·
Dev Projects
🔍 개요TableNow의 1:1 채팅 기능은 예약자와 가게 사장이 실시간으로 원활하게 소통할 수 있도록 제공된 기능이다. 초기에는 Spring의 SimpleBroker를 사용해 간단하게 구현되었지만, 멀티 인스턴스 환경에서 채팅 메시지가 공유되지 않는 문제점이 있었다.이에 따라 RabbitMQ를 도입하고, STOMP Relay 구조로 전환함으로써 실시간성과 확장성을 확보하고자 했다.이 글에서는 기존 구조의 한계와 개선 이유, 그리고 RabbitMQ Relay 구조를 선택하게 된 배경과 테스트 결과를 정리한다. ⚠️ 기본 채팅 구조의 한계 - SimpleBroker의 구조적 문제점Spring의 기본 메시지 브로커인 `SimpleBroker`는 다음과 같은 한계를 가지고 있었다:단일 서버 메모리 기반메시지..
[table-now] 예약자-사장님 1:1 실시간 채팅 기능 설계 및 구현
·
Dev Projects
🔍 구현 목적`table-now`는 실시간 식당 예약 서비스입니다.예약자와 가게 사장님 간의 실시간 소통을 지원하기 위해 1:1 채팅 기능을 구현했습니다. 단순한 메시지 전송이 아닌, 예약 건 단위로 안전하게 주고받을 수 있도록 설계하여, 예약 관련 문의 및 요청사항을 실시간으로 교환할 수 있습니다. 🧩 설계1. ERD 설계 - 채팅방 없이 메시지만 저장이 시스템은 예약(reservation) 단위로 채팅이 이뤄지므로, 별도의 채팅방 테이블은 필요하지 않습니다.각 `reservation_id`는 고유한 채팅방 역할을 하며 예약이 존재해야만 채팅이 가능하므로, 채팅방 개념은 reservation에 종속됩니다. 모든 채팅 메시지는 chat_message 테이블에 저장됩니다.💡 채팅방 테이블을 만들지 ..
[table-now] Spring Security의 oauth2Login() 대신 WebClient를 선택한 이유
·
Dev Projects
🔍 개요이전에 작성했던 글- 2025.03.21 - [Java Study/Frameworks] - Spring Security를 활용한 JWT 인증 | Stateless하게 제대로 적용하기!- 2025.04.21 - [Dev Projects] - [table-now] 소셜 로그인(Kakao, Naver) 통합 구현기에서는 JWT 기반 인증 구조에서 Stateless 특성이 왜 중요한지와 해당 특성을 살리면서 개발하는 방법에 대해 설명했습니다. `table-now` 프로젝트에서는 기본적으로 Spring Security + JWT 기반 인증 구조를 먼저 설계하고 구현해두었습니다. 역할 기반 인가 처리는 `@Secured` 어노테이션을 통해 명확하게 적용하고, 인증 정보는 `SecurityContextH..
[table-now] 의사결정 기록 - 외부 연동 시스템 예외 처리 강화 리팩토링
·
Dev Projects
🔍 문제 정의 (Why)Redis 사용 중 발생하는 에러에 대한 대응이 없음소셜 로그인 WebClient 사용 중 발생하는 에러에 대한 대응이 없음HTTP 4xx/5xx 응답 또는 네트워크 단절 시 사용자에게 불명확한 에러 발생S3 Presigned URL 생성 중 예외 발생 시 로그나 예외 처리가 없음 ✅ 해결 방법 & 기술 선택 (How)💡 로그 스타일예외 로그의 출처 구분을 위해 prefix 지정[Redis][OAuth][S3] 💡ErrorCode 리팩토링AUTH와 USER에서 사용하던 에러코드 목록을 도메인별로 분리 (AUTH & USER → AUTH, USER)네이밍 개선예) FAILED_TO_PARSE_OAUTH_TOKEN → OAUTH_RESPONSE_PARSING_FAILED 💡 ..
[table-now] S3 이미지 업로드 - Presigned Url 방식으로 구현하기
·
Dev Projects
🔍 개요이번 글에서는 우리가 개발한 실시간 식당 예약 관리 시스템 `table-now`에서 사용자 프로필 이미지와 식당 이미지를 어떻게 효율적으로 업로드할 수 있을지 고민했고, 그 결과 도입한 Presigned URL 방식의 설계 및 구현 과정을 이번 글에서 공유합니다. AWS S3에 이미지를 업로드할 때 일반적으로 사용하는 두 가지 방식은 다음과 같습니다:🔹 MultipartFile 방식서버가 클라이언트로부터 MultipartFile을 받고, 이를 S3로 직접 업로드장점: 간단한 구현단점: 서버 트래픽 부담 증가대용량 파일의 경우 서버 리소스 과다 사용업로드 처리 시간이 서버 응답 시간에 포함됨🔹 Presigned URL 방식클라이언트가 S3에 직접 파일을 업로드하고, 서버는 그 URL만 발급..
[table-now] AccessToken 블랙리스트 기반 토큰 무효화 기능 구현
·
Dev Projects
🔍 성능 개선 / 코드 개선 요약블랙리스트 기반 AccessToken 무효화로 인증 보안 강화 🧩 문제 정의JWT는 서버가 세션을 관리하지 않는 Stateless 구조입니다. 이는 장점이자 단점이 될 수 있습니다.클라이언트가 가지고 있는 AccessToken은 만료 전까지 항상 유효사용자가 로그아웃하거나 탈퇴해도 기존 AccessToken으로 계속 접근 가능보안 취약점 발생 가능 💡 가설JWT의 Stateless 특성상, AccessToken을 서버에서 직접 무효화할 수 없습니다.AccessToken을 서버에서 명시적으로 차단하려면블랙리스트를 관리해야 합니다인증 필터에서 요청이 들어올 때 블랙리스트에 해당 토큰이 있는지 확인하여 차단 🛠 해결 방안✔️ 기술 선택 및 구조Redis 기반의 블랙..
[table-now] Refresh Token 저장소를 Redis로 교체하며 인증 구조 고도화하기
·
Dev Projects
🔍 개요JWT 기반 인증 시스템을 운영하면서 Refresh Token 저장소를 기존 RDB(MySQL)에서 Redis로 전환하였습니다. 이번 작업은 성능 향상뿐 아니라, 인증 시스템의 Stateless 구조를 더욱 명확히 구현하는 과정이었습니다. 📈 성능 개선 / 코드 개선 요약Refresh Token을 Redis 기반 Key-Value 구조로 전환인증 흐름에서 발생하는 불필요한 DB 접근 제거TTL 기반 자동 만료와 빠른 조회로 인증 시스템 성능 최적화 🧩 문제 정의기존에는 Refresh Token을 RDB에 저장하는 방식으로 구현되어 있었습니다. 하지만 이 방식은 다음과 같은 문제를 갖고 있었습니다: RDB 부하 증가: 로그인 시 INSERT, 재로그인 시 UPDATE, 재발급 시 SELEC..
[table-now] 소셜 로그인(Kakao, Naver) 통합 구현기
·
Dev Projects
🔍 개요이번 프로젝트에서는 Spring Security와 JWT를 기반으로 인증/인가 시스템을 설계하고, Kakao/Naver 소셜 로그인 기능을 통합 구현하였습니다. 인증 정보를 서버에 저장하지 않는 Stateless 구조로 유지하면서, OAuth2 인증 과정을 WebClient로 커스터마이징하여 JWT 발급 흐름과 통합하였습니다. 🛠️ 환경 설정1. Kakao / Naver Developers 앱 등록Kakao비즈니스 정보 심사를 받아야 전화번호 등 민감정보 사용 가능실제 서비스 URL이 필요하므로 localhost 환경에서는 비즈니스 심사가 불가능. 테스트앱을 통해 동의항목 등록하여 개발 진행Naver등록된 ID(개발자 계정)만 로그인 테스트 가능 2. application.yml OAuth ..
[Spring Data JPA_일정 관리 앱 Develop] 필수 & 도전 기능 구현 기록 🖋️
·
Dev Projects
개요CH 3 일정 관리 앱 Develop 필수/도전 기능을 구현하면서 고민했던 부분과 트러블 슈팅 과정에 대해 작성해보겠습니다. 📌 필수/도전 기능 가이드더보기필수 기능Lv 1. 일정 CRUDJPA를 이용해 CRUD를 구현했습니다.이전에 Spring JDBC로 일정 관리 앱을 구현했던 것과 비교했을 때, JPA를 활용하니 더 편리했습니다.차이점Spring JDBCSpring Data JPASQL 작성 여부직접 SQL 작성SQL 작성 불필요CRUD 메서드 구현직접 작성sava, findById 등 기본 제공조회 결과RowMapper로 결과 매핑엔티티 매핑 자동 처리 JPA Auditing을 활용한 작성일, 수정일 자동 관리`@EnableJpaAuditing`을 Application 클래스에 추가해서 JP..