기본개념 우선 ItemReader, ItemProcessor, ItemWriter 에 대해 간단하게 살펴보자. ItemReader 다양한 타입의 입력 데이터를 읽어오는 인터페이스로, 배치 수행의 대상이 될 데이터를 담는다. package org.springframework.batch.item; import org.springframework.lang.Nullable; public interface ItemReader { @Nullable T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException; } ItemProcessor ItemReader로 읽어온 데이터들을 가공하고 변환하는 과정을..
예제코드 Member.java package jpql; import javax.persistence.*; @Entity @Table(name="MEMBER") public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) // Many 쪽(Member)에 TEAM_ID 컬럼 생성됨 @JoinColumn(name = "TEAM_ID") private Team team; @Enumerated(EnumType.STRING) private MemberType type; public void setType(MemberType type)..
@JobScope와 @StepScope 개념 - 해당 어노테이션이 선언되면 생성이 어플리케이션 구동 시점이 아닌 빈의 실행 시점에 이루어진다. 스프링의 @Bean 어노테이션은 스프링이 초가화되는 시점에 빈이 생성된 후 관리된다. 스프링 배치에서 @JobScope, @StepScope 어노테이션은 어플리케이션이 실제로 실행되는 시점에 생성된다. - 스코프를 프록시 모드를 기본값으로 하기 때문에, 어플리케이션 구동 시점에는 빈의 프록시 객체가 생성되어 실행 시점에 실제 빈을 호출해준다. @JobScope - Step 선언시에 사용한다. - @Value : jobParameters, jobExecutionContext 만 사용 가능하다. @StepScope - Tasklet 이나 ItemReader, Item..
1) 연관관계 적용 Member member = new Member(); member.setUsername("kimseohae"); member.setAge(10); Team team = new Team(); team.setName("team1"); team.setName("team"); member.setTeam(team); em.persist(team); em.persist(member); em.flush(); em.clear(); 2) Join 예제 - Inner TypedQuery query = em.createQuery("select m from Member as m inner join m.team t", Member.class); List resultList = query.getResultLi..
예제코드 Member.java package jpql; import javax.persistence.*; @Entity @Table(name="MEMBER") @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; private int age; ... } Main.java package main.paging; import jpql.Member; import javax.persistence.*; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory..
테스트 코드 작성 로그 -2 TODO - POST 메서드 호출 - @RequestBody param 전송 - DTO(Object) 를 Json String 으로 변환 (with Jackson) - API Response 의 "data" 특정 key 값의 결과만 꺼내오기 - Json String 을 List 로 변환 (With jackson) 테스트 코드 import com.couchbase.client.java.json.JsonObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databin..
테스트 코드 작성 로그 -1 로그인 API - 테스트 코드를 위한 포스팅으로, 상세 로그인 로직은 생략 package com.api.shop.modules.controller; import com.api.shop.common.Output; import com.api.shop.modules.form.LoginForm; import com.api.shop.modules.form.MemberForm; import com.api.shop.modules.repository.MemberRepository; import com.api.shop.modules.service.AuthService; import com.api.shop.modules.service.MemberService; import io.swagger...
들어가며 SimpleJob, FlowJob 에서 각 STEP의 결과 상태값에 따라 BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION 테이블의 EXIT_CODE, STATUS 컬럼에 어떻게 셋팅되어지는지 확인해보자. 명칭 설명 STATUS (batchStatus) JobExecution, StepExecution의 속성 값으로, JOB, STEP의 최종 결과 상태를 가진다. EXIT_CODE (ExitStatus) JobExecution, StepExecution의 속성 값으로, JOB, STEP의 실행 이후 어떤 상태로 종료되었는지정의한다. SimpleJob package com.spring.batch.flowjob; import lombok.RequiredArgsConstruc..
Job 재실행 Job의 재실행에 대해서는 아래 포스팅을 참고하자. https://devfunny.tistory.com/680 SpringBatch 에서 JobInstance, JobExecution 의 관계 들어가기전 JobInstance, JobExecution 의 개념은 알고가자. https://devfunny.tistory.com/476?category=820618 [스프링배치] 잡의 실행 (JobLauncher, JobInstance, JobExecution, JobParameters) 잡의 실행 잡.. devfunny.tistory.com JOB을 재실행하면 FAILED 상태로 끝난 STEP만 실행 대상이 되는데, allowStartIfComplete(true)를 사용하여 COMPLETED로 끝..
테이블 구조 부모테이블 자식테이블 식별자 클래스 ParentA.java ChildA.java ParentAId.java ParentB.java ChildB.java ParentBId.java @IdClass 1) ParentA.java package com.book.jpa.chapter07.identifying.idClass; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; @Entity @IdClass(ParentAId.class) public class ParentA { @Id @Column(name = "PARENT_I..
기존 구현체 사용 스프링 배치는 동일한 JobParameters 로는 성공한 Job의 재실행이 불가능하다고 했다. 하지만 Job을 여러번 수행시켜야하는 경우도 있으므로 해당 경우에 incrementer()을 사용한다. 기존 구현체인 RunIdIncrementer() 을 사용할 경우 run.id 를 key 값으로 value 가 1씩 증가하여 Job이 실행된다. 계속적으로 증가되는 파라미터가 존재하므로 다른 파라미터 값들은 동일하도 JobParameters 가 다르게 인식되어 재실행이 가능해진다. IncrementerConfiguration.java package com.spring.batch.job; import com.spring.batch.job.incrementer.CustomJobParameters..
조인 전략 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키를 받아서 기본키 + 외래키로 사용하는 전략이다. 예시 Item.java (부모 테이블) package com.book.jpa.chapter07.JoinedStrategy.joined; import javax.persistence.*; @Entity @Inheritance(strategy = InheritanceType.JOINED) // 상속 매핑은 부모 클래스에 해당 어노테이션을 써야한다. 매핑전략 지정 @DiscriminatorColumn(name = "DTYPE") // 부모 클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분한다. public abstract class Item { @Id @Gen..