| En

JPA Lazy Loading과 Eager Loading 성능 비교

로딩 전략의 역사와 필요성 ORM(Object-Relational Mapping) 프레임워크는 객체지향 프로그래밍과 관계형 데이터베이스 사이의 불일치를 해결하기 위해 등장했으며, 이 과정에서 연관관계를 가진 엔티티들을 어떻게 효율적으로 로딩할 것인가라는 문제가 중요한 과제로 대두되었다. 초기 ORM 구현체들은 모든 연관 엔티티를 즉시 로딩하는 방식을 사용했으나, 이는 불필요한 데이터까지 메모리에 적재하여 성능 저하를 일으켰고, Hibernate는 이를 해결하기 위해 프록시 기반의 지연 로딩 메커니즘을 도입했다. Hibernate는 2001년 처음 공개된 이후 로딩 전략을 지속적으로 개선해왔으며, 초기 버전에서는 단순한 지연 로딩만 지원했지만, 이후 버전에서는 fetch join, batch fetching, subselect fetching 등 다양한 최적화 기법을 추가했다. 이러한 기능들은 JPA(Java Persistence API) 1.0 표준이 2006년에 공개되면서 표준 스펙에 포함되었고, JPA 2.0(2009년)과 JPA 2.1(2013년)을 거치면서 @EntityGraph와 같은 선언적 페치 전략이 추가되어 더욱 세련된 방식으로 연관 엔티티 로딩을 제어할 수 있게 되었으며, 현재는 JPA 표준과 Hibernate 구현체가 함께 발전하며 개발자에게 다양한 선택지를 제공하고 있다. ...

2024년 6월 8일 · 7 분 · 1339 단어 · In-Jun

JPA 엔티티 생명주기

엔티티 생명주기란 JPA(Java Persistence API)에서 엔티티의 생명주기는 엔티티 객체가 생성되고 소멸할 때까지 거치는 일련의 상태 변화를 의미하며, 이 개념은 2006년 Java EE 5와 함께 발표된 JPA 1.0 명세에서 처음 정의되었고, Hibernate의 Session 개념을 표준화한 영속성 컨텍스트(Persistence Context)를 중심으로 설계되었다. 엔티티가 영속성 컨텍스트에 의해 관리되는지 여부와 데이터베이스와의 동기화 상태에 따라 비영속(Transient), 영속(Managed), 준영속(Detached), 삭제(Removed)의 4가지 상태로 구분되며, 각 상태는 EntityManager의 persist(), merge(), detach(), remove() 메서드를 통해 전이된다. 엔티티의 상태를 올바르게 이해하는 것은 JPA를 효과적으로 사용하고 데이터 일관성을 유지하며 성능을 최적화하는 데 필수적인데, 이는 영속성 컨텍스트가 제공하는 1차 캐시, 변경 감지(Dirty Checking), 쓰기 지연(Write-Behind) 등의 기능이 모두 엔티티의 영속 상태에서만 작동하기 때문이며, 상태를 잘못 이해하면 LazyInitializationException이나 EntityNotFoundException 같은 예외가 발생하거나 의도치 않은 데이터 손실이 발생할 수 있다. ...

2024년 6월 8일 · 7 분 · 1423 단어 · In-Jun

JPA EntityManager

EntityManager의 역사와 개념 EntityManager는 Java Persistence API(JPA)의 핵심 인터페이스로, 2006년 JSR 220의 일부로 발표된 EJB 3.0 명세에서 처음 정의되었으며, Hibernate의 Session 인터페이스를 표준화하여 벤더 독립적인 영속성 관리 API를 제공하기 위해 설계되었다. Hibernate를 개발한 Gavin King이 2001년에 도입한 Session 개념은 데이터베이스 연결을 추상화하고 엔티티 객체의 상태를 추적하는 혁신적인 접근 방식이었는데, JPA는 이 아이디어를 표준화하여 EntityManager라는 이름으로 재정립하고 모든 JPA 구현체(Hibernate, EclipseLink, OpenJPA)에서 동일한 인터페이스를 사용할 수 있게 했다. EntityManager가 해결하는 핵심 문제는 객체지향 프로그래밍의 객체와 관계형 데이터베이스의 테이블 간의 패러다임 불일치(Object-Relational Impedance Mismatch)로, 개발자가 SQL을 직접 작성하지 않고도 객체 중심의 코드로 데이터베이스 작업을 수행할 수 있게 하며, 1차 캐시, 변경 감지, 쓰기 지연 같은 최적화 기능을 자동으로 제공한다. EntityManager는 영속성 컨텍스트(Persistence Context)라는 논리적 공간을 관리하는데, 이 공간은 Martin Fowler가 정의한 Identity Map 패턴과 Unit of Work 패턴을 구현하여 동일 트랜잭션 내에서 같은 식별자를 가진 엔티티의 동일성을 보장하고, 변경된 엔티티를 추적하여 트랜잭션 종료 시 일괄적으로 데이터베이스에 반영한다. ...

