Skip to content

Commit cd6545e

Browse files
Merge pull request #14 from Ureca-QuickPick/feature/v3
Feature/v3
2 parents 90b6d9f + ed42b6c commit cd6545e

33 files changed

+731
-17
lines changed

.github/workflows/CI.yml

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
name: CI FOR MVP
2+
3+
on:
4+
push:
5+
# branches-ignore:
6+
# - main
7+
# - develop
8+
9+
jobs:
10+
CI:
11+
name: Continuous Integration
12+
runs-on: ubuntu-latest
13+
permissions:
14+
contents: read
15+
16+
steps:
17+
- name: Checkout
18+
uses: actions/checkout@v4
19+
20+
- name: Set up JDK 17
21+
uses: actions/setup-java@v4
22+
with:
23+
java-version: '17'
24+
distribution: 'temurin'
25+
26+
- name: Setup MySQL
27+
uses: mirromutth/[email protected]
28+
with:
29+
mysql database: 'testDB'
30+
mysql user: 'test'
31+
mysql password: 'testPW'
32+
33+
- name: Setup Gradle
34+
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5
35+
36+
- name: Get short SHA
37+
id: slug
38+
run: echo "sha7=$(echo ${GITHUB_SHA} | cut -c1-7)" >> $GITHUB_OUTPUT
39+
40+
- name: Create application.properties
41+
run: |
42+
cat <<EOT > ./src/main/resources/application.properties
43+
spring.application.name=ureca
44+
45+
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
46+
spring.datasource.url=jdbc:mysql://localhost:3306/testDB?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
47+
spring.datasource.username=test
48+
spring.datasource.password=testPW
49+
50+
# spring jpa
51+
spring.jpa.database=mysql
52+
spring.jpa.properties.hibernate.show_sql=true
53+
spring.jpa.hibernate.ddl-auto=create-drop
54+
spring.jpa.properties.hibernate.format_sql=true
55+
EOT
56+
shell: bash
57+
58+
- name: Grant execute permission for gradlew
59+
run: chmod +x ./gradlew
60+
61+
- name: Build with Gradle Wrapper
62+
run: ./gradlew build

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,5 @@ out/
3535

