Skip to content

Commit 4d10f1f

Browse files
committed
chore: 충돌 해결
2 parents 3d67f52 + 0973899 commit 4d10f1f

33 files changed

Lines changed: 503 additions & 49 deletions

build.gradle

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ plugins {
77
group = 'com.example'
88
version = '0.0.1-SNAPSHOT'
99

10+
java {
11+
sourceCompatibility = '17'
12+
}
13+
1014
configurations {
1115
compileOnly {
1216
extendsFrom annotationProcessor
@@ -23,10 +27,12 @@ dependencies {
2327
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
2428
implementation 'org.springframework.boot:spring-boot-starter-validation'
2529
implementation 'org.springframework.boot:spring-boot-starter-web'
30+
2631
compileOnly 'org.projectlombok:lombok'
2732
developmentOnly 'org.springframework.boot:spring-boot-devtools'
2833
implementation 'com.mysql:mysql-connector-j'
2934
annotationProcessor 'org.projectlombok:lombok'
35+
3036
testImplementation 'org.springframework.boot:spring-boot-starter-test'
3137
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
3238

@@ -38,9 +44,7 @@ dependencies {
3844
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
3945
// security
4046
implementation 'org.springframework.security:spring-security-crypto:6.2.2'
41-
4247
implementation 'org.springframework.security:spring-security-oauth2-jose'
43-
4448
implementation 'org.springframework.boot:spring-boot-starter-mail'
4549
implementation 'com.sun.mail:jakarta.mail:2.0.1'
4650

@@ -50,6 +54,19 @@ dependencies {
5054
// jwt
5155
implementation 'com.auth0:java-jwt:4.4.0'
5256

57+
// health check
58+
implementation 'org.springframework.boot:spring-boot-starter-actuator'
59+
60+
// redisson
61+
implementation 'org.redisson:redisson-spring-boot-starter:3.35.0'
62+
63+
// QueryDSL (Jakarta 기반)
64+
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
65+
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
66+
// 필요시 jakarta API 추가
67+
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
68+
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
69+
5370
}
5471

5572
tasks.named('test') {
@@ -59,3 +76,13 @@ tasks.named('test') {
5976
jar {
6077
enabled=false
6178
}
79+
80+
81+
sourceSets {
82+
main.java.srcDir 'build/generated/sources/annotationProcessor/java/main'
83+
}
84+
85+
clean {
86+
delete file('build/generated/sources/annotationProcessor/java/main')
87+
}
88+

src/main/java/com/example/braveCoward/batchinsert/DataInsertController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.time.Duration;
44
import java.time.Instant;
55

6+
import com.example.braveCoward.global.exectime.ExecutionTimeLogger;
67
import org.springframework.http.ResponseEntity;
78
import org.springframework.web.bind.annotation.PostMapping;
89
import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,6 +21,7 @@ public class DataInsertController implements DataInsertApi {
2021
private final DataInsertService dataInsertService;
2122

2223
@PostMapping("batch-insert")
24+
@ExecutionTimeLogger
2325
public ResponseEntity<String> insertData(@RequestParam(defaultValue = "1743") int numTeams) {
2426
Instant start = Instant.now(); // ✅ 시작 시간 기록
2527

src/main/java/com/example/braveCoward/batchinsert/DataInsertService.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void insertLargeData(int numTeams) {
128128

129129
for (int d = 0; d < 6; d++) {
130130
LocalDate date = LocalDate.now().minusDays(random.nextInt(30));
131-
String description = "Do " + UUID.randomUUID().toString().substring(0, 5);
131+
String description = "DoDescriptionTest " + UUID.randomUUID().toString().substring(0, 5);
132132
LocalDateTime createdAt = randomDateTime();
133133
LocalDateTime updatedAt = createdAt.plusDays(random.nextInt(30));
134134

@@ -142,7 +142,13 @@ public void insertLargeData(int numTeams) {
142142
}
143143

144144
private void batchInsert(String sql, List<Object[]> batchList) {
145-
jdbcTemplate.batchUpdate(sql, batchList);
145+
int batchSize = 500; // 한 번에 500개씩 삽입
146+
147+
for (int i = 0; i < batchList.size(); i += batchSize) {
148+
int endIndex = Math.min(i + batchSize, batchList.size());
149+
List<Object[]> batchSubList = batchList.subList(i, endIndex);
150+
jdbcTemplate.batchUpdate(sql, batchSubList);
151+
}
146152
}
147153

148154
private List<Long> getInsertedIds(String tableName, int limit) {
@@ -171,4 +177,4 @@ private Long getTeamIdForProject(Long projectId) {
171177
private Long getProjectIdForPlan(Long planId) {
172178
return jdbcTemplate.queryForObject("SELECT project_id FROM plan WHERE id = ?", Long.class, planId);
173179
}
174-
}
180+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.example.braveCoward.config;
2+
3+
import com.querydsl.jpa.impl.JPAQueryFactory;
4+
import jakarta.persistence.EntityManager;
5+
import jakarta.persistence.PersistenceContext;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
public class QuerydslConfig {
11+
12+
@PersistenceContext
13+
private EntityManager entityManager;
14+
15+
@Bean
16+
public JPAQueryFactory jpaQueryFactory() {
17+
return new JPAQueryFactory(entityManager);
18+
}
19+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.example.braveCoward.config;
2+
3+
import org.redisson.Redisson;
4+
import org.redisson.api.RedissonClient;
5+
import org.redisson.config.Config;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
10+
@Configuration
11+
public class RedissonConfig {
12+
13+
@Value("${spring.data.redis.host}")
14+
private String redisHost;
15+
16+
@Value("${spring.data.redis.port}")
17+
private int redisPort;
18+
19+
private static final String REDISSION_HOST_PREFIX = "redis://";
20+
21+
@Bean
22+
public RedissonClient redissionClient() {
23+
Config config = new Config();
24+
config.useSingleServer()
25+
.setAddress(REDISSION_HOST_PREFIX + redisHost + ":" + redisPort);
26+
return Redisson.create(config);
27+
}
28+
}

src/main/java/com/example/braveCoward/config/WebMVCConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
99
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
1010

11-
import com.example.braveCoward.global.ExtractAuthenticationInterceptor;
12-
import com.example.braveCoward.global.UserIdArgumentResolver;
11+
import com.example.braveCoward.global.extractuserid.ExtractAuthenticationInterceptor;
12+
import com.example.braveCoward.global.extractuserid.UserIdArgumentResolver;
1313

1414
import lombok.RequiredArgsConstructor;
1515

src/main/java/com/example/braveCoward/controller/DoController.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.braveCoward.controller;
22

3+
import com.example.braveCoward.global.exectime.ExecutionTimeLogger;
34
import org.springframework.data.domain.Page;
45
import org.springframework.http.ResponseEntity;
56
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -53,15 +54,19 @@ public ResponseEntity<Void> deleteDo(
5354
}
5455

5556
@GetMapping("/plan/{planId}")
56-
public ResponseEntity<DosResponse> getDoList(
57+
@ExecutionTimeLogger
58+
public ResponseEntity<Page<DoResponse>> getDoList(
5759
@PathVariable Long planId,
58-
PageDTO pageDTO
60+
@RequestParam(defaultValue = "1") @Min(1) int page,
61+
@RequestParam(defaultValue = "10") @Min(1) int size
5962
) {
60-
DosResponse response = doService.getDos(planId, pageDTO);
63+
PageDTO pageDTO = new PageDTO(page, size);
64+
Page<DoResponse> response = doService.getDos(planId, pageDTO);
6165
return ResponseEntity.ok(response);
6266
}
6367

6468
@GetMapping("/{doId}")
69+
@ExecutionTimeLogger
6570
public ResponseEntity<DoResponse> getDo(
6671
@PathVariable Long doId
6772
) {
@@ -87,6 +92,7 @@ public ResponseEntity<Void> changeDo(
8792
}
8893

8994
@GetMapping("/search")
95+
@ExecutionTimeLogger
9096
public ResponseEntity<Page<DoResponse>> searchDo(
9197
@RequestParam String keyword,
9298
@RequestParam Long projectId,
@@ -98,6 +104,46 @@ public ResponseEntity<Page<DoResponse>> searchDo(
98104
return ResponseEntity.ok(responses);
99105
}
100106

107+
108+
@GetMapping("/searchQueryDSL")
109+
@ExecutionTimeLogger
110+
public ResponseEntity<Page<DoResponse>> searchDoWithQueryDSL(
111+
@RequestParam String keyword,
112+
@RequestParam Long projectId,
113+
@RequestParam(defaultValue = "1") @Min(1) int page,
114+
@RequestParam(defaultValue = "10") @Min(1) int size
115+
) {
116+
PageDTO pageDTO = new PageDTO(page, size);
117+
Page<DoResponse> responses = doService.searchDoWithQueryDSL(keyword, projectId, pageDTO);
118+
return ResponseEntity.ok(responses);
119+
}
120+
121+
@GetMapping("/searchStartsWith")
122+
@ExecutionTimeLogger
123+
public ResponseEntity<Page<DoResponse>> searchDoStartsWith(
124+
@RequestParam String keyword,
125+
@RequestParam Long projectId,
126+
@RequestParam(defaultValue = "1") @Min(1) int page,
127+
@RequestParam(defaultValue = "10") @Min(1) int size
128+
) {
129+
PageDTO pageDTO = new PageDTO(page, size);
130+
Page<DoResponse> responses = doService.searchDoStartsWith(keyword, projectId, pageDTO);
131+
return ResponseEntity.ok(responses);
132+
}
133+
134+
@GetMapping("/searchFullText")
135+
@ExecutionTimeLogger
136+
public ResponseEntity<Page<DoResponse>> searchDoFullText(
137+
@RequestParam String keyword,
138+
@RequestParam Long projectId,
139+
@RequestParam(defaultValue = "1") @Min(1) int page,
140+
@RequestParam(defaultValue = "10") @Min(1) int size
141+
) {
142+
PageDTO pageDTO = new PageDTO(page, size);
143+
Page<DoResponse> responses = doService.searchDoFullText(keyword, projectId, pageDTO);
144+
return ResponseEntity.ok(responses);
145+
}
146+
101147
@PatchMapping("/complete/{doId}")
102148
public ResponseEntity<Void> completeDo(
103149
@PathVariable Long doId

src/main/java/com/example/braveCoward/controller/PlanController.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.example.braveCoward.controller;
22

3-
import java.util.List;
4-
53
import org.springframework.data.domain.Page;
64
import org.springframework.http.ResponseEntity;
75
import org.springframework.web.bind.annotation.DeleteMapping;

src/main/java/com/example/braveCoward/controller/ProjectController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.example.braveCoward.dto.project.ProjectCreateRequest;
44
import com.example.braveCoward.dto.project.ProjectCreateResponse;
55

6-
import com.example.braveCoward.global.UserId;
6+
import com.example.braveCoward.global.extractuserid.UserId;
77
import com.example.braveCoward.dto.project.ProjectResponse;
88

99
import com.example.braveCoward.service.ProjectService;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.example.braveCoward.global.concurrencyguard;
2+
3+
import static java.lang.annotation.ElementType.METHOD;
4+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
5+
6+
import java.lang.annotation.Documented;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.Target;
9+
import java.util.concurrent.TimeUnit;
10+
11+
import org.springframework.context.annotation.Profile;
12+
13+
@Documented
14+
@Target(METHOD)
15+
@Retention(RUNTIME)
16+
@Profile("!test")
17+
public @interface ConcurrencyGuard {
18+
String lockName();
19+
long waitTime() default 5L;
20+
long leaseTime() default 3L;
21+
TimeUnit timeUnit() default TimeUnit.SECONDS;
22+
}

0 commit comments

Comments
 (0)