Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#27] 기본정보 호출 batch job 추가 #28

Merged
merged 3 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# Ignore Gradle project-specific cache directory
.gradle

# log
application.log.*
application.log

# Ignore Gradle build output directory
build
.idea
**.iml
application-secret.yml

1 change: 1 addition & 0 deletions batch/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter'


implementation project(':openapi')
implementation project(':messaging')
implementation project(':db')
}
Expand Down
1 change: 0 additions & 1 deletion batch/src/main/java/org/healthmap/BatchApplication.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.healthmap;

import org.healthmap.config.KafkaProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

Expand Down
57 changes: 57 additions & 0 deletions batch/src/main/java/org/healthmap/config/BasicInfoBatchConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.healthmap.config;

import lombok.RequiredArgsConstructor;
import org.healthmap.dto.BasicInfoDto;
import org.healthmap.openapi.dto.MedicalFacilityDto;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@RequiredArgsConstructor
public class BasicInfoBatchConfig {
@Bean
public Job basicInfoJob(JobRepository jobRepository, Step basicInfoStep) {
return new JobBuilder("basicInfoJob", jobRepository)
.incrementer(new RunIdIncrementer())
.start(basicInfoStep)
.build();
}

@Bean
public Step basicInfoStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager,
ItemReader<MedicalFacilityDto> itemReader,
ItemProcessor<MedicalFacilityDto, BasicInfoDto> itemProcessor,
ItemWriter<BasicInfoDto> itemWriter) {
return new StepBuilder("basicInfoStep", jobRepository)
.<MedicalFacilityDto, BasicInfoDto>chunk(100, transactionManager)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.faultTolerant()
.retry(Exception.class)
.retryLimit(2)
.build();
}