2024년 6월 7일 · 6 분 · 1230 단어 · In-Jun

Spring Data JPA와 JPA 주요 차이점

JPA의 탄생 배경과 역사 JPA(Java Persistence API)는 2006년 5월 11일 자바 커뮤니티 프로세스 JSR 220을 통해 EJB 3.0 스펙의 일부로 처음 발표되었으며, 기존 EJB 2.x의 엔티티 빈(Entity Bean)이 가진 복잡성과 무거운 구조, 컨테이너 의존성 등의 문제를 해결하기 위해 Hibernate의 핵심 개념들을 표준화한 것이다. EJB 2.x의 엔티티 빈은 홈 인터페이스(Home Interface), 원격 인터페이스(Remote Interface), 빈 클래스(Bean Class)를 모두 작성해야 하고 복잡한 XML 디스크립터를 관리해야 했으며, 이로 인해 개발 생산성이 크게 떨어지고 테스트가 어려웠다. ...

2024년 6월 7일 · 7 분 · 1309 단어 · In-Jun

Docker의 Namespace와 Cgroup

Linux 컨테이너 기술은 2002년 커널 2.4.19에서 mount namespace가 처음 도입된 이래로 꾸준히 발전하여 현대 클라우드 인프라의 핵심 기반이 되었으며, 이 기술의 중심에는 프로세스 격리를 담당하는 Namespace와 리소스 제어를 담당하는 Cgroups(Control Groups)가 있다. Docker, Kubernetes, Podman 등 모든 컨테이너 런타임은 이 두 가지 커널 기능을 활용하여 가상 머신보다 훨씬 가볍고 빠른 격리 환경을 제공하며, 이를 이해하는 것이 컨테이너 기술을 깊이 파악하는 첫걸음이다. 컨테이너 기술의 역사적 배경 왜 컨테이너가 필요한가? 전통적인 가상 머신은 하드웨어 전체를 에뮬레이션하여 완전한 운영체제를 실행하기 때문에 리소스 오버헤드가 크고 시작 시간이 길다. 컨테이너는 호스트 커널을 공유하면서도 프로세스 수준에서 격리를 제공하여, 밀리초 단위의 빠른 시작과 최소한의 리소스 사용으로 동일한 격리 효과를 달성한다. ...

2024년 6월 5일 · 6 분 · 1268 단어 · In-Jun

MVC 패턴

MVC 패턴의 탄생과 역사적 배경 MVC 패턴은 1979년 제록스 팰러앨토 연구소(Xerox PARC)에서 스몰토크(Smalltalk-76) 프로젝트를 진행하던 노르웨이 컴퓨터 과학자 Trygve Reenskaug에 의해 처음 고안되었으며, 이는 개인용 컴퓨터의 태동기에 그래픽 사용자 인터페이스(GUI)를 혁신적으로 발전시키려는 시도의 일환이었다. 당시 제록스 PARC는 현대 컴퓨팅의 많은 개념들을 개척한 곳으로, 이더넷, 레이저 프린터, 객체 지향 프로그래밍 등이 이곳에서 탄생했으며, Reenskaug는 사용자가 복잡한 데이터 구조를 효과적으로 제어하고 시각화할 수 있는 방법을 모색하던 중 데이터(Model), 표현(View), 제어(Controller)의 분리라는 아이디어를 착안했다. ...

2024년 6월 5일 · 8 분 · 1576 단어 · In-Jun

HTTP 상태 코드

