전체 글 (73) 썸네일형 리스트형 JPA 핵심 개념 및 동작 원리 정리 0. 개요 및 JPA 사용 이유JPA (Java Persistence API)란?자바 진영의 ORM(Object-Relational Mapping) 기술 표준 인터페이스 명세 (대표 구현체: Hibernate).자바 객체와 관계형 데이터베이스 테이블 간의 매핑을 자동으로 처리한다.JPA를 사용하는 핵심 이유:반복적인 CRUD SQL 제거:단순 등록/수정/조회/삭제 SQL을 직접 작성하지 않고 프레임워크가 대신 생성·실행하므로 개발 생산성이 향상된다.패러다임 불일치 해결:객체지향의 특징(참조를 통한 객체 탐색, 상속)과 RDB의 특징(외래키, 테이블 조인) 간의 구조적 차이를 프레임워크가 자동으로 연결한다.유지보수 용이성:테이블 컬럼이 추가되거나 변경될 때 수십 개의 SQL 및 매퍼 코드를 일일이 수정할 .. [Spring Boot/JPA] Querydsl 페이징, 동적 정렬 및 REST API 연동 1. JPA 페이징 동작 원리와 1:N 컬렉션 페이징의 한계1-1. N:1(다대일) 페이징 vs 1:N(일대다) 페이징N:1 페이징 (Member ➔ Team):회원을 조회하면서 팀을 페치 조인해도 데이터 행(Row) 수는 변하지 않는다.DB 레벨에서 LIMIT ? OFFSET ? 쿼리가 정상 실행되므로 페치 조인을 적용해도 안전하다.1:N 페이징 (Team ➔ members 컬렉션):팀은 1개인데 회원이 10명이면 조인 결과는 10줄로 뻥튀기된다.이때 DB 레벨에서 LIMIT 5를 걸면 팀 1개의 소속 회원 10명 중 5명만 잘려서 들어오는 데이터 왜곡이 발생한다.1-2. 하이버네이트의 In-Memory Paging (OOM 위험)하이버네이트는 데이터 왜곡을 방지하기 위해 DB 쿼리에서 LIMIT/OF.. [Spring Boot/JPA] Querydsl 동적 쿼리부터 단일 리포지토리 통합, 빌더 패턴 1. Querydsl 설정 및 QClass 생성 원리1-1. 의존성 설정 (Spring Boot 3/4 Jakarta 기준)dependencies { implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' annotationProcessor 'jakarta.persistence:jakarta.persistence-api'}./gradlew compileJava 실행 시 build/generated/sources/an.. [SQL] 윈도우 함수 LAG()와 LEAD() 정리 (원리부터 게시판 이전글/다음글 구현까지) 데이터베이스에서 현재 행을 기준으로 바로 이전 행이나 다음 행의 값을 가져와야 하는 경우(EX: 게시판의 이전글/다음글 조회)이때 서브쿼리나 복잡한 셀프 조인(Self Join) 없이 SQL 표준 함수로 깔끔하게 해결할 수 있는 윈도우 함수가 바로 LAG()와 LEAD()1. LAG()와 LEAD()란?LAG() (지체되다, 뒤처지다)ORDER BY로 정렬된 순서에서 현재 행의 물리적 바로 윗 행(Index - 1)의 값을 가져옵니다.LEAD() (이끌다, 앞서가다)ORDER BY로 정렬된 순서에서 현재 행의 물리적 바로 아랫 행(Index + 1)의 값을 가져옵니다.2. 기본 문법 및 파라미터LAG(컬럼, [오프셋], [기본값]) OVER ([PARTITION BY 그룹컬럼] ORDER BY 정렬컬럼.. PowerShell 터미널에 Git 브랜치 표시하기 (posh-git) 1단계: 스크립트 실행 권한 허용PowerShell에서 외부 스크립트 모듈을 실행할 수 있도록 권한을 설정합니다.Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force2단계: posh-git 모듈 설치Git 상태를 프롬프트에 연동해 주는 posh-git 모듈을 설치합니다.Install-Module posh-git -Scope CurrentUser -Force3단계: PowerShell 프로필에 자동 로드 등록터미널을 실행할 때마다 모듈이 자동 로드되도록 프로필($PROFILE)에 등록합니다.if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -F.. [Git] git push 할 때마다 비밀번호/인증을 물어보는 현상 해결 방법 (Windows) [Git] git push 할 때마다 비밀번호/인증을 물어보는 현상 해결 방법 (Windows)Git repository에 'git push'를 진행할 때 매번 계정 인증(Username / Password / Token)을 요청하여 불편한 경우가 있습니다. 어떤 프로젝트는 인증 없이 바로 push가 되고, 어떤 프로젝트는 매번 인증을 요구한다면 Git 설정('credential.helper')의 차이 때문입니다.1. 원인 확인 명령어현재 설정된 Git 자격 증명 관련 설정을 아래 명령어로 확인합니다.# 전체 git 설정 및 파일 출처 확인git config --list --show-origin# 자격 증명 헬퍼(credential.helper) 설정 확인git config --show-origin --.. [Tomcat] 왜 개발/운영 서버에서는 META-INF/context.xml 설정이 무시될까? (컨텍스트 로딩 메커니즘 분석) 웹 개발을 진행하다 보면 로컬 환경에서는 분명히 잘 동작하던 설정이 개발/운영 서버에서 안되는 현상을 겪곤 합니다.이번 글에서는 대용량 정적 파일(엑셀, PDF, 이미지 등)을 외부 디렉터리에 두고 톰캣의 가상 경로(Virtual Path)로 연결할 때 발생하는 톰캣 컨텍스트 로딩 메커니즘과 우선순위, 그리고 환경별 동적 분기 전략을 다뤄봅니다.1. 문제의 발단: 외부 파일 가상 마운트프로젝트 빌드 시 WAR 파일(웹 애플리케이션 압축 파일)의 크기를 줄이고, 대용량 파일(엑셀, PDF 등)을 서버 외부 디렉터리에 저장한 뒤, 웹 URL 경로(/open-data/big-file.xlsx)로 다운로드할 수 있도록 연결(Mount)하는 아키텍처를 구성했습니다.우선 pom.xml에 Maven 빌드 프로필(Pr.. [Git] git status 한글 깨짐 및 8진수 이스케이프(`\355...`) 표기 해결 방법 [Git] git status 한글 깨짐 및 8진수 이스케이프(\355...) 표기 해결 방법Git을 사용하다가 git status나 git diff 명령어를 실행할 때 한글 파일명이 정상이 아니라 \355\217\254\354... 형태로 깨져서 출력되는 현상을 겪어보신 적 있으신가요?이 글에서는 해당 현상이 발생하는 원인과 간단한 명령어 한 줄로 해결하는 방법을 소개합니다.1. 문제 상황git status 실행 시 한글 파일명이 다음과 같이 8진수(Octal) 이스케이프 코드로 표기됩니다.Untracked files: (use "git add ..." to include in what will be committed) "src/main/webapp/dist/images/portal/co.. [Tomcat] Spring MVC 대신 Tomcat 가상 디렉터리를 활용한 대용량 정적 리소스 서빙 1. 도입: 왜 대용량 파일 서빙이 웹 서버의 병목이 되는가?웹 애플리케이션을 운영하다 보면 통계 엑셀 데이터, PDF 보고서 등 수십~수백 메가바이트(MB)에 달하는 대용량 정적 파일을 다운로드 서비스로 제공해야 하는 경우가 있습니다.이때 보통 구현의 편의성을 위해 Spring MVC의 ResourceHandlerRegistry에 경로를 등록하거나, Controller에서 Java File I/O를 사용해 파일 스트림을 HTTP Response OutputStream에 직접 Write하는 방식을 취하곤 합니다. 하지만 이 방식은 두 가지 치명적인 성능 문제를 동반합니다.JVM 힙(Heap) 메모리 부하와 빈번한 GC: 파일 데이터를 바이트 배열로 읽어 메모리에 올리는 과정에서 다량의 임시 객체가 생성되.. OCI Ubuntu 호스트명 변경 및 고정 방법 [확인 1] 현재 설정 상태 조회작업 전에 현재 호스트명과 설정값을 확인합니다.# 1. 현재 시스템 호스트명 확인hostnamectl# 2. 호스트 파일 내용 확인cat /etc/hosts | grep 127.0.1.1# 3. cloud-init의 호스트명 보존 설정 상태 확인cat /etc/cloud/cloud.cfg | grep preserve_hostname[수정] 호스트명 변경 및 고정 작업실제 설정을 수정하고 재부팅합니다.# 1. 새 호스트명 설정 (원하는 이름으로 변경하여 실행)sudo hostnamectl set-hostname # 2. hosts 파일의 기존 호스트명을 새 이름으로 변경sudo vi /etc/hosts# (127.0.1.1 옆에 있는 기존 호스트명을 새 호스트명으로 수정 후.. 이전 1 2 3 4 ··· 8 다음