1. @ColumnDefault만 붙이면 자동으로 default 값이 저장될 줄 알았다고요 User라는 엔티티가 있다. 기본적인 필드들이 있다. package com.spring.dozen.auth.domain.entity;import com.spring.dozen.auth.domain.enums.Role;import jakarta.persistence.*;import lombok.*;import org.hibernate.annotations.ColumnDefault;@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@AllArgsConstructor(access = AccessLevel.PRIVATE)@Builder(access = AccessLeve..
JPA
1. JPA에서 ID 생성 전략 JPA에서는 엔티티의 기본 키(ID)를 생성하기 위한 여러 전략을 제공한다. 2. IDENTITY 전략 IDENTITY 전략은 기본 키 생성을 데이터베이스에 위임한다.MySQL에서는 AUTO_INCREMENT와 같은 데이터베이스 자동 증가 컬럼을 사용한다.엔티티가 영속화될 때 즉시 INSERT SQL이 실행되어 ID 값을 얻는다.엔티티가 영속화될 때 즉시 INSERT SQL이 실행된다는 의미는 영속성 컨텍스트의 쓰기 지연이 적용되지 않는다는 것이다. 영속성 컨텍스트는 트랜잭션이 끝날 때 까지 실행될 SQL을 쓰기 지연 저장소에 모아두고, 커밋 시점에 데이터베이스로 모아둔 쿼리를 날린다. 하지만, IDENTITY 전략을 사용한 경우, 식별자가 데이터베이스에서 할당이 되기 때..
1. JPA의 N + 1 문제란?N + 1 문제는 연관된 엔티티를 조회할 때 발생하는 성능 이슈를 말한다. 연관 관계가 설정된 엔티티를 조회할 경우에, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상이다. 다시 말하면, 조회시 1개의 쿼리를 생각하고 설계했으나 예상치 못한 쿼리가 N개 더 발생하는 문제이다. 2. 즉시 로딩(Eager)// User.java@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)private Set orders = emptySet();// Order.java@ManyToOne(fetch = FetchType.EAGER)private Order order; 즉시 로딩이란 연관된 엔티티를 조인해서 가져오는 것을..
1. Entity ManagerEntity Manager는 JPA의 핵심 구성 요소로, 엔티티 인스턴스의 생명주기를 관리하는 API이다. Entity Manager는 데이터베이스와 Java 객체 간의 중개자 역할을 한다.JPA에서 엔티티는 Persistence Context에서 관리되어야 하는데,Persistence Context를 도와주는 것이 Entity Manager다. 1 - 1. 주요 기능1 - 1 - 1. 엔티티 생명주기 관리엔티티의 생성, 수정, 삭제 등 생명주기 전반을 관리한다.엔티티는 비영속, 영속, 준영속, 삭제 상태가 될 수 있다.persist, merge, remove, close 메서드를 이용하여 엔티티의 상태를 변경할 수 있다. 1 - 1 - 2. Persistence Conte..
1. ddl-auto 옵션ddl-auto 옵션은 Spring Boot Application에서 Hibernate와 같은 JPA 구현체를 사용할 때 데이터베이스 스키마 관리를 제어하는 설정이다. 이 옵션은 application.properties, application.yml 같은 설정 파일에서 설정할 수 있다. ddl-auto 옵션에는 none, validate, update, create, create-drop 등이 있다. 2. 각 옵션들 정리2 - 1. none데이터베이스 스키마와 관련된 어떠한 작업도 수행하지 않는다.데이터베이스 스키마를 수동으로 관리하고 싶을 때 유용하다.프로덕션 환경에서 주로 사용된다. 2 - 2. validate애플리케이션이 시작될 때, 엔티티 매핑이 데이터베이스 스키마와 일치..
0. JpaMetamodelEntityInformation.isNew(T entity)@Overridepublic boolean isNew(T entity) { if(versionAttribute.isEmpty()) || versionAttribute.map(Attribute::getJavaType).map(Class::isPrimitive).orElse(false)) { return super.isNew(entity); } BeanWrapper wrapper = new DirectFieldAccessFallbackBeanWrapper(entity); return versionAttribute.map(it -> wrapper.getPropertyValu..
1. 문제 상황배달 앱을 만드는 팀프로젝트 중 요구사항으로모든 테이블에 생성한 사람, 생성날짜, 업데이트한 사람, 업데이트날짜를 기록하라는 것이 있었다.이것을 구현하기 위해 JpaAuditing, AuditorAware를 활용하여 통해,해당 테이블에 변경사항이 있을 시 현재 로그인 중인 사용자의 id를 자동으로 기록되도록 구현하려고 했다.참고한 자료는 아래 블로그 글이다.https://javacpro.tistory.com/85 [Spring Boot] JPA, AuditorAware 사용하여 사용자정보 자동 입력1. Config 생성 @EnableJpaAuditing 어노테이션을 추가하여 Annotation 을 사용하여 Audit 활성화 @Configuration @EnableJpaAuditing pub..