-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
inspire12
committed
Feb 24, 2023
1 parent
7a830e4
commit 2c0181a
Showing
44 changed files
with
1,467 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
32 changes: 32 additions & 0 deletions
32
src/main/java/com/inspire12/practice/api/config/web/AsyncConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package com.inspire12.practice.api.config.web; | ||
|
||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.scheduling.annotation.AsyncConfigurer; | ||
import org.springframework.scheduling.annotation.EnableAsync; | ||
import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor; | ||
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer; | ||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; | ||
|
||
import java.util.concurrent.Executors; | ||
|
||
@EnableAsync | ||
@Configuration | ||
public class AsyncConfig implements AsyncConfigurer { | ||
|
||
@Bean | ||
protected WebMvcConfigurer webMvcConfigurer() { | ||
return new WebMvcConfigurerAdapter() { | ||
@Override | ||
public void configureAsyncSupport(AsyncSupportConfigurer configurer) { | ||
configurer.setTaskExecutor(getTaskExecutor()); | ||
} | ||
}; | ||
} | ||
|
||
@Bean | ||
protected ConcurrentTaskExecutor getTaskExecutor() { | ||
return new ConcurrentTaskExecutor(Executors.newFixedThreadPool(5)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
98 changes: 98 additions & 0 deletions
98
...java/com/inspire12/practice/api/presentation/controller/sample/ticker/TestRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
package com.inspire12.practice.api.presentation.controller.sample.ticker; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.jdbc.core.BatchPreparedStatementSetter; | ||
import org.springframework.jdbc.core.JdbcTemplate; | ||
import org.springframework.stereotype.Repository; | ||
import org.springframework.util.ReflectionUtils; | ||
import org.springframework.util.StopWatch; | ||
|
||
import java.sql.PreparedStatement; | ||
import java.sql.SQLException; | ||
import java.util.List; | ||
import java.util.concurrent.atomic.AtomicInteger; | ||
|
||
@Slf4j | ||
@RequiredArgsConstructor | ||
@Repository | ||
public class TestRepository { | ||
|
||
private final JdbcTemplate jdbcTemplate; | ||
|
||
public <T> void bulkUpsert(Class<?> clz, List<T> dataList) { | ||
if (dataList.isEmpty()) { | ||
return; | ||
} | ||
String query = createQuery(clz); | ||
int fieldCount = dataList.get(0).getClass().getDeclaredFields().length; | ||
|
||
StopWatch timer = new StopWatch(); | ||
timer.start(); | ||
jdbcTemplate.batchUpdate(query, new BatchPreparedStatementSetter() { | ||
@Override | ||
public void setValues(PreparedStatement ps, int i) { | ||
T data = dataList.get(i); | ||
AtomicInteger index = new AtomicInteger(1); | ||
ReflectionUtils.doWithFields(clz, field -> { | ||
field.setAccessible(true); | ||
try { | ||
ps.setObject(index.get(), ReflectionUtils.getField(field, data)); | ||
ps.setObject(index.get() + fieldCount, ReflectionUtils.getField(field, data)); | ||
} catch (SQLException e) { | ||
throw new RuntimeException(e); | ||
} | ||
index.getAndIncrement(); | ||
}); | ||
} | ||
|
||
@Override | ||
public int getBatchSize() { | ||
return dataList.size(); | ||
} | ||
}); | ||
timer.stop(); | ||
log.info("batchInsert -> Total time in seconds: " + timer.getTotalTimeSeconds()); | ||
|
||
} | ||
|
||
private String createQuery(Class<?> clz) { | ||
StringBuilder fieldListStr = new StringBuilder(" ("); | ||
AtomicInteger fieldCount = new AtomicInteger(); | ||
StringBuilder updateQuery = new StringBuilder(); | ||
|
||
ReflectionUtils.doWithFields(clz, field -> { | ||
// String columnName = field.getDeclaredAnnotation(Column.class) != null ? field.getDeclaredAnnotation(Column.class).name() : field.getName(); | ||
fieldListStr.append(field.getName()).append(","); | ||
updateQuery.append(field.getName()).append("=?").append(","); | ||
fieldCount.getAndIncrement(); | ||
}); | ||
if (!fieldListStr.isEmpty()) { | ||
fieldListStr.deleteCharAt(fieldListStr.length() - 1); | ||
} | ||
fieldListStr.append(")"); | ||
fieldListStr.append(" "); | ||
|
||
if (!updateQuery.isEmpty()) { | ||
updateQuery.deleteCharAt(updateQuery.length() - 1); | ||
} | ||
|
||
StringBuilder values = new StringBuilder("("); | ||
for (int i = 0; i < fieldCount.get(); i++) { | ||
values.append("?,"); | ||
} | ||
if (values.length() > 0) { | ||
values.deleteCharAt(values.length() - 1); | ||
} | ||
values.append(")"); | ||
|
||
|
||
String query = """ | ||
INSERT INTO %s %s values %s ON DUPLICATE KEY UPDATE %s | ||
""".formatted(clz.getSimpleName(), fieldListStr, values, updateQuery); | ||
|
||
System.out.println(query); | ||
|
||
return query; | ||
} | ||
} |
61 changes: 61 additions & 0 deletions
61
...in/java/com/inspire12/practice/api/presentation/controller/sample/ticker/TickerTrade.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package com.inspire12.practice.api.presentation.controller.sample.ticker; | ||
|
||
import com.fasterxml.jackson.annotation.JsonFormat; | ||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||
import lombok.*; | ||
import org.hibernate.annotations.Comment; | ||
import org.springframework.data.annotation.CreatedDate; | ||
import org.springframework.data.annotation.LastModifiedDate; | ||
import org.springframework.data.jpa.domain.support.AuditingEntityListener; | ||
|
||
import javax.persistence.*; | ||
import java.time.LocalDate; | ||
import java.time.LocalDateTime; | ||
|
||
@Entity | ||
@Getter | ||
@Setter | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Builder | ||
@EntityListeners(AuditingEntityListener.class) | ||
@JsonIgnoreProperties(ignoreUnknown = true) | ||
@Table | ||
@IdClass(TickerTradeId.class) | ||
public class TickerTrade { | ||
|
||
@Id | ||
@Comment(value = "거래일자") | ||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") | ||
private LocalDate tradeDate; | ||
@Id | ||
@Comment(value = "종목코드") | ||
private String stockCode; | ||
@Comment(value = "종목 이름") | ||
private String stockName; | ||
@Comment(value = "상장된 시장(KOSPI/KOSDAQ)") | ||
private String stockMkt; | ||
@Comment(value = "시가 총액") | ||
private Long mktCap; | ||
@Comment(value = "종가( 해당 거래일 마지막 주식 가격)") | ||
private Long close; | ||
@Comment(value = "종가등락액 (직전 거래일 대비 등락액)") | ||
private Long netChg; | ||
@Comment(value = "종가등락율 (직전 거래일 대비 등락 비율)") | ||
private Double pctChg; | ||
|
||
@Comment(value = "딜리버리 날짜") | ||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") | ||
private LocalDateTime deliveryTime; | ||
|
||
@CreatedDate | ||
@Column(updatable = false) | ||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") | ||
private LocalDateTime createdDate; | ||
|
||
@LastModifiedDate | ||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") | ||
private LocalDateTime updatedDate; | ||
|
||
|
||
} |
17 changes: 17 additions & 0 deletions
17
.../java/com/inspire12/practice/api/presentation/controller/sample/ticker/TickerTradeId.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.inspire12.practice.api.presentation.controller.sample.ticker; | ||
|
||
import lombok.*; | ||
|
||
import java.io.Serializable; | ||
import java.time.LocalDate; | ||
|
||
@Setter | ||
@Getter | ||
@EqualsAndHashCode | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Builder | ||
public class TickerTradeId implements Serializable { | ||
private LocalDate tradeDate; | ||
private String stockCode; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
<configuration> | ||
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> | ||
|
||
<!-- 로그 위치 --> | ||
<property name="LOG_DIR" value="/usr/local/app/logs" /> | ||
|
||
<appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||
<file>${LOG_DIR}/access.log</file> | ||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||
<fileNamePattern>${LOG_DIR}/access.log.%d{yyyyMMdd}</fileNamePattern> | ||
<maxHistory>1</maxHistory> | ||
</rollingPolicy> | ||
<encoder> | ||
<pattern>%h %l %u [%date] "%r" %s %b %D "%i{Referer}" "%i{User-Agent}"</pattern> | ||
</encoder> | ||
</appender> | ||
|
||
<appender-ref ref="ACCESS" /> | ||
</configuration> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<configuration> | ||
<!-- 로그파일 저장 경로 --> | ||
<property name="LOG_DIR" value="/usr/local/app/logs" /> | ||
|
||
<!-- CONSOLE --> | ||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> | ||
<layout class="ch.qos.logback.classic.PatternLayout"> | ||
<Pattern> | ||
%highlight([%-5level]) %cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) : %green([%logger{0}:%line]) - %msg%n | ||
</Pattern> | ||
</layout> | ||
</appender> | ||
<!-- // CONSOLE --> | ||
<!-- APPLICATION --> | ||
<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||
<file>${LOG_DIR}/application.log</file> | ||
<layout class="ch.qos.logback.classic.PatternLayout"> | ||
<Pattern> | ||
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} : [%logger{0}:%line] - %msg%n | ||
</Pattern> | ||
</layout> | ||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||
<fileNamePattern>${LOG_DIR}/application.log.%d{yyyy-MM-dd}</fileNamePattern> | ||
<maxHistory>10</maxHistory> | ||
</rollingPolicy> | ||
</appender> | ||
<!-- // APPLICATION --> | ||
|
||
<root level="INFO"> | ||
<appender-ref ref="APPLICATION" /> | ||
<appender-ref ref="CONSOLE" /> | ||
</root> | ||
|
||
<logger name="org.hibernate.SQL" level="DEBUG" /> | ||
|
||
</configuration> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<configuration> | ||
|
||
<!-- CONSOLE --> | ||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> | ||
<layout class="ch.qos.logback.classic.PatternLayout"> | ||
<Pattern> | ||
%highlight([%-5level]) %cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) : %green([%logger{0}:%line]) - %msg%n | ||
</Pattern> | ||
</layout> | ||
</appender> | ||
<!-- // CONSOLE --> | ||
|
||
<root level="INFO"> | ||
<appender-ref ref="CONSOLE" /> | ||
</root> | ||
|
||
</configuration> |
Oops, something went wrong.