3636
### VS Code ###
3737
.vscode/
38+
39+
/src/main/resources/application.properties

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ dependencies {
2828
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2929
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
3030
implementation 'org.springframework.boot:spring-boot-starter-web'
31+
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
32+
implementation 'org.springframework.kafka:spring-kafka'
33+
implementation 'com.fasterxml.jackson.core:jackson-databind'
34+
35+
testImplementation 'org.springframework.kafka:spring-kafka-test'
3136
compileOnly 'org.projectlombok:lombok'
3237
runtimeOnly 'com.mysql:mysql-connector-j'
3338
annotationProcessor 'org.projectlombok:lombok'

gradlew

100644100755
File mode changed.

src/main/java/com/quickpick/ureca/UrecaApplication.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
57

68
@SpringBootApplication
9+
@EnableJpaAuditing
10+
@EnableScheduling
711
public class UrecaApplication {
8-
912
public static void main(String[] args) {
1013
SpringApplication.run(UrecaApplication.class, args);
1114
}
12-
13-
}
15+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.quickpick.ureca.v3.common;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.EntityListeners;
5+
import jakarta.persistence.MappedSuperclass;
6+
import lombok.Getter;
7+
import org.springframework.data.annotation.CreatedDate;
8+
import org.springframework.data.annotation.LastModifiedDate;
9+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
10+
11+
import java.time.LocalDateTime;
12+
13+
@Getter
14+
@MappedSuperclass
15+
@EntityListeners(AuditingEntityListener.class)
16+
public abstract class BaseEntityV3 {
17+
@CreatedDate
18+
@Column(length = 6, name = "created_at", updatable = false)
19+
private LocalDateTime createdAt;
20+
21+
@LastModifiedDate
22+
@Column(length = 6, name = "updated_at")
23+
private LocalDateTime updatedAt;
24+
25+
}
26+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.quickpick.ureca.v3.config;
2+
3+
import com.quickpick.ureca.v3.ticket.event.TicketPurchaseEventV3;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
7+
import org.springframework.kafka.core.ConsumerFactory;
8+
9+
@Configuration
10+
public class KafkaConsumerConfigV3 {
11+
12+
@Bean
13+
public ConcurrentKafkaListenerContainerFactory<String, TicketPurchaseEventV3> batchFactory(
14+
ConsumerFactory<String, TicketPurchaseEventV3> consumerFactory) {
15+
16+
ConcurrentKafkaListenerContainerFactory<String, TicketPurchaseEventV3> factory =
17+
new ConcurrentKafkaListenerContainerFactory<>();
18+
19+
factory.setConsumerFactory(consumerFactory);
20+
factory.setBatchListener(true); // 핵심
21+
factory.setConcurrency(3);
22+
return factory;
23+
}
24+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.quickpick.ureca.v3.init;
2+
3+
import com.quickpick.ureca.v3.ticket.domain.TicketV3;
4+
import com.quickpick.ureca.v3.ticket.repository.RedisStockRepositoryV3;
5+
import com.quickpick.ureca.v3.ticket.repository.TicketRepositoryV3;
6+
import jakarta.transaction.Transactional;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.jdbc.core.JdbcTemplate;
9+
import org.springframework.web.bind.annotation.PostMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
import java.time.LocalDate;
14+
import java.time.LocalDateTime;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
@RestController
19+
@RequestMapping("/v3/init")
20+
@RequiredArgsConstructor
21+
public class InitControllerV3 {
22+
23+
private final TicketRepositoryV3 ticketRepositoryV3;
24+
private final RedisStockRepositoryV3 redisStockRepositoryV3;
25+
private final JdbcTemplate jdbcTemplate;
26+
27+
@PostMapping
28+
@Transactional
29+
public void init() {
30+
31+
String sql = "INSERT INTO user (user_id, name, age, gender, password) VALUES (?, ?, ?, ?, ?)";
32+
List<Object[]> batchArgs = new ArrayList<>();
33+
34+
for (long i = 1; i <= 10000; i++) {
35+
batchArgs.add(new Object[]{
36+
i,
37+
"abc" + i,
38+
i+20,
39+
"MALE",
40+
"password" + i
41+
42+
});
43+
}
44+
45+
jdbcTemplate.batchUpdate(sql, batchArgs);
46+
System.out.println("=== 10만명 유저 생성 완료 ===");
47+
48+
49+
TicketV3 ticketV3 = TicketV3.builder()
50+
.name("ticket")
51+
.quantity(3000L)
52+
.reserveTime(LocalDateTime.now())
53+
.startDate(LocalDate.now())
54+
.build();
55+
56+
TicketV3 saveTicketV3 = ticketRepositoryV3.save(ticketV3);
57+
redisStockRepositoryV3.setTicket(saveTicketV3.getId(), 3000L);
58+
}
59+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//package com.quickpick.ureca.v3.init;
2+
//
3+
//import com.quickpick.ureca.v3.ticket.domain.TicketV3;
4+
//import com.quickpick.ureca.v3.ticket.repository.RedisStockRepositoryV3;
5+
//import com.quickpick.ureca.v3.ticket.repository.TicketRepositoryV3;
6+
//import jakarta.transaction.Transactional;
7+
//import lombok.RequiredArgsConstructor;
8+
//import org.springframework.boot.CommandLineRunner;
9+
//import org.springframework.jdbc.core.JdbcTemplate;
10+
//import org.springframework.stereotype.Component;
11+
//
12+
//import java.time.LocalDate;
13+
//import java.time.LocalDateTime;
14+
//import java.util.ArrayList;
15+
//import java.util.List;
16+
//
17+
//@Component
18+
//@RequiredArgsConstructor
19+
//public class InitDataLoaderV3 implements CommandLineRunner {
20+
//
21+
// private final TicketRepositoryV3 ticketRepositoryV3;
22+
// private final RedisStockRepositoryV3 redisStockRepositoryV3;
23+
// private final JdbcTemplate jdbcTemplate;
24+
//
25+
// @Transactional
26+
// @Override
27+
// public void run(String... args) {
28+
// String sql = "INSERT INTO user (user_id, name, age, gender, password) VALUES (?, ?, ?, ?, ?)";
29+
//
30+
// List<Object[]> batchArgs = new ArrayList<>();
31+
//
32+
// for (long i = 1; i <= 10000; i++) {
33+
// batchArgs.add(new Object[]{
34+
// i,
35+
// "abc" + i,
36+
// i+20,
37+
// "MALE",
38+
// "password" + i
39+
//
40+
// });
41+
// }
42+
//
43+
// jdbcTemplate.batchUpdate(sql, batchArgs);
44+
// System.out.println("=== 10만명 유저 생성 완료 ===");
45+
//
46+
//
47+
// TicketV3 ticketV3 = TicketV3.builder()
48+
// .name("ticket")
49+
// .quantity(3000L)
50+
// .reserveTime(LocalDateTime.now())
51+
// .startDate(LocalDate.now())
52+
// .build();
53+
//
54+
// TicketV3 saveTicketV3 = ticketRepositoryV3.save(ticketV3);
55+
// redisStockRepositoryV3.setTicket(saveTicketV3.getId(), 3000L);
56+
// }
57+
//}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.quickpick.ureca.v3.reserve.domain;
2+
3+
public enum ReserveStatusV3 {
4+
SUCCESS, FAIL
5+
}

0 commit comments

Comments
 (0)