diff --git a/src/database/create-database.sql b/src/database/create-database.sql
index e3f830d..5382e6d 100644
--- a/src/database/create-database.sql
+++ b/src/database/create-database.sql
@@ -38,7 +38,7 @@ CREATE TABLE TB_DFX_AGENT_INFO (
, POSTMAN_COUNT DECIMAL(9)
, DROPBOX_COUNT DECIMAL(9)
, STATUS_CODE VARCHAR(64) NOT NULL
- , LAST_STATUS_TS TIMESTAMP NOT NULL
+ , LAST_STATUS_TS TIMESTAMPTZ(3) NOT NULL
, SETTINGS_DATA TEXT
, CONSTRAINT PK_DFX_AGENT_CONFIG PRIMARY KEY (AGENT_ID)
);
@@ -74,12 +74,12 @@ COMMENT ON COLUMN TB_DFX_DROPBOX.DESCRIPTION IS 'DESCRIPTION';
CREATE TABLE TB_DFX_AGENT_MESSAGE_HISTORY (
SENDER_AGENT_ID VARCHAR(256) NOT NULL
- , SENDER_TS TIMESTAMP
+ , SENDER_TS TIMESTAMPTZ(3)
, RECIPIENT_AGENT_ID VARCHAR(256) NOT NULL
- , RECIPIENT_TS TIMESTAMP
+ , RECIPIENT_TS TIMESTAMPTZ(3)
, MESSAGE_UUID VARCHAR(36) NOT NULL
, MESSAGE_TYPE_CODE VARCHAR(64)
- , CONSOLE_RECEIVE_TS TIMESTAMP
+ , CONSOLE_RECEIVE_TS TIMESTAMPTZ(3)
, PROCESS_STATUS_CODE VARCHAR(64)
, MESSAGE_DATA TEXT
, MESSAGE_DATA_COUNT DECIMAL(9) DEFAULT 0
diff --git a/src/main/front/src/views/LoginView.vue b/src/main/front/src/views/LoginView.vue
index a2f4fa4..49b95b9 100644
--- a/src/main/front/src/views/LoginView.vue
+++ b/src/main/front/src/views/LoginView.vue
@@ -41,7 +41,7 @@ async function loginProcess() {
-
+
diff --git a/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java b/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java
index 8408627..75cb43d 100644
--- a/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java
+++ b/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java
@@ -180,7 +180,8 @@ public class MessageUtils {
else {
CommandDto.CommandType commandType = EnumUtils.getEnum(CommandDto.CommandType.class, String.valueOf(map.get("commandType")));
String messageUuid = String.valueOf(map.get("messageUuid"));
- commandDto = CommandDto.builder().commandType(commandType).messageUuid(messageUuid).build();
+ String data = String.valueOf(map.get("data"));
+ commandDto = CommandDto.builder().commandType(commandType).messageUuid(messageUuid).data(data).build();
}
} catch (JsonProcessingException e) {
throw new IllegalMessageException(e.getMessage());
diff --git a/src/main/java/com/bsmlab/dfx/dfxconsole/app/agent/service/DfxAgentInfoDto.java b/src/main/java/com/bsmlab/dfx/dfxconsole/app/agent/service/DfxAgentInfoDto.java
index 8f567fb..6ded279 100644
--- a/src/main/java/com/bsmlab/dfx/dfxconsole/app/agent/service/DfxAgentInfoDto.java
+++ b/src/main/java/com/bsmlab/dfx/dfxconsole/app/agent/service/DfxAgentInfoDto.java
@@ -12,6 +12,7 @@ public class DfxAgentInfoDto {
private String agentId;
private String hostName;
private int listenPort;
+ private String description;
private int postmanCount;
private int dropboxCount;
private String statusCode;
diff --git a/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/ListenerController.java b/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/ListenerController.java
index dbb628a..92fceda 100644
--- a/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/ListenerController.java
+++ b/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/ListenerController.java
@@ -6,12 +6,14 @@ import com.bsmlab.dfx.dfxconsole.app.communicate.service.ListenerService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
-@Controller
+@RestController
@Slf4j
@RequiredArgsConstructor
public class ListenerController {
@@ -24,7 +26,7 @@ public class ListenerController {
* @return
*/
@PostMapping(value = "/listen")
- public AckDto listener(HttpServletRequest request) {
+ public ResponseEntity listener(HttpServletRequest request) {
AckDto ackDto = AckDto.builder().build();
try {
String bodyString = ServletUtils.getBodyString(request);
@@ -32,14 +34,14 @@ public class ListenerController {
} catch (IOException e) {
ackDto = AckDto.builder().result(AckDto.ResultType.RECEIVE_FAIL).resultText(e.getLocalizedMessage()).messageUuid("").build();
}
- return ackDto;
+ return ResponseEntity.ok().body(ackDto);
}
/**
* 에이전트로부터 상태 점검 등 command 수신한다.
*/
@PostMapping(value = "/command")
- public AckDto command(HttpServletRequest request) {
+ public ResponseEntity command(HttpServletRequest request) {
AckDto ackDto = AckDto.builder().build();
try {
String bodyString = ServletUtils.getBodyString(request);
@@ -47,6 +49,6 @@ public class ListenerController {
} catch (IOException e) {
ackDto = AckDto.builder().result(AckDto.ResultType.RECEIVE_FAIL).resultText(e.getLocalizedMessage()).messageUuid("").build();
}
- return ackDto;
+ return ResponseEntity.ok().body(ackDto);
}
}
\ No newline at end of file
diff --git a/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/service/ListenerService.java b/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/service/ListenerService.java
index 7a83193..6e22820 100644
--- a/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/service/ListenerService.java
+++ b/src/main/java/com/bsmlab/dfx/dfxconsole/app/communicate/service/ListenerService.java
@@ -56,7 +56,8 @@ public class ListenerService {
AgentConfigDto agentConfigDto = objectMapper.readValue(commandDto.getData(), new TypeReference(){});
if(agentConfigDto != null && StringUtils.isNotEmpty(agentConfigDto.getMyHostId())) {
DfxAgentInfoDto dfxAgentInfoDto = DfxAgentInfoDto.builder()
- .agentId(agentConfigDto.getMyHostId()).hostName(agentConfigDto.getMyHostName()).listenPort(agentConfigDto.getMyListenPort())
+ .agentId(agentConfigDto.getMyHostId()).hostName(agentConfigDto.getMyHostName())
+ .listenPort(agentConfigDto.getMyListenPort()).description(agentConfigDto.getDescription())
.postmanCount(agentConfigDto.getPostmanConfig().getPostmanList().size())
.dropboxCount(agentConfigDto.getDropBoxConfig().getDropBoxList().size())
.settingsData(commandDto.getData()).lastStatusTs(System.currentTimeMillis()).statusCode("STATUS_OK")
diff --git a/src/main/java/com/bsmlab/dfx/dfxconsole/framework/support/mybatis/handler/EpochMillisWithTimeZoneTypeHandler.java b/src/main/java/com/bsmlab/dfx/dfxconsole/framework/support/mybatis/handler/EpochMillisWithTimeZoneTypeHandler.java
new file mode 100644
index 0000000..d332f6d
--- /dev/null
+++ b/src/main/java/com/bsmlab/dfx/dfxconsole/framework/support/mybatis/handler/EpochMillisWithTimeZoneTypeHandler.java
@@ -0,0 +1,35 @@
+package com.bsmlab.dfx.dfxconsole.framework.support.mybatis.handler;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.*;
+
+@MappedTypes(Long.class)
+@MappedJdbcTypes(JdbcType.TIMESTAMP_WITH_TIMEZONE)
+public class EpochMillisWithTimeZoneTypeHandler extends BaseTypeHandler {
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException {
+ ps.setTimestamp(i, new Timestamp(parameter)); // 밀리초 → java.sql.Timestamp
+ }
+
+ @Override
+ public Long getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ Timestamp ts = rs.getTimestamp(columnName);
+ return ts == null ? null : ts.getTime(); // Timestamp → 밀리초 long
+ }
+
+ @Override
+ public Long getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ Timestamp ts = rs.getTimestamp(columnIndex);
+ return ts == null ? null : ts.getTime();
+ }
+
+ @Override
+ public Long getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ Timestamp ts = cs.getTimestamp(columnIndex);
+ return ts == null ? null : ts.getTime();
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index f826287..4f2d654 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -39,7 +39,7 @@ server:
include-stacktrace: always
port: 17443
ssl:
- enabled: true
+ enabled: false
certificate: ${user.home}/.vite-plugin-mkcert/bsm-lab.dev.pem
certificate-private-key: ${user.home}/.vite-plugin-mkcert/bsm-lab.dev-key.pem
@@ -49,22 +49,25 @@ mybatis:
call-setters-on-nulls: true
jdbc-type-for-null: NULL
use-generated-keys: true
- mapper-locations: /mapper/**/*.xml
+ mapper-locations: classpath*:/mapper/**/*.xml
+ type-handlers-package: com.bsmlab.dfx.dfxconsole.framework.support.mybatis.handler
logging:
level:
+ log4jdbc.log4j2: WARN
com:
zaxxer:
hikari: INFO
javax:
sql:
DataSource: OFF
+ org.mybatis: WARN
jdbc:
audit: OFF
resultset: OFF
resultsettable: INFO #SQL 결과 데이터 Table을 로그로 남긴다.
sqlonly: OFF #SQL만 로그로 남긴다.
- sqltiming: INFO #SQL과 소요시간을 표기한다.
+ sqltiming: DEBUG #SQL과 소요시간을 표기한다.
connection : OFF # 커넥션 확인가능
com.bsmlab.dfx: DEBUG
org.springframework: INFO
diff --git a/src/main/resources/log4jdbc.log4j2.properties b/src/main/resources/log4jdbc.log4j2.properties
new file mode 100644
index 0000000..c5af7cc
--- /dev/null
+++ b/src/main/resources/log4jdbc.log4j2.properties
@@ -0,0 +1,7 @@
+log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
+log4jdbc.dump.sql.maxlinelength=-1
+log4jdbc.dump.sql.select=true
+log4jdbc.dump.sql.insert=true
+log4jdbc.dump.sql.update=true
+log4jdbc.dump.sql.delete=true
+log4jdbc.trim.sql=true
diff --git a/src/main/resources/mapper/app/dfx-agent-config.xml b/src/main/resources/mapper/app/dfx-agent-config.xml
index b2facf6..4f82a74 100644
--- a/src/main/resources/mapper/app/dfx-agent-config.xml
+++ b/src/main/resources/mapper/app/dfx-agent-config.xml
@@ -4,7 +4,9 @@