Spring Data 5

[JPA 내부 동작 원리: 엔티티 매니저, 영속성 컨텍스트 및 장점] 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 (3)

이번에는 JPA의 내부 동작에 대한 이론에 대해서 공부해보도록 하자. JPA를 이해하려면 영속성 컨텍스트에 대한 이해가 반드시 필요하다. JPA에서 가장 중요한 2가지를 꼽으라면 아래 둘을 꼽는다. 객체와 관계형 데이터베이스 매핑하기(Object Relational Mapping, ORM) 영속성 컨텍스트 이번에는 영속성 컨텍스트에 대해 얘기해보자. 엔티티 매니저 팩토리 & 엔티티 매니저 영속성 컨텍스트를 이해하려면 먼저 엔티티 매니저 팩토리와 엔티티 매니저에 대해 이해해야 한다. 엔티티 매니저 팩토리(Entity Manager Factory): 웹 어플리케이션에 하나만 존재하며, 고객의 요청이 들어올 때마다 엔티티 매니저를 생성하는 역할을 한다. 엔티티 매니저(Entity Manager): 내부적으로 ..

Spring Data 2023.01.12

[JPA CRUD & JPQL] 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 (2)

본격적으로 JPA 실습에 들어가보자. 해당 예제는 Github(링크)에 올려뒀다. (아래는 김영한님 강의인 자바 ORM 표준 JPA 프로그래밍 - 기본편에서 공부한 내용을 정리한 것입니다.) H2 데이터베이스 설치 & 실행 해당 예제를 작업하기 위해서는 H2 데이터베이스가 필요하다. H2는 실습용으로 쓰기 위한 인메모리 DB이다. 링크(클릭)를 누르면 해당 페이지로 이동할 수 있다. 우리는 1.4.199 버전을 사용할 것이니 해당 버전을 다운받도록 하자. 프로젝트 생성 이어서 프로젝트를 생성한다. IntelliJ 상단 바에서 File → New → Project를 클릭하면 아래와 같은 창이 뜬다. 우리 프로젝트 스펙은 위와 같이 설정하도록 하자. 자바 8 이상 Maven(강의에서 Maven을 이용했기에 ..

Spring Data 2023.01.05

[JPA와 모던 자바 데이터 저장 기술] 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 (1)

SQL 중심적인 개발이 왜 문제냐? 애플리케이션을 만들 때는 비즈니스 도메인의 복잡성을 단순화하기 위해 Java, Python과 같은 객체 지향 언어를 사용한다. 반면 데이터베이스를 다룰 때는 객체 지향과는 전혀 다른 패러다임을 적용한다. 대표적으로 관계형 DB를 생각해보자. Oracle, MySQL 등을 사용한다. 그런데 애플리케이션은 결국 서버와 DB로 구성되어 있고, 서버에서 다루는 데이터는 결국 DB로 저장된다. 그런데 이때 데이터를 서버에서는 데이터를 객체로 감싸지만, 이렇게 객체로 관리하려면 관계형 DB의 도움이 반드시 필요하다. 즉, 지금 시대는 객체를 관계형 DB에서 관리한다고 봐도 과언이 아니다. 문제는 관계형 DB에서 데이터를 가져와 객체로 관리하려면 반드시 SQL문을 작성해야 한다는 ..

Spring Data 2023.01.01

@Transactional은 만능이 아닙니다 -2 트랜잭션의 격리성과 lock

Introduction 지난 시간에는 트랜잭션의 개념과 어떨 때 트랜잭션을 사용해야 하는지에 대해서 배웠다. 그런데 1부에서 얘기했던 것과 같이, @Transactional을 제거했더니 Exception이 발생했다. 이 문제는 어떻게 해결할 수 있을까? 다시 코드를 살펴보도록 하자. Code UserController @PutMapping("/user/{Id}") public void moveDateTime(@PathVariable long userId) { userService.moveDateTime(userId); } UserService public void moveDateTime(long userId) { Timestamp targetDateTime = Timestamp.valueOf(ZonedD..

Spring Data 2022.09.25

@Transactional은 만능이 아닙니다 - 1: Transaction의 개념과 트레이드오프

Introduction 현재 작업 중인 프로젝트와 관련해 올렸던 PR에서 아래와 같은 리뷰를 받았다. Can you do it without getting @Transactional? @Transactional is not cheaper. Please think about why we use Transaction on RDBMS DB. 왜 이런 말이 나오게 됐을까? 먼저 원래 코드부터 살펴보자. 유저의 필드 중 하나인 날짜를 특정 시점으로 수정하는 API이다. 내부 코드를 공개할 수 없기에 간단한 형태로 수정했다. Code UserController @PutMapping("/user/{Id}") public void moveDateTime(@PathVariable long userId) { userSer..

Spring Data 2022.09.16