DB 개념 정리 🧠 | 정규화/반정규화, 인덱스, 트랜잭션, JOIN
·
TIL (Today I Learned)
정규화와 반정규화정규화데이터 중복을 최소화하고, 데이터 무결성을 유지하기 위해 데이터베이스를 설계하는 과정💡데이터 무결성 (Data Integrity)데이터가 정확하고 일관되며 신뢰할 수 있는 상태로 유지되는 것💡데이터 무결성의 유형개체 무결성 (Entity Integrity)기본 키(Primary Key)는 반드시 NULL이 아니고 중복되지 않아야 함.참조 무결성 (Referential Integrity)외래 키(Foreign Key)는 참조하는 테이블의 기본 키와 일치하거나 NULL이어야 함.도메인 무결성 (Domain Integrity)컬럼 값은 정해진 데이터 타입, 범위, 형식을 만족해야 함.사용자 정의 무결성 (User-defined Integrity)비즈니스 규칙에 따른 무결성. 제 1 정..
Spring Boot 면접 대비 개념 정리❕
·
TIL (Today I Learned)
1. Spring BootSpring Boot의 등장 이유기존 Spring은 설정 XML 또는 Java Config 작성량이 많아 진입 장벽이 높았음Spring Boot는 "관례에 의한 설정"(Convention over Configuration)을 도입하여 설정 자동화와 생산성 향상을 목표로 등장Spring Boot의 자동 구성Spring Boot는 `@SpringBootApplication` 애노테이션을 통해 자동 설정(AutoConfiguration)을 활성화`@SpringBootConfiguration`, `@EnableAutoConfiguration`, `@ComponentScan`이 합쳐진 복합 애노테이션스프링 부트는 명시적인 설정을 줄이고 관례에 따른 자동 구성으로 개발 생산성을 높인..
JVM의 개념과 내부 구조 정리
·
TIL (Today I Learned)
JVM (Java Virtual Machine)JVM은 `.java` 소스파일(=원시코드)을 컴파일한 결과물인 `.class` 파일(=바이트코드)을 읽어서,운영체제와 하드웨어에 맞게 실행할 수 있도록 해주는 가상 머신입니다.Java는 운영체제(OS)에 종속적이지 않다는 특징이 JVM에 의해서 동작됩니다.JVM 덕분에 자바는 한 번 작성한 코드를 윈도우, 리눅스, 맥 등 다양한 환경에서 같은 코드로 실행할 수 있습니다. JVM의 주요 역할역할설명바이트코드 실행컴파일된 `.class` 파일을 읽고 실행메모리 관리객체 생성/삭제,스택/힙 등 메모리 구조를 관리GC (Garbage Collection)사용하지 않는 객체를 자동으로 정리해 메모리 누수를 방지운영체제 독립성 보장동일한 바이트 코드를 OS에 상관없이..
[table-now] Spring Batch 개념과 정산 자동화 구조 정리
·
Dev Projects
🔍 Spring Batch란?배치 처리(batch processing)를 효율적으로 수행할 수 있도록 도와주는 Spring 기반의 오픈 소스 프레임워크입니다. 일반적으로 배치 작업은 대량의 데이터를 처리하거나, 주기적이고 반복적인 작업을 자동화하는 데 사용됩니다. 활용 예:로깅 및 추적트랜잭션 관리정기적인 대량 데이터 처리 Spring Batch와 Scheduler항목Spring BatchScheduler역할- 대량의 데이터 처리- 로그 처리등의 무거운 작업을 처리하는 배치 프레임워크→ 무엇을 처리할 지특정 시점/주기로 작업을 스케줄링해서 실행하는 기능→ 언제 실행할 지주요 기능Reader, Processor, Writer 구조로복잡한 데이터 처리 흐름 구성주기적으로 특정 메서드를 실행하게 함(`@Sc..
Synchronous 🆚 Asynchronous | RabbitMQ 기반 비동기 처리 구조
·
TIL (Today I Learned)
⏱️ 동기와 비동기동기(Synchronous)한 작업이 완료될 때까지 대기한 후 다음 작업을 수행하는 방식하나의 요청이 끝나기 전까지 다음 처리를 하지 못합니다.특정 작업이 오래 걸릴 경우 다른 작업이 블로킹(Blocking) 됨순차적으로 실행되므로 코드의 실행 흐름을 예측하기 쉽지만, 속도가 느릴 수 있음 비동기(Asynchronous)한 작업을 실행하는 동안 다른 작업을 동시에 수행하는 방식 (대기하지 않음)요청을 보낸 뒤 응답을 기다리지 않고 바로 다음 작업을 진행시간이 오래 걸리는 작업(예: API 호출, 데이터베이스 조회, 파일 처리)을 비동기로 처리하면 성능이 향상됨 비교 동기비동기작업 처리 방식순차적으로 실행동시에 여러 작업 가능응답 대기 여부요청이 끝날 때까지 대기결과를 기다리지 않고 즉시..
[table-now] 1:1(예약자:가게) 채팅 기능 고도화를 위해 RabbitMQ Relay를 적용한 이유
·
Dev Projects
🔍 개요TableNow의 1:1 채팅 기능은 예약자와 가게 사장이 실시간으로 원활하게 소통할 수 있도록 제공된 기능이다. 초기에는 Spring의 SimpleBroker를 사용해 간단하게 구현되었지만, 멀티 인스턴스 환경에서 채팅 메시지가 공유되지 않는 문제점이 있었다.이에 따라 RabbitMQ를 도입하고, STOMP Relay 구조로 전환함으로써 실시간성과 확장성을 확보하고자 했다.이 글에서는 기존 구조의 한계와 개선 이유, 그리고 RabbitMQ Relay 구조를 선택하게 된 배경과 테스트 결과를 정리한다. ⚠️ 기본 채팅 구조의 한계 - SimpleBroker의 구조적 문제점Spring의 기본 메시지 브로커인 `SimpleBroker`는 다음과 같은 한계를 가지고 있었다:단일 서버 메모리 기반메시지..
JWT 인증 기반 WebSocket 연결 실패, 원인과 해결법
·
TIL (Today I Learned)
❗ 문제점채팅 시스템에서 메시지를 전송하려 했으나 메시지 전송이 이뤄지지 않는 문제가 발생했습니다. 테스트용 chat.html 페이지에서는 JWT AccessToken을 입력받아 STOMP connect 헤더에만 포함시켰지만, 이 값은 WebSocket 핸드셰이크 단계에선 전달되지 않아 인증이 누락되었습니다. 클라이언트와 서버 양쪽에서 다음과 같은 에러가 확인됩니다. 클라이언트 서버2025-04-23T15:44:45.565+09:00 WARN 8236 --- [table-now] [nio-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Origin check enabled but transport 'jsonp' does not support it.20..
[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..
Spring Boot 설정값 바인딩 정리: @Value vs @ConfigurationProperties
·
TIL (Today I Learned)
application.yml, application.properties 등의 설정 파일로부터 값을 읽어와서 스프링 빈에 주입하기 위해서@Value와 @ConfigurationProperties를 사용할 수 있다. @Value vs @ConfigurationProperties @Value@ConfigurationProperties목적단일 속성 주입`@Value("${cloud.aws.s3.bucket}")`예: 환경변수 `AWS_S3_BUCKET` 값 하나다수의 속성 주입`@ConfigurationProperties(prefix = "cloud.aws.s3")`예: s3 아래의 환경변수들 (`AWS_S3_BUCKET`, `AWS_S3_PRESIGNED_EXPIRATION`)주입 방식필드만 주입 가능 (`f..