Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
5554d6a
Create CI.yml
Suhun0331 Apr 30, 2025
0d464aa
Feat : CI setting
Suhun0331 Apr 30, 2025
4079440
Test
etoile0626 Apr 30, 2025
8d03ed4
issue test (#1)
etoile0626 Apr 30, 2025
fe6888a
Feat : add db info
Suhun0331 Apr 30, 2025
7fe6839
Fix : fix ci error
Suhun0331 Apr 30, 2025
02e5843
Merge pull request #2 from Ureca-QuickPick/feature/CI
Suhun0331 Apr 30, 2025
5a5f57b
Test
etoile0626 Apr 30, 2025
fcaffd2
issue test (#1)
etoile0626 Apr 30, 2025
fd14f8a
Refactor : change CI range, delete DB id, pw
Suhun0331 Apr 30, 2025
5ca9f21
Merge pull request #3 from Ureca-QuickPick/feature/CI
Suhun0331 Apr 30, 2025
3037eb6
Merge remote-tracking branch 'origin/feature/entity' into feature/entity
etoile0626 Apr 30, 2025
1a2c7b3
user(연관관계 미완성), reserve 객체 추가
etoile0626 Apr 30, 2025
e423925
user, reserve 객체 추가 (연관 관계 미완성)
etoile0626 Apr 30, 2025
397459d
user, reserve 객체 추가 (연관 관계 단방향)
etoile0626 Apr 30, 2025
c96b0ba
Ignore application.properties
etoile0626 Apr 30, 2025
0a93661
test
etoile0626 Apr 30, 2025
c531fcb
test2
etoile0626 Apr 30, 2025
07f57f3
user, reserve 객체 추가 (연관 관계 단방향)
etoile0626 Apr 30, 2025
7a5cce0
feat: Ticket 도메인 추가
tmdals1207 Apr 30, 2025
7946e25
user(연관관계 미완성), reserve 객체 추가 (#1)
etoile0626 Apr 30, 2025
e2dedda
user, reserve 객체 추가 (연관 관계 미완성) (#1)
etoile0626 Apr 30, 2025
6f67417
user, reserve 객체 추가 (연관 관계 단방향) (#1)
etoile0626 Apr 30, 2025
5061746
Ignore application.properties (#1)
etoile0626 Apr 30, 2025
5d00b4c
test (#1)
etoile0626 Apr 30, 2025
45d84c9
Refactor : change CI range, delete DB id, pw (#1)
Suhun0331 Apr 30, 2025
a9edf2f
user, reserve 객체 추가 (연관 관계 단방향) (#1)
etoile0626 Apr 30, 2025
fa6b1f8
feat: Ticket 도메인 추가 (#1)
tmdals1207 Apr 30, 2025
b3020b6
feat: User와 Ticket 사이의 다대다 매핑 UserTicket 도메인 생성으로 분리 (#1)
tmdals1207 May 1, 2025
d57424c
Feat : CI test
Suhun0331 May 1, 2025
daf4c66
Add text
Suhun0331 May 1, 2025
1228f1f
merge: origin/feature/entity into feature/entity (#1)
etoile0626 May 1, 2025
4f36511
Fix path
Suhun0331 May 1, 2025
53d6da2
Delete src/main/resources/application.properties
Suhun0331 May 1, 2025
fa74cf0
Merge pull request #5 from Ureca-QuickPick/feature/CI
Suhun0331 May 1, 2025
fb49514
Feat : CI test
tmdals1207 May 1, 2025
b257b7b
feat: test
etoile0626 May 1, 2025
5654c32
Merge remote-tracking branch 'origin/feature/entity' into feature/entity
etoile0626 May 1, 2025
ab4ef53
feat: test (#1)
etoile0626 May 1, 2025
26e87a6
feat: test (#1)
etoile0626 May 1, 2025
966e05f
Merge pull request #6 from Ureca-QuickPick/feature/entity
tmdals1207 May 1, 2025
c58044d
Feat : extend baseEntity
Suhun0331 May 1, 2025
3f0a62f
Refactor : clear unused import
Suhun0331 May 1, 2025
62548b1
Feat : 이거부터 다시 시작 ~
Suhun0331 May 1, 2025
f66c9f3
Feat : 이거부터 다시 시작 ~ ver_2
Suhun0331 May 1, 2025
b7c88fb
Merge pull request #7 from Ureca-QuickPick/feature/base
Suhun0331 May 1, 2025
a73d131
setting: feat/v3 브랜치 등록
sangyunpark99 May 2, 2025
08aa69f
feat: V3 Kafka 버전 1번
sangyunpark99 May 3, 2025
e7a6ec4
chore: V3 Kafka 버전 1번 테스트 환경 구성
sangyunpark99 May 7, 2025
c25e536
chore: v3폴더로 이동
sangyunpark99 May 13, 2025
df8664c
feat: docker 삭제
sangyunpark99 May 13, 2025
093fefe
fix: CI오류 해결을 위한 test코드 주석처리
sangyunpark99 May 13, 2025
3a5bdc0
refactor: 클래스마다 버전 이름 추가
sangyunpark99 May 13, 2025
ed42b6c
feat: 티켓 데이터 초기화해주는 initController 구현
sangyunpark99 May 13, 2025
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
62 changes: 62 additions & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: CI FOR MVP

on:
push:
# branches-ignore:
# - main
# - develop

jobs:
CI:
name: Continuous Integration
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Setup MySQL
uses: mirromutth/[email protected]
with:
mysql database: 'testDB'
mysql user: 'test'
mysql password: 'testPW'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5

- name: Get short SHA
id: slug
run: echo "sha7=$(echo ${GITHUB_SHA} | cut -c1-7)" >> $GITHUB_OUTPUT

- name: Create application.properties
run: |
cat <<EOT > ./src/main/resources/application.properties
spring.application.name=ureca

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testDB?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
spring.datasource.username=test
spring.datasource.password=testPW

# spring jpa
spring.jpa.database=mysql
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.format_sql=true
EOT
shell: bash

- name: Grant execute permission for gradlew
run: chmod +x ./gradlew

- name: Build with Gradle Wrapper
run: ./gradlew build
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ out/

### VS Code ###
.vscode/

/src/main/resources/application.properties
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.kafka:spring-kafka'
implementation 'com.fasterxml.jackson.core:jackson-databind'

testImplementation 'org.springframework.kafka:spring-kafka-test'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
8 changes: 5 additions & 3 deletions src/main/java/com/quickpick/ureca/UrecaApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
public class UrecaApplication {

public static void main(String[] args) {
SpringApplication.run(UrecaApplication.class, args);
}

}
}
26 changes: 26 additions & 0 deletions src/main/java/com/quickpick/ureca/v3/common/BaseEntityV3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.quickpick.ureca.v3.common;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntityV3 {
@CreatedDate
@Column(length = 6, name = "created_at", updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
@Column(length = 6, name = "updated_at")
private LocalDateTime updatedAt;

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.quickpick.ureca.v3.config;

import com.quickpick.ureca.v3.ticket.event.TicketPurchaseEventV3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;

@Configuration
public class KafkaConsumerConfigV3 {

@Bean
public ConcurrentKafkaListenerContainerFactory<String, TicketPurchaseEventV3> batchFactory(
ConsumerFactory<String, TicketPurchaseEventV3> consumerFactory) {

ConcurrentKafkaListenerContainerFactory<String, TicketPurchaseEventV3> factory =
new ConcurrentKafkaListenerContainerFactory<>();

factory.setConsumerFactory(consumerFactory);
factory.setBatchListener(true); // 핵심
factory.setConcurrency(3);
return factory;
}
}
59 changes: 59 additions & 0 deletions src/main/java/com/quickpick/ureca/v3/init/InitControllerV3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.quickpick.ureca.v3.init;

import com.quickpick.ureca.v3.ticket.domain.TicketV3;
import com.quickpick.ureca.v3.ticket.repository.RedisStockRepositoryV3;
import com.quickpick.ureca.v3.ticket.repository.TicketRepositoryV3;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/v3/init")
@RequiredArgsConstructor
public class InitControllerV3 {

private final TicketRepositoryV3 ticketRepositoryV3;
private final RedisStockRepositoryV3 redisStockRepositoryV3;
private final JdbcTemplate jdbcTemplate;

@PostMapping
@Transactional
public void init() {

String sql = "INSERT INTO user (user_id, name, age, gender, password) VALUES (?, ?, ?, ?, ?)";
List<Object[]> batchArgs = new ArrayList<>();

for (long i = 1; i <= 10000; i++) {
batchArgs.add(new Object[]{
i,
"abc" + i,
i+20,
"MALE",
"password" + i

});
}

jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println("=== 10만명 유저 생성 완료 ===");


TicketV3 ticketV3 = TicketV3.builder()
.name("ticket")
.quantity(3000L)
.reserveTime(LocalDateTime.now())
.startDate(LocalDate.now())
.build();

TicketV3 saveTicketV3 = ticketRepositoryV3.save(ticketV3);
redisStockRepositoryV3.setTicket(saveTicketV3.getId(), 3000L);
}
}
57 changes: 57 additions & 0 deletions src/main/java/com/quickpick/ureca/v3/init/InitDataLoaderV3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//package com.quickpick.ureca.v3.init;
//
//import com.quickpick.ureca.v3.ticket.domain.TicketV3;
//import com.quickpick.ureca.v3.ticket.repository.RedisStockRepositoryV3;
//import com.quickpick.ureca.v3.ticket.repository.TicketRepositoryV3;
//import jakarta.transaction.Transactional;
//import lombok.RequiredArgsConstructor;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.stereotype.Component;
//
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.util.ArrayList;
//import java.util.List;
//
//@Component
//@RequiredArgsConstructor
//public class InitDataLoaderV3 implements CommandLineRunner {
//
// private final TicketRepositoryV3 ticketRepositoryV3;
// private final RedisStockRepositoryV3 redisStockRepositoryV3;
// private final JdbcTemplate jdbcTemplate;
//
// @Transactional
// @Override
// public void run(String... args) {
// String sql = "INSERT INTO user (user_id, name, age, gender, password) VALUES (?, ?, ?, ?, ?)";
//
// List<Object[]> batchArgs = new ArrayList<>();
//
// for (long i = 1; i <= 10000; i++) {
// batchArgs.add(new Object[]{
// i,
// "abc" + i,
// i+20,
// "MALE",
// "password" + i
//
// });
// }
//
// jdbcTemplate.batchUpdate(sql, batchArgs);
// System.out.println("=== 10만명 유저 생성 완료 ===");
//
//
// TicketV3 ticketV3 = TicketV3.builder()
// .name("ticket")
// .quantity(3000L)
// .reserveTime(LocalDateTime.now())
// .startDate(LocalDate.now())
// .build();
//
// TicketV3 saveTicketV3 = ticketRepositoryV3.save(ticketV3);
// redisStockRepositoryV3.setTicket(saveTicketV3.getId(), 3000L);
// }
//}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.quickpick.ureca.v3.reserve.domain;

public enum ReserveStatusV3 {
SUCCESS, FAIL
}
27 changes: 27 additions & 0 deletions src/main/java/com/quickpick/ureca/v3/reserve/domain/ReserveV3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.quickpick.ureca.v3.reserve.domain;

import com.quickpick.ureca.v3.common.BaseEntityV3;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ReserveV3 extends BaseEntityV3 {

@Column(name = "reserve_id")
@Id @GeneratedValue
private Long id;

@Column(name = "user_id")
private Long userId;

@Column(nullable = false)
private ReserveStatusV3 status;
}
15 changes: 15 additions & 0 deletions src/main/java/com/quickpick/ureca/v3/ticket/ExceptionHandlers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.quickpick.ureca.v3.ticket;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ExceptionHandlers {

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleFileException() {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("티켓팅 실패");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.quickpick.ureca.v3.ticket.controller;

import com.quickpick.ureca.v3.ticket.service.TicketServiceV3;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RequestMapping("/v3/tickets")
@RequiredArgsConstructor
@RestController
public class TicketControllerV3 {

private final TicketServiceV3 ticketServiceV3;

@PostMapping("/{ticketId}/purchase")
public String purchaseTicket(@PathVariable Long ticketId, @RequestParam Long userId) {
ticketServiceV3.purchaseTicket(ticketId, userId, 1L);
return "success";
}
}
34 changes: 34 additions & 0 deletions src/main/java/com/quickpick/ureca/v3/ticket/domain/TicketV3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.quickpick.ureca.v3.ticket.domain;

import com.quickpick.ureca.v3.common.BaseEntityV3;
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity
@Table(name = "tickets")
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TicketV3 extends BaseEntityV3 {

@Id
@Column(name = "ticket_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private Long quantity;

@Column(nullable = false)
private LocalDate startDate;

@Column(nullable = false)
private LocalDateTime reserveTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.quickpick.ureca.v3.ticket.event;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TicketPurchaseEventV3 {
private String uuid;
private Long ticketId;
private Long userId;
private Long quantity;
private String time;
}
Loading
Loading