기록 111

OSIV · 낙관적 락 · 비관적 락

1. OSIV (Open Session In View)OSIV란?기본적으로 영속성 컨텍스트는 @Transactional 메서드 단위로 살아있다. OSIV가 켜지면 이 생명주기가 HTTP 요청 단위로 확장된다. Filter/Interceptor 레벨에서 영속성 컨텍스트를 열고, HTTP 응답이 클라이언트에게 보내질 때까지 유지한다.Spring Boot는 OSIV를 기본적으로 켜놓는다 (spring.jpa.open-in-view=true).OSIV가 켜져 있을 때HTTP Request 도착 → OpenEntityManagerInViewInterceptor.preHandle() → EntityManager 생성 (영속성 컨텍스트 시작) → Controller → Service (@Transaction..

N+1문제와 Fetch 전략 - LAZY, Fetch Join, @BatchSize

1. Fetch 전략 — EAGER vs LAZY전략 동작 JPA 기본값EAGER엔티티 로드 시 연관 엔티티도 즉시 JOIN으로 함께 로드@ManyToOne, @OneToOneLAZY연관 엔티티의 프록시만 만들어두고, 실제 접근 시 추가 쿼리@OneToMany, @ManyToMany @ManyToOne과 @OneToOne의 기본값이 EAGER라는 점이 함정이다. 명시하지 않으면 조회할 때마다 연관 엔티티를 함께 JOIN해온다. 모든 연관관계는 LAZY로 두는 것이 권장된다.@ManyToOne(fetch ..

Java & Spring/JPA 2026.05.09

영속성 컨텍스트 메커니즘 - 1차 캐시 · Dirty Checking · 쓰기 지연

1. JPA와 HibernateJPA(Jakarta Persistence API) 는 자바 객체를 관계형 DB에 매핑하는 명세이다. 인터페이스와 어노테이션의 집합일 뿐, 실제 동작 코드는 없다.Hibernate 는 이 명세의 구현체다. JPA보다 먼저 존재했고, 오히려 JPA 명세가 Hibernate의 영향을 받아 만들어졌다. 구분 JPA Hibernate위치명세구현체패키지jakarta.persistence.*org.hibernate.*역할인터페이스/어노테이션 정의실제 동작 코드sprin..

Java & Spring/JPA 2026.05.09

[Monew] 개인 개발 리포트

1. 프로젝트 개요Monew는 사용자가 관심사 키워드를 등록하면 Naver API와 RSS를 통해 관련 뉴스를 자동 수집·요약해서 제공하는 뉴스 큐레이션 플랫폼입니다. 댓글, 좋아요 등 소셜 기능도 함께 제공해 사용자들이 뉴스에 대한 의견을 나눌 수 있도록 설계했습니다.Spring Boot 기반 REST API 서버로, PostgreSQL과 MongoDB를 함께 사용하고 AWS 인프라 위에서 운영합니다.2. 담당한 작업댓글 도메인 개발 (Comment / CommentLike)프로젝트에서 댓글 도메인 전체를 담당했습니다.댓글 등록 / 수정 / 논리 삭제 / 물리 삭제 API 구현댓글 좋아요 / 좋아요 취소 API 구현QueryDSL 기반 커서 페이지네이션 구현 (createdAt / likeCount 정..

Project/Monew 2026.05.06

Spring Batch 개념, 사용

배치(Batch)란?배치는 대량의 데이터를 한 번에 일괄 처리하는 방식을 말한다.실시간으로 요청이 들어올 때마다 처리하는 게 아니라, 데이터를 모아뒀다가 한꺼번에 처리하는 것이다.대표적인 사용 사례는 아래와 같다.일매출 집계 — 하루치 거래 데이터를 새벽에 한 번에 집계구독 메일 발송 — 정해진 시간에 구독자 전체에게 메일 일괄 전송데이터 백업 — 트래픽이 적은 새벽 시간대에 DB 백업Batch vs Scheduler여기서 헷갈릴 수 있는 게 Batch와 Scheduler의 차이다.구분 역할Batch대량 데이터를 일괄 처리하는 것Scheduler정해진 시간에 작업을 실행시키는 것배치는 "대량 처리"를 의미하는 것이지, 주기적으로 실행된다는 뜻이 아니다.Spring Batch는 Quartz 같은 스케줄러와..

[Monew] 개인 회고록 - 기술보다 어려웠던 것들

팀장을 맡으면서이번 프로젝트는 초급 때와 결이 달랐다. 기능 구현 자체는 어렵지 않았지만 작업 순서, 초기 설정이 훨씬 힘들었다.팀에서 기능 구현 후 테스트 코드를 작성하기로 합의했는데, 이 결정을 지키지 않는 팀원이 생기면서 균열이 시작됐다. 테스트 코드가 없으면 통합 테스트 일정이 밀리게 되고, 중간 작업 시간이 붕 뜨게 되면서 불만을 표출하셨다 ㅠㅠ 그 여파로 팀 분위기가 눈에 띄게 가라앉았다. 한 팀원은 이후 프로젝트 참여 자체에 소극적이 되어버렸다.팀장으로서 이걸 직접 꺼내서 풀어야 할지, 아니면 내버려두고 프로젝트를 끝내야 할지 판단이 서지 않았다. 강사님은 "이걸 터뜨리고 갈지 말지를 팀장이 결정해야 한다" 고 하셨는데, 그 말이 생각보다 어렵게 다가왔었다 ㅠㅠ기술적으로 아쉬웠던 것들기능이..

Project/Monew 2026.04.27

[클라우드 활용] 6주차

1. Amazon S3란?S3(Simple Storage Service)는 AWS가 제공하는 객체 스토리지 서비스다.파일을 버킷(Bucket) 단위로 관리하고, 개별 파일은 객체(Object) 형태로 저장된다.핵심 수치객체 하나의 최대 크기는 5TB이며, 저장 가능한 객체 수에는 제한이 없다.내구성은 99.999999999% (11 9s) — 3개의 가용 영역(AZ)에 중복 저장하기 때문이다.주요 특징항목 설명무제한 저장 용량페타바이트(PB) 이상도 문제 없음높은 내구성11 9's, 3개 AZ 중복 저장다양한 접근 방식HTTP(S), CLI, SDK, API정적 웹 호스팅HTML 정적 웹사이트 직접 서빙 가능자동 백업/복원버전 관리 및 수명 주기 정책 지원버킷 이름 규칙버킷 이름은 전 세계에서 고유해야 ..

[클라우드 프로그래밍] 5주차

1. 레지스트리 / 리포지터리 / 이미지 태그도커 레지스트리란?도커 플랫폼은 소프트웨어 배포 기능을 내장하고 있어서, 로컬에 이미지가 없어도 자동으로 다운로드해준다. 이때 이미지가 저장되는 서버를 레지스트리(Registry) 라고 한다.도커 허브(Docker Hub) 는 도커 레지스트리 중 가장 유명한 레지스트리로, 수십만 종 이상의 이미지를 제공하며 도커 엔진에 기본으로 설정되어 있다.도커 이미지 참조 구조docker.io / diamol / golang : latest │ │ │ │ 레지스트리 계정이름 리포지터리 태그구성요소 설명 ..

페이지네이션의 원리? 필요성?

들어가며Spring으로 목록 API를 만들다 보면 Pageable, Page, Slice를 자연스럽게 쓰게 된다. 근데 막상 "이게 내부적으로 어떻게 동작해?"라고 물어보면 설명을 잘 못했었다. 이 글에서는 페이징이 왜 필요한지부터 OFFSET 방식의 한계, 커서 기반 페이징의 원리까지 차근차근 정리해보자!왜 페이징이 필요할까?SELECT * FROM users;데이터가 100만 건이면 이 쿼리 한 방에 전부 가져온다. 메모리가 터지고 응답도 한없이 느려진다. 잘라서 가져오는 것이 페이징이다.OFFSET 기반 페이징원리DB에서 페이징을 구현하는 가장 기본적인 방법은 LIMIT과 OFFSET을 쓰는 것이다.SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 0; -- ..