//TODO: 나중에 BasicInfoDto로 통합하게되면 삭제
@Bean
public ItemProcessor<MedicalFacilityDto, BasicInfoDto> basicInfoProcessor() {
return dto -> {
String wtkCoordinate = dto.getCoordinate().toText();
return new BasicInfoDto(dto.getCode(), dto.getName(), dto.getAddress(), dto.getPhoneNumber(), dto.getPageUrl(),
dto.getPostNumber(), dto.getType(), dto.getState(), dto.getCity(), dto.getTown(), wtkCoordinate);
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
//@Configuration
@RequiredArgsConstructor
public class DetailInfoBatchConfig {
private final KafkaProperties kafkaProperties;
Expand Down
14 changes: 14 additions & 0 deletions batch/src/main/java/org/healthmap/config/KeyProperties.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.healthmap.config;

import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Getter
@ConfigurationProperties(prefix = "key")
public class KeyProperties {
private final String serverKey;

public KeyProperties(String serverKey) {
this.serverKey = serverKey;
}
}
23 changes: 23 additions & 0 deletions batch/src/main/java/org/healthmap/reader/BasicInfoItemReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.healthmap.reader;

import lombok.RequiredArgsConstructor;
import org.healthmap.openapi.dto.MedicalFacilityDto;
import org.healthmap.openapi.service.MedicalFacilityApiService;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class BasicInfoItemReader {
private final MedicalFacilityApiService medicalFacilityApiService;

@Bean
public ItemReader<MedicalFacilityDto> basicInfoListItemReader() {
List<MedicalFacilityDto> allList = medicalFacilityApiService.getAllMedicalFacility();
return new ListItemReader<>(allList);
}
}
32 changes: 32 additions & 0 deletions batch/src/main/java/org/healthmap/writer/BasicInfoItemWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.healthmap.writer;

import lombok.RequiredArgsConstructor;
import org.healthmap.config.KafkaProperties;
import org.healthmap.dto.BasicInfoDto;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

@Component
@RequiredArgsConstructor
public class BasicInfoItemWriter implements ItemWriter<BasicInfoDto> {
private final KafkaTemplate<String, BasicInfoDto> kafkaTemplate;
private final KafkaProperties kafkaProperties;

@Override
public void write(Chunk<? extends BasicInfoDto> chunk) throws Exception {
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (BasicInfoDto dto : chunk.getItems()) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
kafkaTemplate.send(kafkaProperties.getBasicTopic(), dto);
});
futures.add(future);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ public class DetailInfoItemWriter implements ItemWriter<String> {
@Override
public void write(Chunk<? extends String> chunk) throws Exception {
List<CompletableFuture<Void>> futures = new ArrayList<>();
for(String id : chunk.getItems()) {
for (String id : chunk.getItems()) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
kafkaTemplate.send(kafkaProperties.getTopic(), id);
kafkaTemplate.send(kafkaProperties.getDetailTopic(), id);
});
futures.add(future);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.healthmap.config;

import lombok.RequiredArgsConstructor;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
Expand Down Expand Up @@ -51,6 +50,7 @@ public ConcurrentKafkaListenerContainerFactory<String, String> concurrentKafkaLi
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setConcurrency(10); //TODO: 차후 변경
factory.setBatchListener(true);
factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);
factory.getContainerProperties().setListenerTaskExecutor(taskExecutorConfig.executor());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
package org.healthmap.config;

import lombok.RequiredArgsConstructor;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.healthmap.dto.BasicInfoDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.support.serializer.JsonSerializer;

import java.util.HashMap;
import java.util.Map;

@Configuration
@RequiredArgsConstructor
public class KafkaProducerConfig {
private final KafkaProperties kafkaProperties;

@Value("${spring.kafka.bootstrap-servers}")
private String kafkaServer;

Expand All @@ -26,10 +32,26 @@ public ProducerFactory<String, String> producerConfig() {
return new DefaultKafkaProducerFactory<>(configProps);
}

@Bean
public ProducerFactory<String, BasicInfoDto> basicInfoProducerConfig() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaServer);
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}

@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
KafkaTemplate<String, String> template = new KafkaTemplate<>(producerConfig());
template.setDefaultTopic("my-topic");
template.setDefaultTopic(kafkaProperties.getDetailTopic());
return template;
}

@Bean
public KafkaTemplate<String, BasicInfoDto> kafkaTemplateBasicInfo() {
KafkaTemplate<String, BasicInfoDto> template = new KafkaTemplate<>(basicInfoProducerConfig());
template.setDefaultTopic(kafkaProperties.getBasicTopic());
return template;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@

import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.bind.ConstructorBinding;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Getter
@ConfigurationProperties(prefix="kafka-config.consumer")
@ConfigurationProperties(prefix = "kafka-config.consumer")
public class KafkaProperties {
private final String topic;
private final String detailTopic;
private final String basicTopic;
private final String groupId;

public KafkaProperties(String topic, String groupId) {
this.topic = topic;
public KafkaProperties(String detailTopic, String basicTopic, String groupId) {
this.detailTopic = detailTopic;
this.basicTopic = basicTopic;
this.groupId = groupId;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package org.healthmap.config;

import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationPropertiesScan
public class PropertiesConfig {
public class KafkaPropertiesConfig {
}
34 changes: 34 additions & 0 deletions messaging/src/main/java/org/healthmap/dto/BasicInfoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.healthmap.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Getter
public class BasicInfoDto {
private String code; //암호화 요양 기호
private String name; //요양기관명(병원명)
private String address; //주소
private String phoneNumber; //전화번호
private String pageUrl; //병원 홈페이지
private String postNumber; //우편번호
private String type; //종별코드명
private String state; //시도코드명
private String city; //시군구코드
private String town; //읍면동
private String coordinate; //좌표

public BasicInfoDto(String code, String name, String address, String phoneNumber, String pageUrl, String postNumber, String typeName, String stateName, String cityName, String emdongName, String coordinate) {
this.code = code;
this.name = name;
this.address = address;
this.phoneNumber = phoneNumber;
this.pageUrl = pageUrl;
this.postNumber = postNumber;
this.type = typeName;
this.state = stateName;
this.city = cityName;
this.town = emdongName;
this.coordinate = coordinate;
}
}

This file was deleted.

8 changes: 7 additions & 1 deletion openapi/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id 'java'
id 'java-library'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
Expand All @@ -18,9 +19,14 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok'

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.hibernate:hibernate-spatial:6.6.0.Final'
api 'org.hibernate:hibernate-spatial:6.6.0.Final'
api 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.0'
implementation 'com.google.code.gson:gson:2.11.0' // 차후 제거

implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'com.sun.xml.bind:jaxb-core:2.3.0.1'
implementation 'com.sun.xml.bind:jaxb-impl:2.3.0.1'

//rate limiter
implementation 'com.bucket4j:bucket4j-core:8.10.1'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ public FacilityDetailUpdateDto getFacilityDetailInfo(String code) {
}

// OpenApi로부터 데이터 받아오는 역할만 부여
// TODO: 변경 가능성 있음
public CompletableFuture<FacilityDetailJsonDto> getFacilityDetailJsonDtoFromApi(String code, Queue<String> idQueue) {
String apiUrl = urlProperties.getDetailUrl()
+ "?serviceKey=" + keyProperties.getServerKey() //Service Key
Expand Down
Loading
Loading