예시 1
CSV 파일에서 파일 정보를 읽어와 대문자로 변경한 후 출력
* Job 설정
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private ItemReader<FileInfo> reader;
@Autowired
private ItemProcessor<FileInfo, FileInfo> processor;
@Autowired
private ItemWriter<FileInfo> writer;
@Bean
public Job processFileJob() {
return jobBuilderFactory.get("processFileJob")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<FileInfo, FileInfo>chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
}
* Reader 설정
@Component
public class FileItemReader implements ItemReader<FileInfo> {
private final String filePath = "data.csv";
private BufferedReader bufferedReader;
@PostConstruct
public void initialize() throws Exception {
bufferedReader = new BufferedReader(new FileReader(new File(filePath)));
}
@Override
public FileInfo read() throws Exception {
String line = bufferedReader.readLine();
if (StringUtils.isEmpty(line)) {
return null;
}
String[] split = line.split(",");
return FileInfo.builder()
.fileName(split[0])
.fileSize(Long.parseLong(split[1]))
.fileType(split[2])
.build();
}
}
* Writer 설정
@Component
public class FileItemWriter implements ItemWriter<FileInfo> {
@Override
public void write(List<? extends FileInfo> list) throws Exception {
for (FileInfo fileInfo : list) {
System.out.println(fileInfo.toString());
}
}
}
예시2
일정 시간마다 미인증 회원들의 정보를 추출하여 이메일 발송
@Configuration
@EnableBatchProcessing
public class EmailJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final EmailItemReader emailItemReader;
private final EmailItemProcessor emailItemProcessor;
private final EmailItemWriter emailItemWriter;
public EmailJobConfig(JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory,
EmailItemReader emailItemReader,
EmailItemProcessor emailItemProcessor,
EmailItemWriter emailItemWriter) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
this.emailItemReader = emailItemReader;
this.emailItemProcessor = emailItemProcessor;
this.emailItemWriter = emailItemWriter;
}
@Bean
public Job emailJob() {
return jobBuilderFactory.get("emailJob")
.incrementer(new RunIdIncrementer())
.start(emailStep())
.build();
}
@Bean
public Step emailStep() {
return stepBuilderFactory.get("emailStep")
.<Email, Email>chunk(10)
.reader(emailItemReader)
.processor(emailItemProcessor)
.writer(emailItemWriter)
.build();
}
}
EmailItemReader, EmailItemProcessor, EmailItemWriter는
각각 ItemReader, ItemProcessor, ItemWriter 인터페이스를 구현한 클래스
ItemReader는 DB나 파일 등에서 데이터를 읽어오는 역할을 하고, ItemProcessor는 읽어온 데이터를 가공하거나 필터링하는 역할을 하고, ItemWriter는 처리한 결과를 DB나 파일 등에 쓰는 역할
각 ItemReader, ItemProcessor, ItemWriter 구현 클래스를 작성
이메일 발송 대상이 되는 사용자 정보는 User 엔티티로 가정하고, UserRepository를 이용하여 DB에서 데이터를 읽어오는 EmailItemReader 클래스
@Component
public class EmailItemReader implements ItemReader<Email> {
private final UserRepository userRepository;
private int nextEmailIndex;
private List<User> usersWithEmail;
public EmailItemReader(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public Email read() {
if (usersWithEmail == null) {
usersWithEmail = userRepository.findUsersWithEmail();
}
if (nextEmailIndex < usersWithEmail.size()) {
User user = usersWithEmail.get(nextEmailIndex++);
return new Email(user.getEmail(), user.getFullName());
} else {
return null;
}
}
}
EmailItemProcessor 클래스는 ItemProcessor 인터페이스를 구현
ItemProcessor는 ItemReader로부터 읽어온 데이터를 가공하고 변환하는 역할
EmailItemProcessor 클래스의 process() 메소드는 Person 객체를 입력받아 Email 객체로 변환
이 과정에서 Person 객체에서 이메일 주소를 추출하여 Email 객체에 저장하고 반환
여기서는 단순히 Person 객체의 이메일 주소를 추출하는 것이지만, 실제로는 이메일 주소를 검증하거나 포맷을 변경하는 등의 다양한 작업을 수행할 수 있다.
EmailItemProcessor 클래스의 process() 메소드에서는 스프링 프레임워크에서 제공하는 유틸리티 클래스인 EmailAddressValidator를 사용하여 이메일 주소의 유효성을 검증하고, Email 객체에 이메일 주소를 저장하여 반환한다.
EmailAddressValidator 클래스는 주어진 문자열이 이메일 주소의 형식에 맞는지를 검증하여 boolean 타입으로 반환하는 isValid() 메소드를 제공한다.
이 메소드를 사용하여 이메일 주소의 유효성을 검증한다.
'Web > tip' 카테고리의 다른 글
[Spring] @Bean 과 @Component (0) | 2023.03.07 |
---|---|
[McAfee Web Gateway] MWG 란 (0) | 2023.03.06 |
[REST API] 직관적 네이밍 연습 (0) | 2023.03.04 |
[exception] 한눈에 보는 Exception Class (0) | 2023.02.27 |
[codereview]실무에 대한 팁 (0) | 2023.02.27 |