From 28a874f4dc2ab4ec092dc8b04c5660b0dcec8444 Mon Sep 17 00:00:00 2001 From: can019 Date: Tue, 16 Sep 2025 11:08:43 +0900 Subject: [PATCH 1/2] chore: e2e loki test set up --- .../main/resources/application-test-e2e.yml | 2 +- .../src/main/resources/log4j2-develop.yml | 23 +++ .../src/main/resources/log4j2-test-e2e.yml | 168 ++++++++++++++++++ .../setup/config/E2eTestConfiguration.java | 25 ++- 4 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 apps/user-service/src/main/resources/log4j2-test-e2e.yml diff --git a/apps/user-service/src/main/resources/application-test-e2e.yml b/apps/user-service/src/main/resources/application-test-e2e.yml index f7dceba9..3a777909 100644 --- a/apps/user-service/src/main/resources/application-test-e2e.yml +++ b/apps/user-service/src/main/resources/application-test-e2e.yml @@ -18,4 +18,4 @@ mybatis: map-underscore-to-camel-case: true logging: - config: classpath:log4j2-production.yml \ No newline at end of file + config: classpath:log4j2-test-e2e.yml \ No newline at end of file diff --git a/apps/user-service/src/main/resources/log4j2-develop.yml b/apps/user-service/src/main/resources/log4j2-develop.yml index 69833c98..41a369bf 100644 --- a/apps/user-service/src/main/resources/log4j2-develop.yml +++ b/apps/user-service/src/main/resources/log4j2-develop.yml @@ -61,6 +61,29 @@ Configuration: - name: "runId" value: "${ctx:runId}" +# ExecutionDB: +# name: ExecutionDB +# class: org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender +# tableName: execution_log +# columnMappings: +# - name: log_level +# pattern: "%level" +# - name: log_message +# pattern: "%message" +# - name: trace_id +# pattern: "%X{traceId}" +# - name: execution_type +# pattern: "%X{executionType}" +# - name: source_id +# pattern: "%X{sourceId}" +# - name: run_id +# pattern: "%X{runId}" +# - name: executed_at +# pattern: "%d{yyyy-MM-dd HH:mm:ss}" +# connectionSource: +# class: org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource +# dataSource: "#dataSource + # 개발용 일반 로그 파일 File: - name: file-dev-appender diff --git a/apps/user-service/src/main/resources/log4j2-test-e2e.yml b/apps/user-service/src/main/resources/log4j2-test-e2e.yml new file mode 100644 index 00000000..557f426b --- /dev/null +++ b/apps/user-service/src/main/resources/log4j2-test-e2e.yml @@ -0,0 +1,168 @@ +Configuration: + status: DEBUG + name: e2e + + properties: + property: + - name: "app-name" + value: "user-service" + - name: "log-path" + value: "./logs" + - name: "charset-UTF-8" + value: "UTF-8" + # DEBUG 환경용 콘솔 패턴 - 더 간단하고 가독성 좋게 + - name: "console-layout-pattern" + value: "%highlight{[%-5level]} [%X{traceId}] [%X{spanId}] %d{HH:mm:ss} [%t] %n %logger{20} - %msg%n%n " + # 파일용 패턴 + - name: "file-layout-pattern" + value: "[%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" + # 개발 환경용 로그 파일들 + - name: "dev-log" + value: ${log-path}/develop/app.log + - name: "error-log" + value: ${log-path}/develop/error.log + + Appenders: + # 콘솔 출력 - 개발 시 주요 출력 + Console: + name: console-appender + target: SYSTEM_OUT + PatternLayout: + pattern: ${console-layout-pattern} + disableAnsi: false + + Loki: + name: loki-appender + host: localhost + port: ${sys:loki.port} + JsonLayout: + compact: true + eventEol: true + includeStacktrace: true + KeyValuePair: + - key: "app" + value: "${app-name}" + - key: "env" + value: "test-e2e" + Label: + - name: "app" + value: "${app-name}" + - name: "env" + value: "test-e2e" + - name: "traceId" + value: "${ctx:traceId}" + - name: "spanId" + value: "${ctx:spanId}" + - name: "executionType" + value: "${ctx:executionType:-application}" + - name: "sourceId" + value: "${ctx:sourceId}" + - name: "runId" + value: "${ctx:runId}" + +# ExecutionDB: +# name: ExecutionDB +# class: org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender +# tableName: execution_log +# columnMappings: +# - name: log_level +# pattern: "%level" +# - name: log_message +# pattern: "%message" +# - name: trace_id +# pattern: "%X{traceId}" +# - name: execution_type +# pattern: "%X{executionType}" +# - name: source_id +# pattern: "%X{sourceId}" +# - name: run_id +# pattern: "%X{runId}" +# - name: executed_at +# pattern: "%d{yyyy-MM-dd HH:mm:ss}" +# connectionSource: +# class: org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource +# dataSource: "#dataSource + + # 개발용 일반 로그 파일 + File: + - name: file-dev-appender + fileName: ${dev-log} + PatternLayout: + pattern: ${file-layout-pattern} + - name: file-error-appender + fileName: ${error-log} + PatternLayout: + pattern: ${file-layout-pattern} + ThresholdFilter: + level: ERROR + + Loggers: + # Root 로거 - 개발환경에서는 기본적으로 INFO 레벨 + Root: + level: INFO + AppenderRef: + - ref: console-appender + + Logger: + # 애플리케이션 로그 - 개발 시 모든 레벨 + Loki 전송 + - name: site.icebang + additivity: false + level: DEBUG + AppenderRef: + - ref: console-appender + - ref: loki-appender + - ref: file-dev-appender + - ref: file-error-appender + + # Spring Framework - 개발 시 필요한 정보만 + - name: org.springframework + additivity: false + level: INFO + AppenderRef: + - ref: console-appender + - ref: file-dev-appender + + # Spring Security - 인증 디버깅용 + - name: org.springframework.security + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + - ref: file-dev-appender + - ref: loki-appender + + # 웹 요청 로그 - API 개발 시 유용 + - name: org.springframework.web + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + - ref: file-dev-appender + - ref: loki-appender + + # 트랜잭션 로그 - DB 작업 디버깅 + - name: org.springframework.transaction + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + - ref: file-dev-appender + - ref: loki-appender + + # HikariCP 로그 비활성화 + - name: com.zaxxer.hikari + level: OFF + + # SQL 로그 - 개발 시 쿼리 확인용 (필요시 활성화) + - name: org.hibernate.SQL + level: DEBUG + additivity: false + AppenderRef: + - ref: console-appender + + # 파라미터 바인딩 로그 (필요시 활성화) + - name: org.hibernate.type.descriptor.sql.BasicBinder + level: TRACE + additivity: false + AppenderRef: + - ref: console-appender \ No newline at end of file diff --git a/apps/user-service/src/test/java/site/icebang/e2e/setup/config/E2eTestConfiguration.java b/apps/user-service/src/test/java/site/icebang/e2e/setup/config/E2eTestConfiguration.java index 4976d0b8..dd5e0d1a 100644 --- a/apps/user-service/src/test/java/site/icebang/e2e/setup/config/E2eTestConfiguration.java +++ b/apps/user-service/src/test/java/site/icebang/e2e/setup/config/E2eTestConfiguration.java @@ -5,8 +5,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.MariaDBContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; +import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) public class E2eTestConfiguration { @@ -15,6 +19,11 @@ public ObjectMapper objectMapper() { return new ObjectMapper(); } + @Bean + public Network testNetwork() { + return Network.newNetwork(); + } + @Bean @ServiceConnection MariaDBContainer mariadbContainer() { @@ -24,8 +33,20 @@ MariaDBContainer mariadbContainer() { .withPassword("qwer1234"); } + @Bean + GenericContainer lokiContainer(Network network) { + return new GenericContainer<>(DockerImageName.parse("grafana/loki:2.9.0")) + .withNetwork(network) + .withNetworkAliases("loki") + .withExposedPorts(3100) + .withCommand("-config.file=/etc/loki/local-config.yaml") + .waitingFor(Wait.forHttp("/ready")) + .withStartupTimeout(java.time.Duration.ofMinutes(2)); + } + @DynamicPropertySource - static void configureProperties(DynamicPropertyRegistry registry, MariaDBContainer mariadb) { + static void configureProperties( + DynamicPropertyRegistry registry, MariaDBContainer mariadb, GenericContainer loki) { // MariaDB 연결 설정 registry.add("spring.datasource.url", mariadb::getJdbcUrl); registry.add("spring.datasource.username", mariadb::getUsername); @@ -39,5 +60,7 @@ static void configureProperties(DynamicPropertyRegistry registry, MariaDBContain registry.add("spring.hikari.maximum-pool-size", () -> "10"); registry.add("spring.hikari.minimum-idle", () -> "5"); registry.add("spring.hikari.pool-name", () -> "HikariCP-E2E"); + + System.setProperty("loki.port", String.valueOf(loki.getMappedPort(3100))); } } From 573ba8839d4c3dcc77e36598db24843550ee5d22 Mon Sep 17 00:00:00 2001 From: can019 Date: Tue, 16 Sep 2025 11:16:11 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20E2e=20test=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=ED=96=89=20=EC=A0=84=20truncate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/site/icebang/e2e/setup/support/E2eTestSupport.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/user-service/src/test/java/site/icebang/e2e/setup/support/E2eTestSupport.java b/apps/user-service/src/test/java/site/icebang/e2e/setup/support/E2eTestSupport.java index c2d10870..56a1259f 100644 --- a/apps/user-service/src/test/java/site/icebang/e2e/setup/support/E2eTestSupport.java +++ b/apps/user-service/src/test/java/site/icebang/e2e/setup/support/E2eTestSupport.java @@ -5,6 +5,7 @@ import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Import; +import org.springframework.test.context.jdbc.Sql; import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.context.WebApplicationContext; import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; @@ -15,6 +16,7 @@ @Import(E2eTestConfiguration.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @E2eTest +@Sql(value = "classpath:sql/00-truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_CLASS) public abstract class E2eTestSupport { @Autowired protected TestRestTemplate restTemplate;