본문 바로가기
Spring|Spring-boot/Spring Batch

Spring Batch JpaItemWriter

by oncerun 2021. 3. 6.
반응형

JpaItemWriter는 JPA EntityManager를 이용해서 Entity를 DB에 write 해줍니다.

 

jpa에 관한 설명은 깊게 하지 않고 간단히만 하겠습니다.

 

엔티티 매니저는 엔티티 매니저 팩토리에 생성합니다. 자바를 직접 다루지 않고 스프링을 사용하면 빈으로 등록이 되어 있어 직접 생성해 줄 필요가 없습니다. 이 엔티티 내부에는 영속성 콘텍스트가 존재합니다. 이 영속성 컨텍스는 엔티티 매니저를 통해서 접근할 수 있습니다.

 

영속성 콘텍스트는 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스와 같습니다.

1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 지연 로딩 기능을 사용할 수 있는 것도 영속성 콘텍스트 때문입니다.

 

이 저장된 엔티티는 플러시 시점에 데이터베이스에 반영되며 보통 커밋할 때 플러시가 발생합니다.

이 영속성 콘텍스트가 관리하는 엔티티를 영속 상태의 엔티티라 합니다. 만약 영속성 콘텍스트가 엔티티를 관리하지 못하면 준영속 상태의 엔티티가 되며 merge를 통해 다시 영속 상태가 될 수 있습니다. persist 하면 엔티티 매니저에 등록하는 걸 의미합니다.

 

 

다만 batch를 사용할 때 step내부에서는 팩토리를 생성해 줘야 합니다.

또한 entity라는 어노테이션을 엔티티 클래스에 붙여줘야 인식될 수 있습니다.

@Getter
@Entity
public class Person {

    @Id
    private int id;
    private String name;
    private String age;
    private String address;

    public Person() {

    }

    public Person(int id, String name, String age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }


}

 

 

이후 팩토리를 스텝에 추가해주고 job에 스탭을 넣어서 실행합니다.

    private ItemWriter<Person> jpaItemWriter() throws Exception {
        JpaItemWriter<Person> itemWriter = new JpaItemWriterBuilder<Person>()
                .entityManagerFactory(entityMangerFactory)
                .build();

        itemWriter.afterPropertiesSet();
        return itemWriter;


    }

 

 

show_sql =true 설정으로 실행된 sql문을 확인할 것입니다.

Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: select person0_.id as id1_0_0_, person0_.address as address2_0_0_, person0_.age as age3_0_0_, person0_.name as name4_0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)
Hibernate: insert into person (address, age, name, id) values (?, ?, ?, ?)

 

이상하게 insert와 select문이 동시에 10개씩 실행된 것을 확인할 수 있습니다.

 

이것은 내부적으로 merge()로 실행되기 때문인데요 이 merge가 실행되면 다음과 같은 로직이 실행됩니다.

 

우선 엔티티 매니저의 1차 캐시를 확인하고 해당 엔티티가 존재하지 않으면 db에서 조회를 합니다. 이경우 존재하지 않으면 새로운 엔티티를 생성합니다. 쉽게 말하면 merge는 save or update를 수행합니다.

 

그럼 insert만 수행하도록 변경하겠습니다.

 

id를 자동 생성하도록 getItem를 수정해주고

Entity클래스에 pk값을 설정해주어야 합니다.

사실 키 생성 전략은 스프링 부트가 2.0 이상 버전이라면 상관없지만 그 이하라면 id.new_generator_mappings를 true로 설정해 주어야 한다.

 


@NoArgsConstructor
@Getter
@Entity
public class Person {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String age;
    private String address;


    public Person(String name, String age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }


}

키 생성 전략을 데이터베이스에 위임했습니다.

 

이후 Reader에서 생성하는 person객체도 id를 직접 생성하지 않도록 고쳐주었습니다.

 private List<Person> getItems() {
        List<Person> items = new ArrayList<>();

        for (int n = 0; n < 10; n++) {
            items.add(new Person("test_name" + n,"test age", "test address"));
        }
        return items;
    }

이후 writer에서 userPersist를 설정해 줍니다.

Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)
Hibernate: insert into person (address, age, name) values (?, ?, ?)

이제 insert문만을 하는 것을 보실 수 있습니다.

 

사실 id를 직접할당하지 않는다면 usePersist를 true로 설정하지 않아도 됩니다.

왜냐하면 jpa에서 id를 할당하도록 설정했고 그렇기에 jpa는 merge대상이 아니라는 것을 판별해 select 하지 않고 바로 insert문을 날리기 때문입니다.

다만 기본 키를 직접 할당을 하는 경우에는 고려해 볼만한 성능 개선입니다.

반응형

'Spring|Spring-boot > Spring Batch' 카테고리의 다른 글

Spring Batch about 15 minutes  (0) 2023.05.14
Batch란  (1) 2023.05.14
Spring Batch JdbcBatchItemWriter  (0) 2021.03.06
Spring Batch ItemWriter  (0) 2021.03.06
Spring Batch ItemReader  (0) 2021.03.06

댓글