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 @@