HIBERNATE

2019-08-30
엔터티 클래스 이름으로 일반적으로 많이 사용하는 Order나 Group으로 만들 때가 있다. 하이버네이트 Hibernate 는 JPA 엔터티를 기준으로 데이터베이스 스키마를 자동 생성해 주는 기능 을 제공한다. 개발 초기에는 스키마가 자주 변경되기 때문에 이 기능을 사용하면 매우 편리하다.(설정값에 따라 테이블을 DROP 하기도 하니 사용 시 주의 필요) 하이버네이트는 스키마를 자동으로 생성할 때 기본적으로 엔터티 클래스 이름을 사용한다. 이때 클래스 이름이 데이터베이스 키워드/예약어(예. ORDER, GROUP, SELECT, WHERE 등)와 동일한 경우 스키마 생성에 실패한다....
2019-06-18
JPA Java Persistence API 로 애그리게잇 을 구현할 때면 흔히 루트 엔터티(전역 식별성을 지니며 주체로 쓰이는 엔터티)에 연관 엔터티 컬렉션을 매핑한다. 때때로 루트 엔터티는 연관 엔터티 컬렉션의 카운트를 제공해야 하는 경우가 있는데 여기서 성능 문제가 발생할 수 있다. 이 글은 연관 엔터티 컬렉션의 카운트를 구할 때 발생할 수 있는 성능 문제를 알아보고 이를 개선해 가는 과정을 소개한다. 부서 목록을 보여주는 화면 부서 목록과 함께 직원 수와 프로젝트 수를 보여주는 화면을 만든다고 가정해 보자....
2019-03-18
이 글은 도메인 주도 설계 Domain-Driven Design (이하 DDD)에서 말하는 값 객체 Value Object 가 무엇인지 알아보고 마이크로서비스 환경에서 값 객체를 활용하는 법을 다룬다. 값 객체란 무엇인가? 전자 상거래 사이트에서 상품을 받을 주소(배송지)를 입력하고 주문한다고 생각해 보자. 시스템에서 배송지를 임의로 수정한다면 상품은 정상적으로 배송되지 못할 것이다. 따라서 시스템은 배송지를 바뀌지 않게 다뤄야 한다. 배송지를 바뀌지 않게 클래스로 표현하면 아래와 같다. 바뀌지 않는다는 것은 생성 이후에는 변경되지 않음을 의미한다. 이를 구현하기 위해 생성자로만 객체를 생성할 수 있으며 속성을 변경하는 Setter가 없다....
2019-03-05
필자는 지난 글 전반부에서 도메인 주도 설계 Domain-Driven Design 에서 말하는 구조물 중 하나 인 조립물 AGGREGATE[1] 에 대해 이야기했다. 조립물을 구현하다 보면 다른 조립물을 참조해야 할 때가 있다. 이를 구현하는 방식은 크게 조립물의 루트 엔터티 Root Entity 객체를 참조(포인터) 하는 것과 식별자로 어디서든 쓸 수 있는 값을 사용하는 방법(ID)이 있다. 도메인 주도 설계 구현 Implementing Domain-Driven Design 의 저자 반 버논 Vernon, Vaughn 은 "ID로 다른 애그리게잇을 참조하라"...
2018-11-17
JPA Java Persistence API 는 엔티티에 변경이 일어나면 이를 감지하여 자동으로 데이터베이스에 반영한다. 이런 특징에 익숙지 않은 상태에서 스프링 데이터 Spring Data JPA 를 사용하다 보면 예상치 못한 지점에서 SQL update 구문을 보는 경우가 있다. 이 글은 JPA 변경 감지가 무엇이고 스프링 데이터 JPA와는 어떤 관계가 있는지 설명한다. JPA 변경 감지 Dirty Checking JPA는 엔티티 매니저 Entity Manager 가 엔티티를 조회/저장/삭제/수정한다. 엔티티 매니저의 API 를 살펴보면 조회(find), 저장(persist), 삭제(remove)는 제공하지만 이상하게도 수정 API는 찾아볼 수 없다. 그 이유는 엔티티 매니저가 엔티티가 변경이 일어나면 이를 자동 감지하여 데이터베이스에 반영하기 때문인데 이것을 변경 감지라고 한다. 간단한 JPA 코드로 확인해 보자....
2018-10-04
스프링 애플리케이션을 만들 때 스프링 프레임워크 Spring Framework 로 직접 구성하기보다는 스프링 부트 Spring Boot 를 사용하는 것이 더 간단하고 쉽다. 그리고 그 중심에는 스프링 부트 자동 설정 Auto-configuration 이 있다. 스프링 부트 자동 설정은 스프링 애플리케이션에 추가한 라이브러리(JAR)를 인식하여 관련 값을 스프링 부트 기본으로 설정해 준다. 따라서 스프링 부트를 사용하는 입장에서는 자동으로 해주는 부분 이외에 필요한 설정만 하면 되니 편하다. 최근...
2018-09-28
데이터베이스 테이블의 기본 키 Primary key 를 선정할 때 크게 2가지 선택지가 있는데 하나는 자연 키 Natural key 이고 또 하나는 대체 키 Surrogate key 이다. 자연 키는 전화번호, 이메일처럼 비즈니스적으로 의미 있는 키를 말하며, 대체 키는 비즈니스와 상관없이 임의로 만들어진 키를 말한다. JPA Java Persistence API 는 데이터베이스 테이블 대체 키를 기본 키로 자동 생성하는 기능을 지원한다. 사용법은 엔티티 Entity 클래스에 Id 어노테이션 과 함께 결합하여 GeneratedValue 어노테이션...
2018-08-22
JPA(하이버네이트)로 개발하다 보면 JPA가 자동으로 만들어 실행하는 SQL문을 확인하고 싶을 때가 있다. 이 글은 스프링 부트와 JPA를 함께 사용하는 환경에서 SQL문을 로깅 Logging 하는 방법을 소개한다. 예제 프로젝트 이해를 돕기 위해 간단한 스프링 부트 + JPA 예제 프로젝트를 만들고 SQL문 로깅을 추가해 보자. 예제 프로젝트는 스프링 부트에서 제공하는 부트스트랩 Bootstrap 도구인 SPRING INITIALIZR 로 프로젝트를 만든다. 의존성으로 JPA와 별도로 데이터베이스 설치하지 않고 사용할 수 있는...
2018-07-13
악평(?)이 자자하던 Java 날짜와 시간 Date and Time 라이브러리 [1] 는 Java 8 버전부터 완전히 새로워졌다. 이 글은 새로워진 Java 날짜와 시간(이하 Java8 날짜와 시간)을 스프링 부트 Spring Boot + JPA Java Persistence API ( Hibernate ) 환경에서 사용하는 방법을 다룬다. 기대와 다른 결과 예시 코드는 스프링 부트 1.5 으로 작성하였고 JPA (spring-boot-starter-data-jpa) 의존성을 추가하였다. [2] 데이터베이스에 저장될 Member 엔티티 Entitiy 는 아래와 같다. createdTimeAt, createdDateAt에 Java8 날짜와 시간 객체인 LocalDate, LocalDateTime을 사용하였다....
2018-01-20
이 글은 필자가 미디엄 Medium 에 쓴 2편의 글을 합하여 개정한 것이다. JPA Native Query 를 사용하다 보면 반환 값으로 엔터티 Entity 가 아닌 DTO Data Transfer Object 로 받고 싶을 때가 있다. 대표적인 경우가 통계이다. 통계 지표를 만들어낼 때 사용하는 SQL은 대부분이 복잡하고 길다. 문제는 SQL 실행 결과 Result Set 를 기존의 엔터티에 담기에는 형태가 맞지 않는데 있다. [1] 이 글은 JPA Native Query 반환 값으로 DTO로 만드는 여러 방법을 다룬다. 간단한 예제로 시작하기...
더보기