Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
e72c534
[Fix]Test 코드 수정
hykim02 Mar 24, 2025
1dbbc56
[Fix]public 접근지정자 private으로 변경(캡슐화)
hykim02 Mar 26, 2025
b91f4a7
[Refactor]CafeteriaServiceV2 단일 책임 원칙 적용하여 클래스 분리
hykim02 Mar 27, 2025
f19aa3d
Update Java CI-CD.yml
hykim02 Mar 27, 2025
7f9a50e
merge conflict 해결
hykim02 Mar 27, 2025
0c7cd50
merge conflict 해결 중
hykim02 Mar 27, 2025
dd851d2
[Refactor]CampusServiceV2 클래스 분리
hykim02 Mar 27, 2025
c098a0c
merge conflict
hykim02 Mar 27, 2025
2a7290c
Merge branch 'main' of https://github.com/GNU-connect/Server-JavaSpring
hykim02 Mar 27, 2025
fbca9f3
[Refactor]DietServiceV2 서비스 클래스 분리
hykim02 Mar 27, 2025
4e67e9e
merge
hykim02 Apr 16, 2025
a4eb0a9
[fix]caheable 주석 처리 - 잠깐 보류
hykim02 Apr 17, 2025
e70e82b
[fix]Cafeteria Cacheable 주석처리
hykim02 Apr 17, 2025
9b7b803
Merge branch 'main' into main
hykim02 Apr 17, 2025
00f3532
[Refactor]캐시 적용 및 중복로직 최적화
hykim02 Apr 17, 2025
6f829d9
[Refactor]캐시 적용 및 중복 로직 최적화
hykim02 Apr 17, 2025
931b37c
Merge remote-tracking branch 'origin/main'
hykim02 Apr 17, 2025
cbd71ef
[fix]userService에서 발생한 hikariCP connection error 찾는 중
hykim02 Apr 21, 2025
bd75fde
Merge branch 'main' into main
hykim02 Apr 21, 2025
0165d50
[Test]HikariCP 멀티스레드 환경 테슽
hykim02 Apr 21, 2025
14c8c57
[Fix]conflict 해결
hykim02 Apr 21, 2025
f5d6eea
Merge branch 'GNU-connect:main' into main
hykim02 Apr 21, 2025
17ab978
merge 충돌
hykim02 Apr 21, 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
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// 테스트 코드에서 Lombok 사용할 경우 필요
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
compileOnly 'javax:javaee-api:8.0.1'

// 테스트를 위한 h2 설정
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.example.Jinus.service.v2.userInfo;

import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.Map;
import java.util.Optional;

Expand Down Expand Up @@ -39,4 +38,12 @@ public int getUserDepartmentId(String userId) {
return parentDepartmentMap.getOrDefault(departmentId, departmentId);
}

// hikariCP test
@Transactional
public void selectCampusIdTest(String userId) throws InterruptedException {
log.info("selectCampusIdTest 시작 - userId: {}", userId);
Thread.sleep(2500); // 커넥션을 5초간 점유 (풀 점유 시 타임아웃 유도)
userRepositoryV2.findCampusIdById(userId);
log.info("selectCampusIdTest 종료 - userId: {}", userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.example.Jinus.service.userInfo;

import com.example.Jinus.service.v2.userInfo.UserServiceV2;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.HikariPoolMXBean;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import javax.sql.DataSource;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Slf4j
@SpringBootTest
@ActiveProfiles("test")
public class UserServiceHikariCPTest {

@Autowired
private UserServiceV2 userService;

@Autowired
private DataSource dataSource;

@Test
@DisplayName("멀티스레드 10개 생성 후 id 조회")
void hikariConnectionTimeoutTest() throws InterruptedException {
int threadCount = 10;
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
CountDownLatch latch = new CountDownLatch(threadCount);

for (int i = 0; i < threadCount; i++) {
final int userNo = i;
executor.submit(() -> {
try {
log.info(">> [{}] 서비스 호출 시작", userNo);
userService.selectCampusIdTest("user" + userNo);
log.info(">> [{}] 서비스 호출 완료", userNo);
} catch (Exception e) {
log.error(">> [{}] 예외 발생: {}", userNo, e.getMessage());
} finally {
latch.countDown();
}
});
}

// 커넥션 풀 상태 모니터링 (2초마다 찍기)
for (int i = 0; i < 5; i++) {
printHikariStatus();
Thread.sleep(2000);
}

latch.await();
executor.shutdown();
}

private void printHikariStatus() {
if (!(dataSource instanceof HikariDataSource hikariDataSource)) {
log.warn("데이터소스는 Hikari가 아님: {}", dataSource.getClass());
return;
}

HikariPoolMXBean poolStats = hikariDataSource.getHikariPoolMXBean();
log.info("### HikariCP 상태 체크 -> 총: {}, 사용 중: {}, 유휴: {}, 대기중 쓰레드: {}",
poolStats.getTotalConnections(),
poolStats.getActiveConnections(),
poolStats.getIdleConnections(),
poolStats.getThreadsAwaitingConnection()
);
}
}
14 changes: 12 additions & 2 deletions src/test/resources/application-test.properties
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Datasource ??
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

# H2 ??????? Hibernate dialect(JPA? ??? ?????? ???? ????)
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Expand All @@ -14,4 +15,13 @@ spring.jpa.properties.hibernate.format_sql=true

# H2 ?? ??
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.h2.console.path=/h2

spring.datasource.hikari.maximumPoolSize=4
spring.datasource.hikari.connectionTimeout=3000
spring.datasource.hikari.maxLifetime=50000
spring.datasource.hikari.idleTimeout=0
spring.datasource.hikari.keepaliveTime=30000
spring.datasource.hikari.validationTimeout=1000
logging.level.com.zaxxer.hikari=trace
logging.level.com.zaxxer.hikari.HikariConfig=debug
Loading