diff --git a/discount-service/build.gradle b/discount-service/build.gradle index f210b82..ec207f2 100644 --- a/discount-service/build.gradle +++ b/discount-service/build.gradle @@ -37,6 +37,8 @@ dependencies { /*implementation 'org.springframework.boot:spring-boot-starter-security'*/ /*implementation 'org.springframework.cloud:spring-cloud-starter-config'*/ /*implementation 'org.springframework.kafka:spring-kafka'*/ + // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' diff --git a/discount-service/src/main/java/com/justpickup/discountservice/global/config/P6spyConfiguration.java b/discount-service/src/main/java/com/justpickup/discountservice/global/config/P6spyConfiguration.java new file mode 100644 index 0000000..9f6aebb --- /dev/null +++ b/discount-service/src/main/java/com/justpickup/discountservice/global/config/P6spyConfiguration.java @@ -0,0 +1,16 @@ +package com.justpickup.discountservice.global.config; + +import com.justpickup.discountservice.global.p6spy.CustomP6spySqlFormat; +import com.p6spy.engine.spy.P6SpyOptions; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +public class P6spyConfiguration { + + @PostConstruct + public void setMessageFormat() { + P6SpyOptions.getActiveInstance().setLogMessageFormat(CustomP6spySqlFormat.class.getName()); + } +} diff --git a/discount-service/src/main/java/com/justpickup/discountservice/global/p6spy/CustomP6spySqlFormat.java b/discount-service/src/main/java/com/justpickup/discountservice/global/p6spy/CustomP6spySqlFormat.java new file mode 100644 index 0000000..6e6b085 --- /dev/null +++ b/discount-service/src/main/java/com/justpickup/discountservice/global/p6spy/CustomP6spySqlFormat.java @@ -0,0 +1,67 @@ +package com.justpickup.discountservice.global.p6spy; + +import com.p6spy.engine.logging.Category; +import com.p6spy.engine.spy.appender.MessageFormattingStrategy; +import org.hibernate.engine.jdbc.internal.FormatStyle; + +import java.util.Locale; +import java.util.Stack; + +public class CustomP6spySqlFormat implements MessageFormattingStrategy { + // 표기에 허용되는 filter + private String ALLOW_FILTER = "com.justpickup"; + + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { + sql = formatSql(category, sql); + if(sql.trim().isEmpty()) { // sql 이 없다면 출력하지 않아도 됨 + return ""; + } + // stack 을 구성하는 Format을 만든다 + return sql + createStack(connectionId, elapsed); + } + + private String formatSql(String category,String sql) { + if(sql ==null || sql.trim().equals("")) return sql; + + // Only format Statement, distinguish DDL And DML + if (Category.STATEMENT.getName().equals(category)) { + String tmpsql = sql.trim().toLowerCase(Locale.ROOT); + if(tmpsql.startsWith("create") || tmpsql.startsWith("alter") || tmpsql.startsWith("comment")) { + sql = FormatStyle.DDL.getFormatter().format(sql); + }else { + sql = FormatStyle.BASIC.getFormatter().format(sql); + } + } + + return sql; + } + + // stack 콘솔 표기 + private String createStack(int connectionId, long elapsed) { + Stack callStack = new Stack<>(); + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + + for (StackTraceElement stackTraceElement : stackTrace) { + String trace = stackTraceElement.toString(); + + // trace 항목을 보고 내게 맞는 것만 필터 + if(trace.startsWith(ALLOW_FILTER)) { + callStack.push(trace); + } + } + + StringBuffer sb = new StringBuffer(); + int order = 1; + while (callStack.size() != 0) { + sb.append("\n\t\t" + (order++) + "." + callStack.pop()); + } + + return new StringBuffer().append("\n\n\tConnection ID:").append(connectionId) + .append(" | Execution Time:").append(elapsed).append(" ms\n") + .append("\n\tExecution Time:").append(elapsed).append(" ms\n") + .append("\n\tCall Stack :").append(sb).append("\n") + .append("\n--------------------------------------") + .toString(); + } +} diff --git a/discount-service/src/main/resources/application.yml b/discount-service/src/main/resources/application.yml index 41cae48..f793404 100644 --- a/discount-service/src/main/resources/application.yml +++ b/discount-service/src/main/resources/application.yml @@ -12,14 +12,12 @@ spring: jpa: hibernate: - ddl-auto: create-drop + ddl-auto: validate + generate-ddl: true + open-in-view: false properties: hibernate: - format_sql: true - show_sql: true - open-in-view: false - default_batch_fetch_size: 1000 - + default_batch_fetch_size: 1000 eureka: client: @@ -29,7 +27,11 @@ eureka: register-with-eureka: true instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} + logging: level: com.justpickup: DEBUG - org.hibernate.SQL: debug \ No newline at end of file + +# jpa query, parameter 로그 (p6spy) +decorator.datasource.p6spy: + enable-logging: true \ No newline at end of file diff --git a/notification-service/build.gradle b/notification-service/build.gradle index f210b82..ec207f2 100644 --- a/notification-service/build.gradle +++ b/notification-service/build.gradle @@ -37,6 +37,8 @@ dependencies { /*implementation 'org.springframework.boot:spring-boot-starter-security'*/ /*implementation 'org.springframework.cloud:spring-cloud-starter-config'*/ /*implementation 'org.springframework.kafka:spring-kafka'*/ + // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/config/P6spyConfiguration.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/config/P6spyConfiguration.java new file mode 100644 index 0000000..5049b88 --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/config/P6spyConfiguration.java @@ -0,0 +1,16 @@ +package com.justpickup.notificationservice.global.config; + +import com.justpickup.notificationservice.global.p6spy.CustomP6spySqlFormat; +import com.p6spy.engine.spy.P6SpyOptions; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +public class P6spyConfiguration { + + @PostConstruct + public void setMessageFormat() { + P6SpyOptions.getActiveInstance().setLogMessageFormat(CustomP6spySqlFormat.class.getName()); + } +} diff --git a/notification-service/src/main/java/com/justpickup/notificationservice/global/p6spy/CustomP6spySqlFormat.java b/notification-service/src/main/java/com/justpickup/notificationservice/global/p6spy/CustomP6spySqlFormat.java new file mode 100644 index 0000000..479ad2c --- /dev/null +++ b/notification-service/src/main/java/com/justpickup/notificationservice/global/p6spy/CustomP6spySqlFormat.java @@ -0,0 +1,67 @@ +package com.justpickup.notificationservice.global.p6spy; + +import com.p6spy.engine.logging.Category; +import com.p6spy.engine.spy.appender.MessageFormattingStrategy; +import org.hibernate.engine.jdbc.internal.FormatStyle; + +import java.util.Locale; +import java.util.Stack; + +public class CustomP6spySqlFormat implements MessageFormattingStrategy { + // 표기에 허용되는 filter + private String ALLOW_FILTER = "com.justpickup"; + + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { + sql = formatSql(category, sql); + if(sql.trim().isEmpty()) { // sql 이 없다면 출력하지 않아도 됨 + return ""; + } + // stack 을 구성하는 Format을 만든다 + return sql + createStack(connectionId, elapsed); + } + + private String formatSql(String category,String sql) { + if(sql ==null || sql.trim().equals("")) return sql; + + // Only format Statement, distinguish DDL And DML + if (Category.STATEMENT.getName().equals(category)) { + String tmpsql = sql.trim().toLowerCase(Locale.ROOT); + if(tmpsql.startsWith("create") || tmpsql.startsWith("alter") || tmpsql.startsWith("comment")) { + sql = FormatStyle.DDL.getFormatter().format(sql); + }else { + sql = FormatStyle.BASIC.getFormatter().format(sql); + } + } + + return sql; + } + + // stack 콘솔 표기 + private String createStack(int connectionId, long elapsed) { + Stack callStack = new Stack<>(); + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + + for (StackTraceElement stackTraceElement : stackTrace) { + String trace = stackTraceElement.toString(); + + // trace 항목을 보고 내게 맞는 것만 필터 + if(trace.startsWith(ALLOW_FILTER)) { + callStack.push(trace); + } + } + + StringBuffer sb = new StringBuffer(); + int order = 1; + while (callStack.size() != 0) { + sb.append("\n\t\t" + (order++) + "." + callStack.pop()); + } + + return new StringBuffer().append("\n\n\tConnection ID:").append(connectionId) + .append(" | Execution Time:").append(elapsed).append(" ms\n") + .append("\n\tExecution Time:").append(elapsed).append(" ms\n") + .append("\n\tCall Stack :").append(sb).append("\n") + .append("\n--------------------------------------") + .toString(); + } +} diff --git a/notification-service/src/main/resources/application.yml b/notification-service/src/main/resources/application.yml index 25ca7bd..b626e09 100644 --- a/notification-service/src/main/resources/application.yml +++ b/notification-service/src/main/resources/application.yml @@ -12,13 +12,12 @@ spring: jpa: hibernate: - ddl-auto: create-drop + ddl-auto: validate + generate-ddl: true + open-in-view: false properties: hibernate: - format_sql: true - show_sql: true - open-in-view: false - default_batch_fetch_size: 1000 + default_batch_fetch_size: 1000 eureka: client: @@ -28,7 +27,11 @@ eureka: register-with-eureka: true instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} + logging: level: com.justpickup: DEBUG - org.hibernate.SQL: debug \ No newline at end of file + +# jpa query, parameter 로그 (p6spy) +decorator.datasource.p6spy: + enable-logging: true \ No newline at end of file diff --git a/order-service/build.gradle b/order-service/build.gradle index 489ed0b..9bd342f 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -36,6 +36,9 @@ dependencies { /*implementation 'org.springframework.boot:spring-boot-starter-security'*/ /*implementation 'org.springframework.cloud:spring-cloud-starter-config'*/ /*implementation 'org.springframework.kafka:spring-kafka'*/ + // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' + compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/config/P6spyConfiguration.java b/order-service/src/main/java/com/justpickup/orderservice/global/config/P6spyConfiguration.java new file mode 100644 index 0000000..2bb1986 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/config/P6spyConfiguration.java @@ -0,0 +1,16 @@ +package com.justpickup.orderservice.global.config; + +import com.justpickup.orderservice.global.p6spy.CustomP6spySqlFormat; +import com.p6spy.engine.spy.P6SpyOptions; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +public class P6spyConfiguration { + + @PostConstruct + public void setMessageFormat() { + P6SpyOptions.getActiveInstance().setLogMessageFormat(CustomP6spySqlFormat.class.getName()); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/p6spy/CustomP6spySqlFormat.java b/order-service/src/main/java/com/justpickup/orderservice/global/p6spy/CustomP6spySqlFormat.java new file mode 100644 index 0000000..0ed122a --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/p6spy/CustomP6spySqlFormat.java @@ -0,0 +1,67 @@ +package com.justpickup.orderservice.global.p6spy; + +import com.p6spy.engine.logging.Category; +import com.p6spy.engine.spy.appender.MessageFormattingStrategy; +import org.hibernate.engine.jdbc.internal.FormatStyle; + +import java.util.Locale; +import java.util.Stack; + +public class CustomP6spySqlFormat implements MessageFormattingStrategy { + // 표기에 허용되는 filter + private String ALLOW_FILTER = "com.justpickup"; + + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { + sql = formatSql(category, sql); + if(sql.trim().isEmpty()) { // sql 이 없다면 출력하지 않아도 됨 + return ""; + } + // stack 을 구성하는 Format을 만든다 + return sql + createStack(connectionId, elapsed); + } + + private String formatSql(String category,String sql) { + if(sql ==null || sql.trim().equals("")) return sql; + + // Only format Statement, distinguish DDL And DML + if (Category.STATEMENT.getName().equals(category)) { + String tmpsql = sql.trim().toLowerCase(Locale.ROOT); + if(tmpsql.startsWith("create") || tmpsql.startsWith("alter") || tmpsql.startsWith("comment")) { + sql = FormatStyle.DDL.getFormatter().format(sql); + }else { + sql = FormatStyle.BASIC.getFormatter().format(sql); + } + } + + return sql; + } + + // stack 콘솔 표기 + private String createStack(int connectionId, long elapsed) { + Stack callStack = new Stack<>(); + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + + for (StackTraceElement stackTraceElement : stackTrace) { + String trace = stackTraceElement.toString(); + + // trace 항목을 보고 내게 맞는 것만 필터 + if(trace.startsWith(ALLOW_FILTER)) { + callStack.push(trace); + } + } + + StringBuffer sb = new StringBuffer(); + int order = 1; + while (callStack.size() != 0) { + sb.append("\n\t\t" + (order++) + "." + callStack.pop()); + } + + return new StringBuffer().append("\n\n\tConnection ID:").append(connectionId) + .append(" | Execution Time:").append(elapsed).append(" ms\n") + .append("\n\tExecution Time:").append(elapsed).append(" ms\n") + .append("\n\tCall Stack :").append(sb).append("\n") + .append("\n--------------------------------------") + .toString(); + } +} diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 16caef1..1976d6c 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -7,12 +7,12 @@ spring: jpa: hibernate: - ddl-auto: create-drop + ddl-auto: validate generate-ddl: true - show-sql: true - format_sql: true open-in-view: false - default_batch_fetch_size: 1000 + properties: + hibernate: + default_batch_fetch_size: 1000 datasource: driver-class-name: org.postgresql.Driver @@ -29,7 +29,11 @@ eureka: register-with-eureka: true instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} + logging: level: com.justpickup: DEBUG - org.hibernate.SQL: debug \ No newline at end of file + +# jpa query, parameter 로그 (p6spy) +decorator.datasource.p6spy: + enable-logging: true \ No newline at end of file diff --git a/store-service/build.gradle b/store-service/build.gradle index c1be896..9a68dd2 100644 --- a/store-service/build.gradle +++ b/store-service/build.gradle @@ -36,6 +36,8 @@ dependencies { /*implementation 'org.springframework.boot:spring-boot-starter-security'*/ /*implementation 'org.springframework.cloud:spring-cloud-starter-config'*/ /*implementation 'org.springframework.kafka:spring-kafka'*/ + // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' diff --git a/store-service/src/main/java/com/justpickup/storeservice/global/config/P6SpyConfiguration.java b/store-service/src/main/java/com/justpickup/storeservice/global/config/P6SpyConfiguration.java new file mode 100644 index 0000000..f5f422b --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/global/config/P6SpyConfiguration.java @@ -0,0 +1,16 @@ +package com.justpickup.storeservice.global.config; + +import com.justpickup.storeservice.global.p6spy.CustomP6spySqlFormat; +import com.p6spy.engine.spy.P6SpyOptions; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +public class P6SpyConfiguration { + + @PostConstruct + public void setMessageFormat() { + P6SpyOptions.getActiveInstance().setLogMessageFormat(CustomP6spySqlFormat.class.getName()); + } +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/global/p6spy/CustomP6spySqlFormat.java b/store-service/src/main/java/com/justpickup/storeservice/global/p6spy/CustomP6spySqlFormat.java new file mode 100644 index 0000000..e6e4bbd --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/global/p6spy/CustomP6spySqlFormat.java @@ -0,0 +1,67 @@ +package com.justpickup.storeservice.global.p6spy; + +import com.p6spy.engine.logging.Category; +import com.p6spy.engine.spy.appender.MessageFormattingStrategy; +import org.hibernate.engine.jdbc.internal.FormatStyle; + +import java.util.Locale; +import java.util.Stack; + +public class CustomP6spySqlFormat implements MessageFormattingStrategy { + // 표기에 허용되는 filter + private String ALLOW_FILTER = "com.justpickup"; + + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { + sql = formatSql(category, sql); + if(sql.trim().isEmpty()) { // sql 이 없다면 출력하지 않아도 됨 + return ""; + } + // stack 을 구성하는 Format을 만든다 + return sql + createStack(connectionId, elapsed); + } + + private String formatSql(String category,String sql) { + if(sql ==null || sql.trim().equals("")) return sql; + + // Only format Statement, distinguish DDL And DML + if (Category.STATEMENT.getName().equals(category)) { + String tmpsql = sql.trim().toLowerCase(Locale.ROOT); + if(tmpsql.startsWith("create") || tmpsql.startsWith("alter") || tmpsql.startsWith("comment")) { + sql = FormatStyle.DDL.getFormatter().format(sql); + }else { + sql = FormatStyle.BASIC.getFormatter().format(sql); + } + } + + return sql; + } + + // stack 콘솔 표기 + private String createStack(int connectionId, long elapsed) { + Stack callStack = new Stack<>(); + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + + for (StackTraceElement stackTraceElement : stackTrace) { + String trace = stackTraceElement.toString(); + + // trace 항목을 보고 내게 맞는 것만 필터 + if(trace.startsWith(ALLOW_FILTER)) { + callStack.push(trace); + } + } + + StringBuffer sb = new StringBuffer(); + int order = 1; + while (callStack.size() != 0) { + sb.append("\n\t\t" + (order++) + "." + callStack.pop()); + } + + return new StringBuffer().append("\n\n\tConnection ID:").append(connectionId) + .append(" | Execution Time:").append(elapsed).append(" ms\n") + .append("\n\tExecution Time:").append(elapsed).append(" ms\n") + .append("\n\tCall Stack :").append(sb).append("\n") + .append("\n--------------------------------------") + .toString(); + } +} diff --git a/store-service/src/main/resources/application.yml b/store-service/src/main/resources/application.yml index 0636d57..96eeaf2 100644 --- a/store-service/src/main/resources/application.yml +++ b/store-service/src/main/resources/application.yml @@ -7,13 +7,12 @@ spring: jpa: hibernate: - ddl-auto: create-drop + ddl-auto: validate + generate-ddl: true + open-in-view: false properties: hibernate: - format_sql: true - show_sql: true - open-in-view: false - default_batch_fetch_size: 1000 + default_batch_fetch_size: 1000 datasource: driver-class-name: org.postgresql.Driver @@ -30,7 +29,11 @@ eureka: register-with-eureka: true instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} + logging: level: - com.justpickup.storeservice: DEBUG - org.hibernate.SQL: debug \ No newline at end of file + com.justpickup: DEBUG + +# jpa query, parameter 로그 (p6spy) +decorator.datasource.p6spy: + enable-logging: true \ No newline at end of file diff --git a/user-service/build.gradle b/user-service/build.gradle index f210b82..ec207f2 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -37,6 +37,8 @@ dependencies { /*implementation 'org.springframework.boot:spring-boot-starter-security'*/ /*implementation 'org.springframework.cloud:spring-cloud-starter-config'*/ /*implementation 'org.springframework.kafka:spring-kafka'*/ + // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' diff --git a/user-service/src/main/java/com/justpickup/userservice/global/config/P6spyConfiguration.java b/user-service/src/main/java/com/justpickup/userservice/global/config/P6spyConfiguration.java new file mode 100644 index 0000000..fa4fcce --- /dev/null +++ b/user-service/src/main/java/com/justpickup/userservice/global/config/P6spyConfiguration.java @@ -0,0 +1,16 @@ +package com.justpickup.userservice.global.config; + +import com.justpickup.userservice.global.p6spy.CustomP6spySqlFormat; +import com.p6spy.engine.spy.P6SpyOptions; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +public class P6spyConfiguration { + + @PostConstruct + public void setMessageFormat() { + P6SpyOptions.getActiveInstance().setLogMessageFormat(CustomP6spySqlFormat.class.getName()); + } +} diff --git a/user-service/src/main/java/com/justpickup/userservice/global/p6spy/CustomP6spySqlFormat.java b/user-service/src/main/java/com/justpickup/userservice/global/p6spy/CustomP6spySqlFormat.java new file mode 100644 index 0000000..ace7971 --- /dev/null +++ b/user-service/src/main/java/com/justpickup/userservice/global/p6spy/CustomP6spySqlFormat.java @@ -0,0 +1,67 @@ +package com.justpickup.userservice.global.p6spy; + +import com.p6spy.engine.logging.Category; +import com.p6spy.engine.spy.appender.MessageFormattingStrategy; +import org.hibernate.engine.jdbc.internal.FormatStyle; + +import java.util.Locale; +import java.util.Stack; + +public class CustomP6spySqlFormat implements MessageFormattingStrategy { + // 표기에 허용되는 filter + private String ALLOW_FILTER = "com.justpickup"; + + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { + sql = formatSql(category, sql); + if(sql.trim().isEmpty()) { // sql 이 없다면 출력하지 않아도 됨 + return ""; + } + // stack 을 구성하는 Format을 만든다 + return sql + createStack(connectionId, elapsed); + } + + private String formatSql(String category,String sql) { + if(sql ==null || sql.trim().equals("")) return sql; + + // Only format Statement, distinguish DDL And DML + if (Category.STATEMENT.getName().equals(category)) { + String tmpsql = sql.trim().toLowerCase(Locale.ROOT); + if(tmpsql.startsWith("create") || tmpsql.startsWith("alter") || tmpsql.startsWith("comment")) { + sql = FormatStyle.DDL.getFormatter().format(sql); + }else { + sql = FormatStyle.BASIC.getFormatter().format(sql); + } + } + + return sql; + } + + // stack 콘솔 표기 + private String createStack(int connectionId, long elapsed) { + Stack callStack = new Stack<>(); + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + + for (StackTraceElement stackTraceElement : stackTrace) { + String trace = stackTraceElement.toString(); + + // trace 항목을 보고 내게 맞는 것만 필터 + if(trace.startsWith(ALLOW_FILTER)) { + callStack.push(trace); + } + } + + StringBuffer sb = new StringBuffer(); + int order = 1; + while (callStack.size() != 0) { + sb.append("\n\t\t" + (order++) + "." + callStack.pop()); + } + + return new StringBuffer().append("\n\n\tConnection ID:").append(connectionId) + .append(" | Execution Time:").append(elapsed).append(" ms\n") + .append("\n\tExecution Time:").append(elapsed).append(" ms\n") + .append("\n\tCall Stack :").append(sb).append("\n") + .append("\n--------------------------------------") + .toString(); + } +} diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 2894816..363e73b 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -12,13 +12,12 @@ spring: jpa: hibernate: - ddl-auto: create-drop + ddl-auto: validate + generate-ddl: true + open-in-view: false properties: hibernate: - format_sql: true - show_sql: true - open-in-view: false - default_batch_fetch_size: 1000 + default_batch_fetch_size: 1000 eureka: client: @@ -28,7 +27,11 @@ eureka: register-with-eureka: true instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} + logging: level: com.justpickup: DEBUG - org.hibernate.SQL: debug \ No newline at end of file + +# jpa query, parameter 로그 (p6spy) +decorator.datasource.p6spy: + enable-logging: true \ No newline at end of file