| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 0.25px border
- 당근마켓
- TS
- npm
- TypeScript
- &연산
- 문서번호
- Websocket
- 클론코딩
- github
- 데이터베이스 #try #이중
- jwt
- 1px border
- 타입스크립트
- Strict
- entity
- angular
- 으
- 컴포넌튼
- 서버리스 #
- literal
- 전역변수
- 10px
- Props
- ES5
- 0.75px border
- 0.5px border
- es6
- ZOOM
- font-size
- Today
- Total
목록BE/Spring (14)
복잡한뇌구조마냥
✅ 배경 – “실시간”이라는 요구는 하나가 아니었다이번 프로젝트에서는 실시간 통신이 필요한 화면이 여러 개 존재했다.하지만 구현을 진행하면서, 이 실시간 요구는 하나의 문제로 묶기 어렵다는 점이 드러났다.1️⃣ 로비 / 경기 대기실방 목록 변경참가자 입장 / 퇴장준비 상태 변경강퇴 처리다른 사용자가 어떤 행동을 했는지 즉시 반영2️⃣ 게임 진행 중사용자 입력 전송상대방 행동의 즉각적인 반영짧은 주기의 반복적인 상호작용처음에는 두 영역 모두“실시간 통신”이라는 하나의 문제로 접근했지만,통신의 방향·빈도·지연 민감도가 서로 다르다는 점을 무시할 수 없었다.✅ 실시간 통신 요구사항을 분리해보면🔹 로비 / 대기실의 성격서버 → 클라이언트 단방향상태 변경 알림 중심이벤트 빈도는 높지 않음연결은 비교적 오래 유지..
Redis를 사용하다 보면 TTL, 만료 키, eviction 같은 개념을 자연스럽게 접하게 된다.하지만 Redis가 내부에서 어떤 기준으로 키를 만료시키고, 왜 그런 구조를 선택했는지까지 깊게 생각해볼 기회는 많지 않다. 이번 글에서는 Redis의 TTL 동작 방식을 이해하기 위해TTL(Time To Live)을 지원하는 간단한 캐시를 Java로 직접 구현해보며,그 설계 과정과 핵심 포인트를 정리해본다.왜 TTL 캐시를 직접 구현해봤을까?Redis는 단순한 Key-Value 저장소가 아니라,만료 시간 관리메모리 제한 하에서의 eviction 정책성능을 고려한 lazy expiration 전략같은 시스템적인 선택들이 녹아 있는 저장소다.이런 개념들을 “문서로 읽는 것”보다직접 작은 구현을 해보는 게 훨씬..
Spring Boot 프로젝트에서 DB 스키마를 안정적으로 관리하려면개발 환경 / 운영 환경 / 로컬 환경에서 모두 동일한 테이블 구조를 유지할 수 있어야 한다.이때 가장 많이 사용하는 방법이 Flyway 기반 데이터베이스 마이그레이션이다. 프로젝트에서도 Flyway를 적용해서DB 구조 변경을 코드로 관리하고, 버전 충돌 없이 배포할 수 있는 구조를 만들었다.1. Flyway란 무엇인가?Flyway는 데이터베이스 스키마를 버전 관리하는 도구다.테이블 생성컬럼 추가/삭제인덱스 생성제약조건 수정초기 데이터 삽입(Seed)이 모든 DB 작업을 **SQL 파일로 버전 관리(V1, V2, V3...)**하고Spring Boot 애플리케이션 실행 시 자동으로 적용한다.즉,“로컬 · 개발 · 운영 DB 스키마를 모두..
1. SMTP란 무엇인가?SMTP(Simple Mail Transfer Protocol)는애플리케이션 → 메일 서버 → 사용자의 메일함으로 메일을 전달하는 메일 전송 프로토콜이다.Spring Boot에서는 내부적으로 SMTP 서버(Gmail, Naver, Outlook, 회사 SMTP 등)에 접속해서로그인 → 메일 전송 → 서버가 사용자에게 전달이라는 과정을 수행한다.우리가 할 일은 단순히 SMTP 서버 설정 + JavaMailSender 호출뿐이다.2. Spring Boot SMTP 설정 (application.yml)프로젝트에서는 보안상 메일 정보를 환경변수로 분리해두고 아래와 같이 설정했다. spring: mail: host: ${SPRING__MAIL__HOST} port: ${SPR..
실제 서비스를 운영하다 보면 아래 같은 요구가 반드시 생긴다.매일 0시에 통계 집계 돌리기예약일 하루 전 알림 보내기오래된 로그 삭제하기대량 데이터 업데이트 또는 ETL 실행이런 작업들은 정상적인 요청/응답 기반 API에서 처리하기 어렵고,정해진 시점(time-based)에 반복 실행되어야 하는 로직이기 때문에스케줄러와 배치가 필요해진다.하지만 개발자들이 헷갈리는 대표적인 질문이 하나 있다.“스케줄러는 @Scheduled? Quartz? Spring Batch랑은 어떻게 연결하지?배치랑 스케줄러를 같이 써도 되는 건가?”1. 🔥 스케줄러와 배치의 본질적인 차이먼저 개념부터 명확하게 정리하자.역할도구핵심 포인트언제(When) 실행할 것인가?@Scheduled, Quartz실행 스케줄 관리무엇(What)을..
1️⃣ OSIV(Open Session In View) 개념 잡기✔ OSIV / OEIV 용어 정리용어설명OSIV (Open Session In View)Hibernate 환경에서 Session을 요청–응답 전 범위에서 열어두는 패턴OEIV (Open EntityManager In View)JPA 환경에서 EntityManager를 요청–응답 범위에서 유지하는 패턴둘은 실질적으로 동일하며, 관례적으로 OSIV라고 부른다.👉 핵심 개념요청(Request) 시작부터 응답(Response)까지 영속성 컨텍스트를 열어둔다.→ 트랜잭션이 끝난 뒤에도 Lazy Loading이 가능해진다.2️⃣ OSIV의 동작 방식OSIV가 true일 때 JPA의 동작 흐름은 다음과 같다: [요청(Request) 시작] ..
1. JOOQ란 무엇인가?JOOQ = 타입 안전한 SQL 빌더 + DB 스키마 기반 코드 생성기ORM처럼 객체 중심이 아니라,“SQL 중심(SQL-first)” 으로 설계된 DSL이다.즉,SQL 문법을 Java DSL로 그대로 표현MySQL, PostgreSQL 등 Dialect에 맞춰 SQL을 자동 생성DB 스키마 기반 코드 생성 → 컴파일 타임 안정성복잡한 SQL(CTE, Window Function, Inline Subquery)도 손쉽게 작성 가능2.🔥 JPA의 한계 — 왜 QueryDSL과 JOOQ가 필요해지는가?JPA는 객체 중심 개발을 돕는 훌륭한 ORM이지만,조회(특히 고급 SQL) 관점에서는 구조적 한계를 가진다.2.1 JPQL의 구조적 한계❌ 1) FROM 절 서브쿼리 불가능예:SEL..
1. Spring AI란?Spring AI는 Spring 진영에서 만든 “AI 연동용 추상화 프레임워크”다.OpenAI, Azure OpenAI, Anthropic, Ollama 등 다양한 모델을 하나의 공통 API(ChatModel / ChatClient / EmbeddingModel 등) 로 다룰 수 있게 해준다. 핵심 포인트는:ChatModel / ChatClient 로 LLM 호출EmbeddingModel 로 임베딩 추출VectorStore/직접 구현으로 벡터 검색Spring Boot Auto-Configuration 지원 (config 최소화) 2. 의존성 & 기본 설정2-1. Gradle 의존성dependencies { // OpenAI Chat (ChatClient / ChatModel..