Skip to content

Commit 286e839

Browse files
Merge branch 'develop' into feature/oauth
2 parents c74b940 + f5041a0 commit 286e839

File tree

22 files changed

+843
-0
lines changed

22 files changed

+843
-0
lines changed

.github/workflows/CI.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ jobs:
3030
mysql user: 'test'
3131
mysql password: 'testPW'
3232

33+
- name: Start Redis
34+
uses: supercharge/[email protected]
35+
3336
- name: Setup Gradle
3437
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5
3538

@@ -52,6 +55,8 @@ jobs:
5255
spring.jpa.properties.hibernate.show_sql=true
5356
spring.jpa.hibernate.ddl-auto=create-drop
5457
spring.jpa.properties.hibernate.format_sql=true
58+
59+
5560
jwt.issuer=${{ secrets.JWT_ISSUER }}
5661
jwt.secret_key=${{ secrets.JWT_SECRET_KEY }}
5762

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ dependencies {
5656
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
5757
implementation 'org.springframework.data:spring-data-redis'
5858
implementation 'org.apache.commons:commons-pool2' // 커넥션 풀
59+
implementation 'org.redisson:redisson-spring-boot-starter:3.25.2'
5960
}
6061

6162
tasks.named('test') {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.quickpick.ureca.V2.common.domain;
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 BaseEntityV2 {
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: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.quickpick.ureca.V2.common.init;
2+
3+
import com.quickpick.ureca.V2.ticket.domain.TicketV2;
4+
import com.quickpick.ureca.V2.ticket.repository.TicketRepositoryV2;
5+
import com.quickpick.ureca.V2.user.domain.UserV2;
6+
import com.quickpick.ureca.V2.user.repository.UserRepositoryV2;
7+
import lombok.RequiredArgsConstructor;
8+
import org.redisson.api.RedissonClient;
9+
import org.redisson.client.codec.StringCodec;
10+
import org.springframework.format.annotation.DateTimeFormat;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
import java.time.LocalDateTime;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
@RestController
18+
@RequiredArgsConstructor
19+
@RequestMapping("/init")
20+
public class InitControllerV2 {
21+
22+
private final TicketRepositoryV2 ticketRepository;
23+
private final UserRepositoryV2 userRepository;
24+
private final RedissonClient redissonClient;
25+
26+
@PostMapping
27+
public String initializeData(
28+
@RequestParam(defaultValue = "3000") int ticketCount,
29+
@RequestParam(defaultValue = "10000") int userCount,
30+
@RequestParam(required = false)
31+
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
32+
LocalDateTime startDate,
33+
@RequestParam(required = false)
34+
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
35+
LocalDateTime reserveDate
36+
) {
37+
// DB 초기화
38+
ticketRepository.deleteAll();
39+
userRepository.deleteAll();
40+
41+
// 티켓 생성 및 저장 (ID 생성)
42+
TicketV2 ticket = TicketV2.builder()
43+
.name("테스트 티켓")
44+
.quantity(ticketCount)
45+
.startDate(startDate != null ? startDate : LocalDateTime.now().plusDays(1))
46+
.reserveDate(reserveDate != null ? reserveDate : LocalDateTime.now())
47+
.build();
48+
ticket = ticketRepository.save(ticket); // ID 보장
49+
50+
// Redis 키 초기화
51+
String redisStockKey = "ticket:stock:" + ticket.getTicketId();
52+
String redisUserSetKey = "ticket:users:" + ticket.getTicketId();
53+
54+
// 재고 수량 설정
55+
redissonClient.getBucket(redisStockKey, StringCodec.INSTANCE).set(String.valueOf(ticketCount));
56+
// 중복 예매 유저 Set 초기화
57+
redissonClient.getSet(redisUserSetKey, StringCodec.INSTANCE).delete();
58+
59+
// 유저 생성
60+
List<UserV2> users = new ArrayList<>();
61+
for (int i = 1; i <= userCount; i++) {
62+
UserV2 user = UserV2.builder()
63+
.id("user" + i)
64+
.password("pw" + i)
65+
.name("User" + i)
66+
.age("20")
67+
.gender("M")
68+
.build();
69+
users.add(user);
70+
}
71+
userRepository.saveAll(users);
72+
73+
return "초기화 완료: 티켓 1개(" + ticketCount + "개 수량), 유저 " + userCount + "명 생성";
74+
}
75+
76+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//package com.quickpick.ureca.V2.common.init;
2+
//
3+
//import com.quickpick.ureca.V2.ticket.domain.TicketV2;
4+
//import com.quickpick.ureca.V2.ticket.repository.TicketRepositoryV2;
5+
//import com.quickpick.ureca.V2.user.domain.UserV2;
6+
//import com.quickpick.ureca.V2.user.repository.UserRepositoryV2;
7+
//import lombok.RequiredArgsConstructor;
8+
//import org.redisson.api.RedissonClient;
9+
//import org.redisson.client.codec.StringCodec;
10+
//import org.springframework.stereotype.Service;
11+
//
12+
//import java.time.LocalDateTime;
13+
//import java.util.ArrayList;
14+
//import java.util.List;
15+
//
16+
//@Service
17+
//@RequiredArgsConstructor
18+
//public class InitServiceV2 {
19+
//
20+
// private final TicketRepositoryV2 ticketRepository;
21+
// private final UserRepositoryV2 userRepository;
22+
// private final RedissonClient redissonClient;
23+
//
24+
// public String initialize(int ticketCount, int userCount, LocalDateTime startDate, LocalDateTime reserveDate) {
25+
// // DB 초기화
26+
// ticketRepository.deleteAll();
27+
// userRepository.deleteAll();
28+
//
29+
// // 티켓 생성 및 저장 (ID 생성)
30+
// TicketV2 ticket = TicketV2.builder()
31+
// .name("테스트 티켓")
32+
// .quantity(ticketCount)
33+
// .startDate(startDate != null ? startDate : LocalDateTime.now().plusDays(1))
34+
// .reserveDate(reserveDate != null ? reserveDate : LocalDateTime.now())
35+
// .build();
36+
// ticket = ticketRepository.save(ticket); // ID 보장
37+
//
38+
// // Redis 키 초기화
39+
// String redisStockKey = "ticket:stock:" + ticket.getTicketId();
40+
// String redisUserSetKey = "ticket:users:" + ticket.getTicketId();
41+
//
42+
// // 재고 수량 설정
43+
// redissonClient.getBucket(redisStockKey, StringCodec.INSTANCE).set(String.valueOf(ticketCount));
44+
// // 중복 예매 유저 Set 초기화
45+
// redissonClient.getSet(redisUserSetKey, StringCodec.INSTANCE).delete();
46+
//
47+
// // 유저 생성
48+
// List<UserV2> users = new ArrayList<>();
49+
// for (int i = 1; i <= userCount; i++) {
50+
// UserV2 user = UserV2.builder()
51+
// .id("user" + i)
52+
// .password("pw" + i)
53+
// .name("User" + i)
54+
// .age("20")
55+
// .gender("M")
56+
// .build();
57+
// users.add(user);
58+
// }
59+
// userRepository.saveAll(users);
60+
//
61+
// return "초기화 완료: 티켓 1개(" + ticketCount + "개 수량), 유저 " + userCount + "명 생성";
62+
// }
63+
//}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//package com.quickpick.ureca.V2.common.init;
2+
//
3+
//import lombok.RequiredArgsConstructor;
4+
//import org.springframework.boot.context.event.ApplicationReadyEvent;
5+
//import org.springframework.context.ApplicationListener;
6+
//import org.springframework.context.annotation.Profile;
7+
//import org.springframework.stereotype.Component;
8+
//
9+
//import java.time.LocalDateTime;
10+
//
11+
//@Component
12+
//@Profile("local") // 배포환경에서는 작동 안 하도록
13+
//@RequiredArgsConstructor
14+
//public class InitTriggerV2 implements ApplicationListener<ApplicationReadyEvent> {
15+
//
16+
// private final InitServiceV2 initService;
17+
//
18+
// @Override
19+
// public void onApplicationEvent(ApplicationReadyEvent event) {
20+
// LocalDateTime reserveDate = LocalDateTime.now();
21+
// LocalDateTime startDate = reserveDate.plusDays(1);
22+
// // ticketCount, userCount는 필요에 따라 조정
23+
// initService.initialize(3000, 10000, startDate, reserveDate);
24+
// }
25+
//
26+
//}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.quickpick.ureca.V2.reserve.controller;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.web.bind.annotation.RequestMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
7+
@RestController
8+
@RequiredArgsConstructor
9+
@RequestMapping("/v2")
10+
public class ReserveControllerV2 {
11+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.quickpick.ureca.V2.reserve.domain;
2+
3+
import com.quickpick.ureca.V2.user.domain.UserV2;
4+
import jakarta.persistence.*;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Entity
9+
@Getter
10+
@NoArgsConstructor
11+
public class ReserveV2 {
12+
@Id
13+
@GeneratedValue(strategy = GenerationType.IDENTITY)
14+
@Column(name = "reserve_id")
15+
private Long reserveId;
16+
17+
@ManyToOne(fetch = FetchType.LAZY)
18+
@JoinColumn(name = "user_id", nullable = false)
19+
private UserV2 user;
20+
21+
@Column(nullable = false)
22+
private String status;
23+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.quickpick.ureca.V2.reserve.repository;
2+
3+
import com.quickpick.ureca.V2.reserve.domain.ReserveV2;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface ReserveRepositoryV2 extends JpaRepository<ReserveV2, Long> {
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.quickpick.ureca.V2.reserve.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
7+
@Service
8+
@Transactional(readOnly = true)
9+
@RequiredArgsConstructor
10+
public class ReserveServiceImplV2 implements ReserveServiceV2 {
11+
12+
13+
14+
}

0 commit comments

Comments
 (0)