HTTP 상태 코드(HTTP Status Code)는 클라이언트가 서버에 요청을 보낸 후 서버가 해당 요청의 처리 결과를 알려주기 위해 반환하는 세 자리 숫자로 구성된 표준화된 응답 코드이며, 이 코드는 웹 브라우저, API 클라이언트, 검색 엔진 등 모든 HTTP 기반 통신에서 요청의 성공 여부, 리다이렉션 필요성, 클라이언트나 서버 측 오류 발생 여부를 명확하게 전달하는 핵심적인 역할을 수행하고, RESTful API 설계에서 적절한 상태 코드의 선택은 API의 직관성과 개발자 경험을 크게 좌우하는 중요한 요소이다. HTTP 상태 코드란? ...

2024년 6월 5일 · 16 분 · 3208 단어 · In-Jun

Spring MVC Dispatcher Servlet

디스패처 서블릿이란? 디스패처 서블릿은 스프링 MVC의 핵심 컴포넌트로, 클라이언트의 모든 HTTP 요청을 단일 진입점에서 받아 적절한 컨트롤러로 전달하고, 컨트롤러가 반환한 결과를 View로 렌더링하여 응답하는 Front Controller 패턴의 구현체다. 이는 웹 애플리케이션에서 하나만 존재하며, 모든 요청을 중앙에서 처리함으로써 공통 로직을 효율적으로 관리하고 개발자가 비즈니스 로직에 집중할 수 있도록 한다. DispatcherServlet의 역사와 발전 스프링 MVC는 2004년 Spring Framework 1.0과 함께 등장했으며, 당시 J2EE의 복잡한 서블릿 개발 방식에 대한 대안으로 Front Controller 패턴을 구현한 DispatcherServlet을 핵심으로 하는 웹 프레임워크로 자리 잡았다. 초기에는 XML 기반 설정을 통해 서블릿을 등록하고 매핑했으나, Servlet 3.0 이상부터는 WebApplicationInitializer를 통한 자바 설정이 가능해졌으며, Spring Boot의 등장으로 인해 자동 설정(Auto Configuration)이 도입되어 개발자가 별도의 설정 없이도 즉시 사용할 수 있게 되었다. ...

2024년 6월 5일 · 7 분 · 1317 단어 · In-Jun

Spring Interceptor

스프링 인터셉터의 개념과 역사 스프링 인터셉터(Spring Interceptor)는 2006년 Spring Framework 2.0에서 처음 도입된 기능으로, MVC 아키텍처에서 컨트롤러가 요청을 처리하기 전, 후, 그리고 뷰 렌더링 완료 후의 시점에 개입하여 공통 기능을 수행하는 메커니즘이며, HandlerInterceptor 인터페이스의 preHandle, postHandle, afterCompletion 세 가지 메서드를 통해 요청의 전처리와 후처리를 수행하고, 인증, 로깅, 실행 시간 측정, 공통 데이터 설정 같은 횡단 관심사(cross-cutting concerns)를 비즈니스 로직과 분리하여 처리할 수 있도록 설계되었다. 스프링 인터셉터가 서블릿 필터와 구분되는 핵심적인 차이점은 동작하는 계층에 있는데, 서블릿 필터가 서블릿 컨테이너(Tomcat, Jetty 등) 레벨에서 DispatcherServlet에 도달하기 전에 실행되는 반면, 인터셉터는 스프링 컨텍스트 내부에서 DispatcherServlet이 핸들러 매핑을 통해 컨트롤러를 찾은 후 실제 컨트롤러를 호출하기 전후에 실행되므로, 스프링이 제공하는 의존성 주입, 빈 관리, 예외 처리 등의 기능을 완전히 활용할 수 있다는 장점이 있다. ...

2024년 6월 4일 · 5 분 · 988 단어 · In-Jun

서블릿 Filter

서블릿 필터의 개념과 역사 서블릿 필터(Servlet Filter)는 2001년 발표된 Servlet 2.3 명세에서 처음 도입된 기능으로, 서블릿이 HTTP 요청을 처리하기 전과 응답을 클라이언트에게 보내기 전에 요청과 응답을 가로채어 전처리(preprocessing)와 후처리(postprocessing)를 수행하는 자바 컴포넌트이며, 이 기능의 도입으로 인증, 로깅, 문자 인코딩, 데이터 압축 같은 횡단 관심사(cross-cutting concerns)를 비즈니스 로직과 분리하여 재사용 가능한 형태로 구현할 수 있게 되었고, Chain of Responsibility 디자인 패턴을 기반으로 여러 필터를 체인 형태로 연결하여 순차적으로 실행할 수 있는 구조를 제공한다. ...

2024년 6월 4일 · 5 분 · 919 단어 · In-Jun
[email protected]