Spring Boot 3 버전에서 spring-data-jpa를 사용하여 테이블에 데이터를 넣는 방법에 대해 설명드리겠습니다.
테이블, Repository 준비
insert 기능을 실습할 엔티티와 테이블을 준비합니다.
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class InsertTestEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(nullable = false)
private String name;
private Integer birthYear;
}
insert_test_entity라는 엔티티를 생성했습니다.
@Entity 어노테이션이 선언되어있으면 jpa의 ddl-auto 옵션이 create나 update라면 서버 실행 시 자동으로 테이블이 생성됩니다.
// Hibernate에 의해 생성된 엔티티 테이블
[Hibernate]
create table insert_test_entity (
id bigint not null auto_increment,
birth_year integer,
name varchar(255) not null,
primary key (id)
) engine=InnoDB
엔티티를 생성한 다음, 리포지토리 인터페이스를 생성합니다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface InsertTestRepository extends JpaRepository<InsertTestEntity, Long> {
}
리포지토리로 사용할 인터페이스를 생성한 다음 JpaRepository 인터페이스를 상속받습니다.
JpaRepository의 <>안에는 엔티티 클래스와 그 엔티티에서 사용하는 PK 변수의 타입을 넣어주면 됩니다.
이러면 준비가 끝납니다.
데이터 등록 예제
spring-data-jpa로 데이터를 등록하려면 다음과 같이 사용하면 됩니다.
@Autowired
private InsertTestRepository repository;
...
// PK는 null이어야 insert 할 수 있음
InsertTestEntity entity = new InsertTestEntity(null, "name", 1999);
InsertTestEntity saveEntity = repository.save(entity);
리포지토리 의존성을 추가한 다음, 엔티티 객체를 생성하고 리포지토리에 있는 save 메소드를 사용하면 됩니다.
주의할 점은 PK에 해당하는 변수는 null이어야 합니다.
만약 엔티티에 PK 값이 있다면 PK 값으로 조회를 해서 수정하는 과정을 거치기 때문에 등록이 되지 않습니다.
// Hibernate에 의해 생성된 insert 쿼리
[Hibernate]
insert
into
insert_test_entity
(birth_year, name)
values
(?, ?)
save 메소드를 실행하면 JPA가 insert 쿼리를 생성해서 데이터 등록을 수행합니다.
에러 발생 케이스
Field '<필드명>' doesn't have a default value
데이터베이스에서 발생하는 오류 메시지입니다.
해당 메시지는 <필드명>에 해당하는 변수에 기본값이 없다는 의미입니다.
이 오류는 컬럼이 not null로 설정되어있는데 기본값이 없을 때 발생합니다.
예를 들면, PK 컬럼은 기본적으로 not null로 설정되어있습니다.
그런데 PK가 null로 들어오게 되면 해당 오류가 발생합니다.
그래서 해당 컬럼에 auto_increment같은 옵션을 추가해주면 됩니다.
JPA로 auto_increment를 설정하고 싶다면 설정하고싶은 변수에 @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 추가하면 됩니다.
org.springframework.orm.jpa.JpaSystemException: Identifier of entity '<엔티티 클래스명>' must be manually assigned before calling 'persist()'
엔티티에 대한 식별자(identifier)가 없다는 의미입니다.
엔티티를 생성할 때 PK로 설정한 변수의 값이 null일 때 발생할 수 있습니다.
이 오류를 막기 위해서는 식별자 변수에 @GeneratedValue 어노테이션을 추가해서 식별자 생성 규칙을 설정해야 합니다.
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
읽으면 좋은 글
[Java] Spring Boot 3 JPA update 데이터 수정 사용법 및 예제