[Spring-batch] JpaItemWriter

오늘내일·2024년 6월 27일
0

JpaItemWriter에 대해 살펴보자.

JpaItemWriter

  • JpaItemWriter 객체 구조는 아래와 같다.

    • Jpa 관련 ItemReader 구현체보다 구조는 간단하다. item을 쓰기 위한 ItemWriter 인터페이스와 Bean 설정을 위한 InitializingBean 인터페이스를 구현하였다.
    • write(Chunk) 메서드
      	public void write(Chunk<? extends T> items) {
      		EntityManager entityManager = EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory);
      		if (entityManager == null) {
      			throw new DataAccessResourceFailureException("Unable to obtain a transactional EntityManager");
      		}
      		doWrite(entityManager, items);
      		entityManager.flush();
      	}
      • EntityManagerFactoryUtils의 getTransactionalEntityManager 메서드를 통해 트랜잭션이 활성화된 EntityManager를 호출한다.
      • doWrite(entityManager, items)메서드로 데이터를 처리한 후 entityManager를 flush() 메서드를 통해 영속성 컨텍스트의 변경사항을 DB에 반영한다.
    • doWrite(EntityManager, Chunk)
      protected void doWrite(EntityManager entityManager, Chunk<? extends T> items) {
      
      		if (logger.isDebugEnabled()) {
      			logger.debug("Writing to JPA with " + items.size() + " items.");
      		}
      
      		if (!items.isEmpty()) {
      			long addedToContextCount = 0;
      			for (T item : items) {
      				if (!entityManager.contains(item)) {
      					if (usePersist) {
      						entityManager.persist(item);
      					}
      					else {
      						entityManager.merge(item);
      					}
      					addedToContextCount++;
      				}
      			}
      			if (logger.isDebugEnabled()) {
      				logger.debug(addedToContextCount + " entities " + (usePersist ? " persisted." : "merged."));
      				logger.debug((items.size() - addedToContextCount) + " entities found in persistence context.");
      			}
      		}
      
      	}
      • 새로운 엔티티를 영속성 컨텍스트에 추가해야 하면 usePersist를 true로 설정하여 entityManager.persist(item)을 실행하고, 이미 있는 엔티티를 업데이트해야 하면 entityManager.merge(item)을 실행한다.

JpaItemWriterBuilder

  • builder에서는 아래와 같이 위에서 살펴본 entityManagerFactory 와 usePersist만 설정 가능하다.
      @Bean
      public JpaItemWriter<WeeklyWeather> weeklyWeatherWriter
    	  (EntityManagerFactory entityManagerFactory) {
        return new JpaItemWriterBuilder<List<WeeklyWeather>>()
            .entityManagerFactory(entityManagerFactory)
            .usePersist(true)
            .build();
      }
profile
다시 시작합니다.

0개의 댓글