dsjang 2024-07-29
MMS, 알림톡, 친구톡 기능 추가
@aa4fc216929aacb96a1f2c43d3d6320d78b1d771
src/main/java/com/munjaon/server/config/DataSourceConfig.java
--- src/main/java/com/munjaon/server/config/DataSourceConfig.java
+++ src/main/java/com/munjaon/server/config/DataSourceConfig.java
@@ -1,5 +1,6 @@
 package com.munjaon.server.config;
 
+import com.zaxxer.hikari.HikariDataSource;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionFactoryBean;
 import org.mybatis.spring.SqlSessionTemplate;
@@ -28,7 +29,7 @@
     @Bean(name = "datasource")
     @ConfigurationProperties(prefix = "spring.datasource.server")
     public DataSource dataSource() {
-        return DataSourceBuilder.create().build();
+        return DataSourceBuilder.create().type(HikariDataSource.class).build();
     }
 
     @Primary
src/main/java/com/munjaon/server/config/RunnerConfiguration.java
--- src/main/java/com/munjaon/server/config/RunnerConfiguration.java
+++ src/main/java/com/munjaon/server/config/RunnerConfiguration.java
@@ -119,6 +119,60 @@
     }
 
     @Bean
+    @Order(2)
+    public CommandLineRunner getRunnerBeanForKatQueue() {
+        try {
+            String[] svcArray = ServiceUtil.getServiceNames(serverConfig.getStringArray("KAT.SERVICE_LIST"));
+            if (svcArray == null || svcArray.length == 0) {
+                log.info("KAT service list is empty");
+            } else {
+                if (ServiceUtil.isDuplicate(svcArray)) {
+                    log.info("KAT service list is duplicated");
+                } else {
+                    for (String svc : svcArray) {
+                        log.info("SERVICE CREATE : {}", svc);
+                        QueueInfo queueInfo = QueueInfo.builder().queueName(svc).serviceType("KAT").queuePath(serverConfig.getString("KAT.QUEUE_PATH")).build();
+                        KakaoAlarmWriteQueue katWriteQueue = new KakaoAlarmWriteQueue(queueInfo);
+                        KakaoAlarmReadQueue katReadQueue = new KakaoAlarmReadQueue(queueInfo);
+                        QueueServerService queueServerService = new QueueServerService(svc, katWriteQueue, katReadQueue);
+                        queueServerService.start();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return args -> System.out.println("Runner Bean #2");
+    }
+
+    @Bean
+    @Order(2)
+    public CommandLineRunner getRunnerBeanForKftQueue() {
+        try {
+            String[] svcArray = ServiceUtil.getServiceNames(serverConfig.getStringArray("KFT.SERVICE_LIST"));
+            if (svcArray == null || svcArray.length == 0) {
+                log.info("KFT service list is empty");
+            } else {
+                if (ServiceUtil.isDuplicate(svcArray)) {
+                    log.info("KFT service list is duplicated");
+                } else {
+                    for (String svc : svcArray) {
+                        log.info("SERVICE CREATE : {}", svc);
+                        QueueInfo queueInfo = QueueInfo.builder().queueName(svc).serviceType("KFT").queuePath(serverConfig.getString("KFT.QUEUE_PATH")).build();
+                        KakaoFriendWriteQueue kftWriteQueue = new KakaoFriendWriteQueue(queueInfo);
+                        KakaoFriendReadQueue kftReadQueue = new KakaoFriendReadQueue(queueInfo);
+                        QueueServerService queueServerService = new QueueServerService(svc, kftWriteQueue, kftReadQueue);
+                        queueServerService.start();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return args -> System.out.println("Runner Bean #2");
+    }
+
+    @Bean
     @Order(3)
     public CommandLineRunner getRunnerBeanForSmsCollector() {
         try {
@@ -152,6 +206,54 @@
 
     @Bean
     @Order(3)
+    public CommandLineRunner getRunnerBeanForMmsCollector() {
+        try {
+            String serviceName = "MMS_COLLECTOR";
+            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
+            int port = serverConfig.getInt(serviceName + ".SERVICE_PORT");
+//            CollectBackServerService collectServerService = new CollectBackServerService(serviceName, serviceType, port);
+            CollectServerService collectServerService = new CollectServerService(serviceName, serviceType, port);
+            collectServerService.start();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return args -> System.out.println("Runner Bean SmsCollector #3");
+    }
+
+    @Bean
+    @Order(3)
+    public CommandLineRunner getRunnerBeanForKatCollector() {
+        try {
+            String serviceName = "KAT_COLLECTOR";
+            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
+            int port = serverConfig.getInt(serviceName + ".SERVICE_PORT");
+//            CollectBackServerService collectServerService = new CollectBackServerService(serviceName, serviceType, port);
+            CollectServerService collectServerService = new CollectServerService(serviceName, serviceType, port);
+            collectServerService.start();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return args -> System.out.println("Runner Bean SmsCollector #3");
+    }
+
+    @Bean
+    @Order(3)
+    public CommandLineRunner getRunnerBeanForKftCollector() {
+        try {
+            String serviceName = "KFT_COLLECTOR";
+            String serviceType = serverConfig.getString(serviceName + ".SERVICE_TYPE");
+            int port = serverConfig.getInt(serviceName + ".SERVICE_PORT");
+//            CollectBackServerService collectServerService = new CollectBackServerService(serviceName, serviceType, port);
+            CollectServerService collectServerService = new CollectServerService(serviceName, serviceType, port);
+            collectServerService.start();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return args -> System.out.println("Runner Bean SmsCollector #3");
+    }
+
+    @Bean
+    @Order(3)
     public CommandLineRunner getRunnerBeanForReporter() {
         try {
             String serviceName = "REPORTER";
src/main/java/com/munjaon/server/config/ServiceCode.java
--- src/main/java/com/munjaon/server/config/ServiceCode.java
+++ src/main/java/com/munjaon/server/config/ServiceCode.java
@@ -21,11 +21,13 @@
     /* SMS 메시지 */
     MSG_ERROR_SMS_MESSAGE(400, "SMS Message is Null OR is Over Limit Byte"),
 
-    /* LMS, MMS 제목, 메시지 */
-    MSG_ERROR_MEDIA_SUBJECT(500, "LMS, MMS Subject is Null OR is Over Limit Byte"),
-    MSG_ERROR_MEDIA_MESSAGE(501, "LMS, MMS Message is Null OR is Over Limit Byte"),
+    /* LMS, MMS, KAKAO 제목, 메시지 */
+    MSG_ERROR_MEDIA_SUBJECT(500, "LMS, MMS, KAKAO Subject is Null OR is Over Limit Byte"),
+    MSG_ERROR_MEDIA_MESSAGE(501, "LMS, MMS, KAKAO Message is Null OR is Over Limit Byte"),
 
-    /* 카카오 알림톡, 친구톡 메시지 */
+    /* 카카오 알림톡, 친구톡 메시지, KAKAO_SENDER_KEY, KAKAO_TEMPLATE_CODE */
+    MSG_ERROR_KAKAO_SENDER_KEY(600, "KAKAO_SENDER_KEY is Null OR is Over Limit Byte"),
+    MSG_ERROR_KAKAO_TEMPLATE_CODE(601, "KAKAO_TEMPLATE_CODE is Null OR is Over Limit Byte"),
 
     /* 리포트 관련 에러 메시지 */
     MSG_ERROR_REPORT(800, "REPORT DATA is Null OR is invalid"),
 
src/main/java/com/munjaon/server/queue/config/KakaoBodyConfig.java (added)
+++ src/main/java/com/munjaon/server/queue/config/KakaoBodyConfig.java
@@ -0,0 +1,22 @@
+package com.munjaon.server.queue.config;
+
+public final class KakaoBodyConfig {
+    /* 제목 (Length : 60 / Position : 161) */
+    public static final int SUBJECT_BYTE_LENGTH = 60;
+    public static final int SUBJECT_BYTE_POSITION = BodyCommonConfig.AGENT_CODE_BYTE_POSITION + BodyCommonConfig.AGENT_CODE_BYTE_LENGTH;
+    /* LMS/MMS Message (Length : 2000 / Position : 221) */
+    public static final int MEDIA_MSG_BYTE_LENGTH = 2000;
+    public static final int MEDIA_MSG_BYTE_POSITION = SUBJECT_BYTE_POSITION + SUBJECT_BYTE_LENGTH;
+    /* KAKAO_SENDER_KEY (Length : 40 / Position : 2221) */
+    public static final int KAKAO_SENDER_KEY_BYTE_LENGTH = 40;
+    public static final int KAKAO_SENDER_KEY_BYTE_POSITION = MEDIA_MSG_BYTE_POSITION + MEDIA_MSG_BYTE_LENGTH;
+    /* KAKAO_TEMPLATE_CODE (Length : 64 / Position : 2261) */
+    public static final int KAKAO_TEMPLATE_CODE_BYTE_LENGTH = 64;
+    public static final int KAKAO_TEMPLATE_CODE_BYTE_POSITION = KAKAO_SENDER_KEY_BYTE_POSITION + KAKAO_SENDER_KEY_BYTE_LENGTH;
+    /* JSON 파일 (Length : 128 / Position : 2222) */
+    public static final int FILENAME_JSON_BYTE_LENGTH = 128;
+    public static final int FILENAME_JSON_BYTE_POSITION = KAKAO_TEMPLATE_CODE_BYTE_POSITION + KAKAO_TEMPLATE_CODE_BYTE_LENGTH;
+
+    /* KAKAO Body 길이 */
+    public static final int KAKAO_SUM_BYTE_LENGTH = BodyCommonConfig.COMMON_SUM_BYTE_LENGTH + SUBJECT_BYTE_LENGTH + MEDIA_MSG_BYTE_LENGTH + KAKAO_SENDER_KEY_BYTE_LENGTH + KAKAO_TEMPLATE_CODE_BYTE_LENGTH + FILENAME_JSON_BYTE_LENGTH;
+}
src/main/java/com/munjaon/server/queue/config/QueueConstants.java
--- src/main/java/com/munjaon/server/queue/config/QueueConstants.java
+++ src/main/java/com/munjaon/server/queue/config/QueueConstants.java
@@ -76,5 +76,31 @@
     public static final int REPORT_TELECOM_LENGTH = 7;
 
     // 큐에 저장하기전에 바이트를 채울 문자
-    public static final byte SET_DEFAULT_BYTE = (byte) 0x20;
+    public static final byte SET_DEFAULT_BYTE = (byte) 0x00;
+
+    public static String getString(byte[] srcArray) {
+        if (srcArray == null) {
+            return null;
+        }
+        int size = 0;
+        for (int i = 0, len = srcArray.length; i < len; i++) {
+            if (srcArray[i] == SET_DEFAULT_BYTE) {
+                continue;
+            }
+            size++;
+        }
+        byte[] destArray = null;
+        if (size > 0) {
+            destArray  = new byte[size];
+            int index = 0;
+            for (int i = 0, len = srcArray.length; i < len; i++) {
+                if (srcArray[i] == SET_DEFAULT_BYTE) {
+                    continue;
+                }
+                destArray[index++] = srcArray[i];
+            }
+        }
+
+        return destArray == null ? null : new String(destArray);
+    }
 }
src/main/java/com/munjaon/server/queue/dto/BasicMessageDto.java
--- src/main/java/com/munjaon/server/queue/dto/BasicMessageDto.java
+++ src/main/java/com/munjaon/server/queue/dto/BasicMessageDto.java
@@ -35,4 +35,8 @@
     protected int userFileSize01 = 0;
     protected int userFileSize02 = 0;
     protected int userFileSize03 = 0;
+
+    private String kakaoSenderKey;
+    private String kakaoTemplateCode;
+    private String kakaoJsonFile;
 }
 
src/main/java/com/munjaon/server/queue/mapper/KatMapper.java (added)
+++ src/main/java/com/munjaon/server/queue/mapper/KatMapper.java
@@ -0,0 +1,9 @@
+package com.munjaon.server.queue.mapper;
+
+import com.munjaon.server.queue.dto.BasicMessageDto;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface KatMapper {
+    int insert(BasicMessageDto messageDto);
+}
 
src/main/java/com/munjaon/server/queue/mapper/KftMapper.java (added)
+++ src/main/java/com/munjaon/server/queue/mapper/KftMapper.java
@@ -0,0 +1,9 @@
+package com.munjaon.server.queue.mapper;
+
+import com.munjaon.server.queue.dto.BasicMessageDto;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface KftMapper {
+    int insert(BasicMessageDto messageDto);
+}
src/main/java/com/munjaon/server/queue/mapper/LmsMapper.java
--- src/main/java/com/munjaon/server/queue/mapper/LmsMapper.java
+++ src/main/java/com/munjaon/server/queue/mapper/LmsMapper.java
@@ -1,7 +1,9 @@
 package com.munjaon.server.queue.mapper;
 
 import com.munjaon.server.queue.dto.BasicMessageDto;
+import org.apache.ibatis.annotations.Mapper;
 
+@Mapper
 public interface LmsMapper {
     int insert(BasicMessageDto messageDto);
 }
 
src/main/java/com/munjaon/server/queue/mapper/MmsMapper.java (added)
+++ src/main/java/com/munjaon/server/queue/mapper/MmsMapper.java
@@ -0,0 +1,9 @@
+package com.munjaon.server.queue.mapper;
+
+import com.munjaon.server.queue.dto.BasicMessageDto;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MmsMapper {
+    int insert(BasicMessageDto messageDto);
+}
src/main/java/com/munjaon/server/queue/pool/KakaoAlarmQueuePool.java
--- src/main/java/com/munjaon/server/queue/pool/KakaoAlarmQueuePool.java
+++ src/main/java/com/munjaon/server/queue/pool/KakaoAlarmQueuePool.java
@@ -6,7 +6,7 @@
 
     private KakaoAlarmQueuePool() {}
 
-    public synchronized static KakaoAlarmQueuePool getInstance(){
+    public synchronized static KakaoAlarmQueuePool getInstance() {
         if(queueInstance == null){
             queueInstance = new KakaoAlarmQueuePool();
         }
 
src/main/java/com/munjaon/server/queue/pool/KakaoAlarmReadQueue.java (added)
+++ src/main/java/com/munjaon/server/queue/pool/KakaoAlarmReadQueue.java
@@ -0,0 +1,39 @@
+package com.munjaon.server.queue.pool;
+
+import com.munjaon.server.queue.config.KakaoBodyConfig;
+import com.munjaon.server.queue.config.QueueConstants;
+import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.dto.QueueInfo;
+import com.munjaon.server.util.MessageUtil;
+
+import java.nio.ByteBuffer;
+
+public class KakaoAlarmReadQueue extends ReadQueue {
+    public KakaoAlarmReadQueue(QueueInfo queueInfo) throws Exception {
+        this.queueInfo = queueInfo;
+//        initQueue();
+    }
+
+    @Override
+    void popBuffer() throws Exception {
+        this.channel.position(MessageUtil.calcReadPosition(this.popCounter, KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH));
+        this.channel.read(this.dataBuffer);
+    }
+
+    @Override
+    void getBytesForExtendMessage(BasicMessageDto messageDto) {
+        MessageUtil.getBytesForKakaoMessage(this.dataBuffer, messageDto);
+    }
+
+    @Override
+    void initDataBuffer() {
+        if (this.dataBuffer == null) {
+            this.dataBuffer = ByteBuffer.allocateDirect(KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH);
+        }
+        this.dataBuffer.clear();
+        for(int loopCnt = 0; loopCnt < KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH; loopCnt++){
+            this.dataBuffer.put(QueueConstants.SET_DEFAULT_BYTE);
+        }
+        this.dataBuffer.position(0);
+    }
+}
src/main/java/com/munjaon/server/queue/pool/KakaoAlarmWriteQueue.java
--- src/main/java/com/munjaon/server/queue/pool/KakaoAlarmWriteQueue.java
+++ src/main/java/com/munjaon/server/queue/pool/KakaoAlarmWriteQueue.java
@@ -1,21 +1,75 @@
 package com.munjaon.server.queue.pool;
 
+import com.munjaon.server.config.ServiceCode;
+import com.munjaon.server.queue.config.KakaoBodyConfig;
+import com.munjaon.server.queue.config.QueueConstants;
 import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.dto.QueueInfo;
+import com.munjaon.server.util.MessageUtil;
+
+import java.nio.ByteBuffer;
 
 public class KakaoAlarmWriteQueue extends WriteQueue {
+    public KakaoAlarmWriteQueue(QueueInfo queueInfo) throws Exception {
+        this.queueInfo = queueInfo;
+        /* 큐초기화 */
+//        initQueue();
+    }
 
     @Override
     public int isValidateMessageForExtend(BasicMessageDto messageDto) {
-        return 0;
+        /* 13. 제목 */
+        if (MessageUtil.isEmptyForMessage(messageDto.getUserSubject(), true) || MessageUtil.isOverByteForMessage(messageDto.getUserSubject(), KakaoBodyConfig.SUBJECT_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_SUBJECT.getCode();
+        }
+        /* 14. 메시지 */
+        if (MessageUtil.isEmptyForMessage(messageDto.getUserMessage(), true) || MessageUtil.isOverByteForMessage(messageDto.getUserMessage(), KakaoBodyConfig.MEDIA_MSG_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_MESSAGE.getCode();
+        }
+        /* 15. KAKAO_SENDER_KEY */
+        if (MessageUtil.isEmptyForMessage(messageDto.getKakaoSenderKey(), true) || MessageUtil.isOverByteForMessage(messageDto.getKakaoSenderKey(), KakaoBodyConfig.KAKAO_SENDER_KEY_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_MESSAGE.getCode();
+        }
+        /* 16. KAKAO_TEMPLATE_CODE */
+        if (MessageUtil.isEmptyForMessage(messageDto.getKakaoTemplateCode(), true) || MessageUtil.isOverByteForMessage(messageDto.getKakaoTemplateCode(), KakaoBodyConfig.KAKAO_TEMPLATE_CODE_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_MESSAGE.getCode();
+        }
+
+        return ServiceCode.OK.getCode();
     }
 
     @Override
     public void pushMessageToBuffer(BasicMessageDto messageDto) throws Exception {
-
+        if (isValidateMessage(messageDto) == ServiceCode.OK.getCode()) {
+            /* 1. dataBuffer 초기화 */
+            initDataBuffer();
+            /* 2. messageDto >> dataBuffer */
+            MessageUtil.setBytesForCommonMessage(this.dataBuffer, messageDto);
+            MessageUtil.setBytesForKakaoMessage(this.dataBuffer, messageDto);
+            /* 3. 파일큐에 적재 */
+            /* 3.1 Header 정보 다시 일기 */
+            readHeader();
+            if (this.dataBuffer != null){
+                this.channel.position(MessageUtil.calcWritePosition(this.pushCounter, KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH));
+                this.dataBuffer.flip();
+                this.channel.write(this.dataBuffer);
+                /* 3.2 Push 카운터 증가 */
+                this.pushCounter = this.pushCounter + 1;
+                /* 3.3 Header 정보 변경 */
+                writeHeader();
+            }
+        }
     }
 
     @Override
     public void initDataBuffer() {
-
+        if (this.dataBuffer == null) {
+            this.dataBuffer = ByteBuffer.allocateDirect(KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH);
+        }
+        this.dataBuffer.clear();
+        for(int loopCnt = 0; loopCnt < KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH; loopCnt++){
+            this.dataBuffer.put(QueueConstants.SET_DEFAULT_BYTE);
+        }
+        this.dataBuffer.position(0);
     }
 }
 
src/main/java/com/munjaon/server/queue/pool/KakaoFriendReadQueue.java (added)
+++ src/main/java/com/munjaon/server/queue/pool/KakaoFriendReadQueue.java
@@ -0,0 +1,39 @@
+package com.munjaon.server.queue.pool;
+
+import com.munjaon.server.queue.config.KakaoBodyConfig;
+import com.munjaon.server.queue.config.QueueConstants;
+import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.dto.QueueInfo;
+import com.munjaon.server.util.MessageUtil;
+
+import java.nio.ByteBuffer;
+
+public class KakaoFriendReadQueue extends ReadQueue {
+    public KakaoFriendReadQueue(QueueInfo queueInfo) throws Exception {
+        this.queueInfo = queueInfo;
+//        initQueue();
+    }
+
+    @Override
+    void popBuffer() throws Exception {
+        this.channel.position(MessageUtil.calcReadPosition(this.popCounter, KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH));
+        this.channel.read(this.dataBuffer);
+    }
+
+    @Override
+    void getBytesForExtendMessage(BasicMessageDto messageDto) {
+        MessageUtil.getBytesForKakaoMessage(this.dataBuffer, messageDto);
+    }
+
+    @Override
+    void initDataBuffer() {
+        if (this.dataBuffer == null) {
+            this.dataBuffer = ByteBuffer.allocateDirect(KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH);
+        }
+        this.dataBuffer.clear();
+        for(int loopCnt = 0; loopCnt < KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH; loopCnt++){
+            this.dataBuffer.put(QueueConstants.SET_DEFAULT_BYTE);
+        }
+        this.dataBuffer.position(0);
+    }
+}
src/main/java/com/munjaon/server/queue/pool/KakaoFriendWriteQueue.java
--- src/main/java/com/munjaon/server/queue/pool/KakaoFriendWriteQueue.java
+++ src/main/java/com/munjaon/server/queue/pool/KakaoFriendWriteQueue.java
@@ -1,20 +1,75 @@
 package com.munjaon.server.queue.pool;
 
+import com.munjaon.server.config.ServiceCode;
+import com.munjaon.server.queue.config.KakaoBodyConfig;
+import com.munjaon.server.queue.config.QueueConstants;
 import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.dto.QueueInfo;
+import com.munjaon.server.util.MessageUtil;
+
+import java.nio.ByteBuffer;
 
 public class KakaoFriendWriteQueue extends WriteQueue {
+    public KakaoFriendWriteQueue(QueueInfo queueInfo) throws Exception {
+        this.queueInfo = queueInfo;
+        /* 큐초기화 */
+//        initQueue();
+    }
+
     @Override
     public int isValidateMessageForExtend(BasicMessageDto messageDto) {
-        return 0;
+        /* 13. 제목 */
+        if (MessageUtil.isEmptyForMessage(messageDto.getUserSubject(), true) || MessageUtil.isOverByteForMessage(messageDto.getUserSubject(), KakaoBodyConfig.SUBJECT_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_SUBJECT.getCode();
+        }
+        /* 14. 메시지 */
+        if (MessageUtil.isEmptyForMessage(messageDto.getUserMessage(), true) || MessageUtil.isOverByteForMessage(messageDto.getUserMessage(), KakaoBodyConfig.MEDIA_MSG_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_MESSAGE.getCode();
+        }
+        /* 15. KAKAO_SENDER_KEY */
+        if (MessageUtil.isEmptyForMessage(messageDto.getKakaoSenderKey(), true) || MessageUtil.isOverByteForMessage(messageDto.getKakaoSenderKey(), KakaoBodyConfig.KAKAO_SENDER_KEY_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_MESSAGE.getCode();
+        }
+        /* 16. KAKAO_TEMPLATE_CODE */
+        if (MessageUtil.isEmptyForMessage(messageDto.getKakaoTemplateCode(), true) || MessageUtil.isOverByteForMessage(messageDto.getKakaoTemplateCode(), KakaoBodyConfig.KAKAO_TEMPLATE_CODE_BYTE_LENGTH, false)) {
+            return ServiceCode.MSG_ERROR_MEDIA_MESSAGE.getCode();
+        }
+
+        return ServiceCode.OK.getCode();
     }
 
     @Override
     public void pushMessageToBuffer(BasicMessageDto messageDto) throws Exception {
-
+        if (isValidateMessage(messageDto) == ServiceCode.OK.getCode()) {
+            /* 1. dataBuffer 초기화 */
+            initDataBuffer();
+            /* 2. messageDto >> dataBuffer */
+            MessageUtil.setBytesForCommonMessage(this.dataBuffer, messageDto);
+            MessageUtil.setBytesForKakaoMessage(this.dataBuffer, messageDto);
+            /* 3. 파일큐에 적재 */
+            /* 3.1 Header 정보 다시 일기 */
+            readHeader();
+            if (this.dataBuffer != null){
+                this.channel.position(MessageUtil.calcWritePosition(this.pushCounter, KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH));
+                this.dataBuffer.flip();
+                this.channel.write(this.dataBuffer);
+                /* 3.2 Push 카운터 증가 */
+                this.pushCounter = this.pushCounter + 1;
+                /* 3.3 Header 정보 변경 */
+                writeHeader();
+            }
+        }
     }
 
     @Override
     public void initDataBuffer() {
-
+        if (this.dataBuffer == null) {
+            this.dataBuffer = ByteBuffer.allocateDirect(KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH);
+        }
+        this.dataBuffer.clear();
+        for(int loopCnt = 0; loopCnt < KakaoBodyConfig.KAKAO_SUM_BYTE_LENGTH; loopCnt++){
+            this.dataBuffer.put(QueueConstants.SET_DEFAULT_BYTE);
+        }
+        this.dataBuffer.position(0);
     }
 }
src/main/java/com/munjaon/server/queue/pool/ReadQueue.java
--- src/main/java/com/munjaon/server/queue/pool/ReadQueue.java
+++ src/main/java/com/munjaon/server/queue/pool/ReadQueue.java
@@ -150,12 +150,12 @@
             // 생성날짜 가져오기 - 생성날짜(10) / 읽은카운트(10) / 쓴카운트(10)
             this.headerBuffer.position(QueueHeaderConfig.CREATE_DATE_POSITION);
             this.headerBuffer.get(this.headerArray);
-            this.createDate = (new String(this.headerArray)).trim();
+            this.createDate = QueueConstants.getString(this.headerArray);
             // 쓴 카운트 가져오기
             this.headerArray = new byte[QueueHeaderConfig.PUSH_COUNT_LENGTH];
             this.headerBuffer.position(QueueHeaderConfig.PUSH_COUNT_POSITION);
             this.headerBuffer.get(this.headerArray);
-            this.pushCounter = Integer.parseInt((new String(this.headerArray)).trim());
+            this.pushCounter = Integer.parseInt(QueueConstants.getString(this.headerArray));
         } catch(Exception e) {
             throw e;
         }
src/main/java/com/munjaon/server/queue/pool/WriteQueue.java
--- src/main/java/com/munjaon/server/queue/pool/WriteQueue.java
+++ src/main/java/com/munjaon/server/queue/pool/WriteQueue.java
@@ -93,12 +93,12 @@
             // 생성날짜 가져오기 - 생성날짜(10) / 읽은카운트(10) / 쓴카운트(10)
             this.headerBuffer.position(QueueHeaderConfig.CREATE_DATE_POSITION);
             this.headerBuffer.get(this.headerArray);
-            this.createDate = (new String(this.headerArray)).trim();
+            this.createDate = QueueConstants.getString(this.headerArray);
             // 쓴 카운트 가져오기
             this.headerArray = new byte[QueueHeaderConfig.PUSH_COUNT_LENGTH];
             this.headerBuffer.position(QueueHeaderConfig.PUSH_COUNT_POSITION);
             this.headerBuffer.get(this.headerArray);
-            this.pushCounter = Integer.parseInt((new String(this.headerArray)).trim());
+            this.pushCounter = Integer.parseInt(QueueConstants.getString(this.headerArray));
         } catch(Exception e) {
             throw e;
         }
src/main/java/com/munjaon/server/queue/service/KakaoAlarmQueueService.java
--- src/main/java/com/munjaon/server/queue/service/KakaoAlarmQueueService.java
+++ src/main/java/com/munjaon/server/queue/service/KakaoAlarmQueueService.java
@@ -1,7 +1,10 @@
 package com.munjaon.server.queue.service;
 
+import com.munjaon.server.cache.service.SerialNoService;
 import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.mapper.KatMapper;
 import com.munjaon.server.queue.pool.KakaoAlarmMemoryQueue;
+import com.munjaon.server.queue.pool.KakaoAlarmQueuePool;
 import com.munjaon.server.queue.pool.WriteQueue;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -11,36 +14,53 @@
 @Service
 @RequiredArgsConstructor
 public class KakaoAlarmQueueService implements QueueAction {
+    private final KatMapper katMapper;
+    private final KakaoAlarmQueuePool queueInstance = KakaoAlarmQueuePool.getInstance();
     private final KakaoAlarmMemoryQueue memoryQueue = KakaoAlarmMemoryQueue.getInstance();
+    private final SerialNoService serialNoService;
 
     @Override
     public int getQueueSize() {
-        return 0;
+        return queueInstance.getQueueSize();
     }
 
     @Override
     public boolean isExistQueue(String name) {
-        return false;
+        return queueInstance.isExistQueue(name);
     }
 
     @Override
     public void removeQueue(String name) {
-
+        queueInstance.removeQueue(name);
     }
 
     @Override
     public void addQueue(WriteQueue queue) {
-
+        queueInstance.addQueue(queue);
     }
 
     @Override
     public void pushQueue(BasicMessageDto data) {
-
+        boolean isError = false;
+        try {
+            queueInstance.pushQueue(data);
+        } catch (Exception e) {
+            isError = true;
+//            throw new RuntimeException(e);
+        }
+        if (isError) {
+            log.error("Push queue failed");
+        }
     }
 
     @Override
     public int saveMessageToTable(BasicMessageDto data) {
-        return 0;
+        String serialNo = serialNoService.getSerialNo();
+        String groupSerialNo = serialNo.replace("MSGID", "MGRP");
+        data.setId(serialNo);
+        data.setMsgGroupID(groupSerialNo);
+        log.debug("Save message to table : {}", data);
+        return katMapper.insert(data);
     }
 
     @Override
src/main/java/com/munjaon/server/queue/service/KakaoFriendQueueService.java
--- src/main/java/com/munjaon/server/queue/service/KakaoFriendQueueService.java
+++ src/main/java/com/munjaon/server/queue/service/KakaoFriendQueueService.java
@@ -1,7 +1,10 @@
 package com.munjaon.server.queue.service;
 
+import com.munjaon.server.cache.service.SerialNoService;
 import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.mapper.KftMapper;
 import com.munjaon.server.queue.pool.KakaoAlarmMemoryQueue;
+import com.munjaon.server.queue.pool.KakaoFriendQueuePool;
 import com.munjaon.server.queue.pool.WriteQueue;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -11,36 +14,53 @@
 @Service
 @RequiredArgsConstructor
 public class KakaoFriendQueueService implements QueueAction {
+    private final KftMapper kftMapper;
+    private final KakaoFriendQueuePool queueInstance = KakaoFriendQueuePool.getInstance();
     private final KakaoAlarmMemoryQueue memoryQueue = KakaoAlarmMemoryQueue.getInstance();
+    private final SerialNoService serialNoService;
 
     @Override
     public int getQueueSize() {
-        return 0;
+        return queueInstance.getQueueSize();
     }
 
     @Override
     public boolean isExistQueue(String name) {
-        return false;
+        return queueInstance.isExistQueue(name);
     }
 
     @Override
     public void removeQueue(String name) {
-
+        queueInstance.removeQueue(name);
     }
 
     @Override
     public void addQueue(WriteQueue queue) {
-
+        queueInstance.addQueue(queue);
     }
 
     @Override
     public void pushQueue(BasicMessageDto data) {
-
+        boolean isError = false;
+        try {
+            queueInstance.pushQueue(data);
+        } catch (Exception e) {
+            isError = true;
+//            throw new RuntimeException(e);
+        }
+        if (isError) {
+            log.error("Push queue failed");
+        }
     }
 
     @Override
     public int saveMessageToTable(BasicMessageDto data) {
-        return 0;
+        String serialNo = serialNoService.getSerialNo();
+        String groupSerialNo = serialNo.replace("MSGID", "MGRP");
+        data.setId(serialNo);
+        data.setMsgGroupID(groupSerialNo);
+        log.debug("Save message to table : {}", data);
+        return kftMapper.insert(data);
     }
 
     @Override
src/main/java/com/munjaon/server/queue/service/MmsQueueService.java
--- src/main/java/com/munjaon/server/queue/service/MmsQueueService.java
+++ src/main/java/com/munjaon/server/queue/service/MmsQueueService.java
@@ -1,6 +1,8 @@
 package com.munjaon.server.queue.service;
 
+import com.munjaon.server.cache.service.SerialNoService;
 import com.munjaon.server.queue.dto.BasicMessageDto;
+import com.munjaon.server.queue.mapper.MmsMapper;
 import com.munjaon.server.queue.pool.MmsMemoryQueue;
 import com.munjaon.server.queue.pool.MmsQueuePool;
 import com.munjaon.server.queue.pool.WriteQueue;
@@ -12,8 +14,10 @@
 @Service
 @RequiredArgsConstructor
 public class MmsQueueService implements QueueAction {
+    private final MmsMapper mmsMapper;
     private final MmsQueuePool queueInstance = MmsQueuePool.getInstance();
     private final MmsMemoryQueue memoryQueue = MmsMemoryQueue.getInstance();
+    private final SerialNoService serialNoService;
 
     @Override
     public int getQueueSize() {
@@ -51,7 +55,12 @@
 
     @Override
     public int saveMessageToTable(BasicMessageDto data) {
-        return 0;
+        String serialNo = serialNoService.getSerialNo();
+        String groupSerialNo = serialNo.replace("MSGID", "MGRP");
+        data.setId(serialNo);
+        data.setMsgGroupID(groupSerialNo);
+        log.debug("Save message to table : {}", data);
+        return mmsMapper.insert(data);
     }
 
     @Override
 
src/main/java/com/munjaon/server/server/packet/KakaoMessage.java (added)
+++ src/main/java/com/munjaon/server/server/packet/KakaoMessage.java
@@ -0,0 +1,140 @@
+package com.munjaon.server.server.packet;
+
+import com.munjaon.server.util.CommonUtil;
+
+import java.nio.ByteBuffer;
+
+public final class KakaoMessage {
+    public static final int LIMIT_FILE_CAPACITY = 1024 * 50;
+
+    public static final int DELIVER_JSON_FILENAME_LENGTH = 40;
+    public static final int DELIVER_JSON_FILENAME_POSITION = 0;
+
+    public static final int DELIVER_JSON_FILESIZE_LENGTH = 8;
+    public static final int DELIVER_JSON_FILESIZE_POSITION = DELIVER_JSON_FILENAME_POSITION + DELIVER_JSON_FILENAME_LENGTH;
+
+    public static final int DELIVER_KAKAO_BODY_LENGTH = 2233;
+    public static final int DELIVER_KAKAO_ACK_BODY_LENGTH = 21;
+
+    /* DELIVER */
+    /* SUBJECT */
+    public static final int DELIVER_SUBJECT_LENGTH = 40;
+    public static final int DELIVER_SUBJECT_POSITION = CommonMessage.DELIVER_MSG_TYPE_POSITION + CommonMessage.DELIVER_MSG_TYPE_LENGTH;
+    /* MESSAGE */
+    public static final int DELIVER_MESSAGE_LENGTH = 2000;
+    public static final int DELIVER_MESSAGE_POSITION = DELIVER_SUBJECT_POSITION + DELIVER_SUBJECT_LENGTH;
+    /* KAKAO_SENDER_KEY */
+    public static final int DELIVER_KAKAO_SENDER_KEY_LENGTH = 40;
+    public static final int DELIVER_KAKAO_SENDER_KEY_POSITION = DELIVER_MESSAGE_POSITION + DELIVER_MESSAGE_LENGTH;
+    /* KAKAO_TEMPLATE_CODE */
+    public static final int DELIVER_KAKAO_TEMPLATE_CODE_LENGTH = 64;
+    public static final int DELIVER_KAKAO_TEMPLATE_CODE_POSITION = DELIVER_KAKAO_SENDER_KEY_POSITION + DELIVER_KAKAO_SENDER_KEY_LENGTH;
+
+    public static void putSubjectForDeliver(ByteBuffer buffer, String subject) {
+        if (buffer == null || subject == null) {
+            return;
+        }
+        subject = CommonUtil.cutString(subject, DELIVER_SUBJECT_LENGTH);
+        buffer.put(DELIVER_SUBJECT_POSITION, subject.getBytes());
+    }
+    public static String getSubjectForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_SUBJECT_POSITION);
+        byte[] destArray = new byte[DELIVER_SUBJECT_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+
+    public static void putMessageForDeliver(ByteBuffer buffer, String message) {
+        if (buffer == null || message == null) {
+            return;
+        }
+        message = CommonUtil.cutString(message, DELIVER_MESSAGE_LENGTH);
+        buffer.put(DELIVER_MESSAGE_POSITION, message.getBytes());
+    }
+    public static String getMessageForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_MESSAGE_POSITION);
+        byte[] destArray = new byte[DELIVER_MESSAGE_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+    public static void putKakaoSenderKeyForDeliver(ByteBuffer buffer, String kakaoSenderKey) {
+        if (buffer == null || kakaoSenderKey == null) {
+            return;
+        }
+        kakaoSenderKey = CommonUtil.cutString(kakaoSenderKey, DELIVER_KAKAO_SENDER_KEY_LENGTH);
+        buffer.put(DELIVER_KAKAO_SENDER_KEY_POSITION, kakaoSenderKey.getBytes());
+    }
+    public static String getKakaoSenderKeyForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_KAKAO_SENDER_KEY_POSITION);
+        byte[] destArray = new byte[DELIVER_KAKAO_SENDER_KEY_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+    public static void putKakaoTemplateCodeForDeliver(ByteBuffer buffer, String kakaoTemplateCode) {
+        if (buffer == null || kakaoTemplateCode == null) {
+            return;
+        }
+        kakaoTemplateCode = CommonUtil.cutString(kakaoTemplateCode, DELIVER_KAKAO_TEMPLATE_CODE_LENGTH);
+        buffer.put(DELIVER_KAKAO_TEMPLATE_CODE_POSITION, kakaoTemplateCode.getBytes());
+    }
+    public static String getKakaoTemplateCodeForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_KAKAO_TEMPLATE_CODE_POSITION);
+        byte[] destArray = new byte[DELIVER_KAKAO_TEMPLATE_CODE_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+
+    public static String getFileNameForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_JSON_FILENAME_POSITION);
+        byte[] destArray = new byte[DELIVER_JSON_FILENAME_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+
+    public static String getFileSizeForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_JSON_FILESIZE_POSITION);
+        byte[] destArray = new byte[DELIVER_JSON_FILESIZE_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+
+    public static ByteBuffer makeDeliverAckBuffer(String msgId, String status) {
+        ByteBuffer buffer = ByteBuffer.allocate(Header.HEADER_LENGTH + DELIVER_KAKAO_ACK_BODY_LENGTH);
+        Packet.setDefaultByte(buffer);
+        Header.putHeader(buffer, Header.COMMAND_DELIVER_ACK, DELIVER_KAKAO_ACK_BODY_LENGTH);
+        buffer.put(CommonMessage.DELIVER_ACK_MESSAGE_ID_POSITION, msgId.getBytes());
+        buffer.put(CommonMessage.DELIVER_ACK_RESULT_POSITION, status.getBytes());
+
+        return buffer;
+    }
+}
src/main/java/com/munjaon/server/server/packet/LmsMessage.java
--- src/main/java/com/munjaon/server/server/packet/LmsMessage.java
+++ src/main/java/com/munjaon/server/server/packet/LmsMessage.java
@@ -5,7 +5,7 @@
 import java.nio.ByteBuffer;
 
 public final class LmsMessage {
-    public static final int DELIVER_LMS_BODY_LENGTH = 2119;
+    public static final int DELIVER_LMS_BODY_LENGTH = 2129;
     public static final int DELIVER_LMS_ACK_BODY_LENGTH = 21;
 
     /* DELIVER */
src/main/java/com/munjaon/server/server/packet/MmsMessage.java
--- src/main/java/com/munjaon/server/server/packet/MmsMessage.java
+++ src/main/java/com/munjaon/server/server/packet/MmsMessage.java
@@ -5,7 +5,7 @@
 import java.nio.ByteBuffer;
 
 public final class MmsMessage {
-    public static final int DELIVER_MMS_BODY_LENGTH = 2120;
+    public static final int DELIVER_MMS_BODY_LENGTH = 2130;
     public static final int DELIVER_MMS_ACK_BODY_LENGTH = 21;
 
     /* DELIVER */
@@ -18,6 +18,14 @@
     /* FILECOUNT */
     public static final int DELIVER_FILECOUNT_LENGTH = 1;
     public static final int DELIVER_FILECOUNT_POSITION = DELIVER_MESSAGE_POSITION + DELIVER_MESSAGE_LENGTH;
+
+    public static final int LIMIT_FILE_CAPACITY = 1024 * 300;
+
+    public static final int DELIVER_MMS_FILENAME_LENGTH = 40;
+    public static final int DELIVER_MMS_FILENAME_POSITION = 0;
+
+    public static final int DELIVER_MMS_FILESIZE_LENGTH = 8;
+    public static final int DELIVER_MMS_FILESIZE_POSITION = DELIVER_MMS_FILENAME_POSITION + DELIVER_MMS_FILENAME_LENGTH;
 
     public static void putSubjectForDeliver(ByteBuffer buffer, String subject) {
         if (buffer == null || subject == null) {
@@ -78,6 +86,40 @@
 
         return Packet.getString(destArray);
     }
+
+    public static String getFileNameForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_MMS_FILENAME_POSITION);
+        byte[] destArray = new byte[DELIVER_MMS_FILENAME_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+
+    public static String getFileSizeForDeliver(ByteBuffer buffer) {
+        if (buffer == null) {
+            return null;
+        }
+
+        buffer.position(DELIVER_MMS_FILESIZE_POSITION);
+        byte[] destArray = new byte[DELIVER_MMS_FILESIZE_LENGTH];
+        buffer.get(destArray);
+
+        return Packet.getString(destArray);
+    }
+
+    public static ByteBuffer makeDeliverAckBuffer(String msgId, String status) {
+        ByteBuffer buffer = ByteBuffer.allocate(Header.HEADER_LENGTH + DELIVER_MMS_ACK_BODY_LENGTH);
+        Packet.setDefaultByte(buffer);
+        Header.putHeader(buffer, Header.COMMAND_DELIVER_ACK, DELIVER_MMS_ACK_BODY_LENGTH);
+        buffer.put(CommonMessage.DELIVER_ACK_MESSAGE_ID_POSITION, msgId.getBytes());
+        buffer.put(CommonMessage.DELIVER_ACK_RESULT_POSITION, status.getBytes());
+
+        return buffer;
+    }
 //    public static void makeDataForDeliver(ByteBuffer buffer, MunjaonMsg data) {
 //        if (buffer == null || data == null) {
 //            return;
src/main/java/com/munjaon/server/server/service/CollectServerService.java
--- src/main/java/com/munjaon/server/server/service/CollectServerService.java
+++ src/main/java/com/munjaon/server/server/service/CollectServerService.java
@@ -47,6 +47,7 @@
         } else {
             this.IS_READY_YN = false;
         }
+        saveSystemLog("CollectServerService ready : " + this.IS_READY_YN);
     }
 
     @Override
src/main/java/com/munjaon/server/server/task/CollectReadTask.java
--- src/main/java/com/munjaon/server/server/task/CollectReadTask.java
+++ src/main/java/com/munjaon/server/server/task/CollectReadTask.java
@@ -8,8 +8,9 @@
 import com.munjaon.server.server.dto.ConnectUserDto;
 import com.munjaon.server.server.packet.*;
 import com.munjaon.server.server.queue.CollectUserQueue;
-import com.munjaon.server.util.LogUtil;
+import com.munjaon.server.util.*;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
@@ -158,15 +159,144 @@
     }
 
     private void recvMmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+        try {
+            ByteBuffer bodyBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_BODY_LENGTH);
+            channel.read(bodyBuffer);
+            ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + MmsMessage.DELIVER_MMS_BODY_LENGTH);
+            Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer);
 
+            BasicMessageDto messageDto = recvCommonMessage(deliverBuffer);
+            messageDto.setUserSubject(MmsMessage.getSubjectForDeliver(deliverBuffer));
+            messageDto.setUserMessage(MmsMessage.getMessageForDeliver(deliverBuffer));
+            String fileCount = MessageUtil.doNumber(MmsMessage.getFileCountForDeliver(deliverBuffer));
+            int recvFileCount = 0;
+            if (fileCount != null && fileCount.length() > 0) {
+                recvFileCount = Integer.parseInt(fileCount);
+                messageDto.setUserFileCnt(recvFileCount);
+                saveSystemLog("recvFileCount : " + recvFileCount);
+            }
+
+            saveSystemLog("messageDto : " + messageDto.toString());
+
+            String imagePath = System.getProperty("ROOTPATH") + File.separator + "mmsfile";
+            imagePath = imagePath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo();
+            FileUtil.mkdirs(imagePath);
+
+            for (int i = 0; i < recvFileCount; i++) {
+                ByteBuffer fileHeadBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_FILENAME_LENGTH + MmsMessage.DELIVER_MMS_FILESIZE_LENGTH);
+                channel.read(fileHeadBuffer);
+                String fileName = MmsMessage.getFileNameForDeliver(fileHeadBuffer);
+                String fileSize = MmsMessage.getFileSizeForDeliver(fileHeadBuffer);
+                ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
+                channel.read(fileBuffer);
+                fileBuffer.flip();
+                JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
+                if (i == 0) {
+                    messageDto.setUserFileName01(imagePath + File.separator + fileName);
+                } else if (i == 1) {
+                    messageDto.setUserFileName02(imagePath + File.separator + fileName);
+                } else if (i == 2) {
+                    messageDto.setUserFileName03(imagePath + File.separator + fileName);
+                }
+                saveSystemLog("File : " + fileName + ", Size : " + fileSize);
+            }
+
+            QueueTypeWorker worker = QueueTypeWorker.find("MMS");
+            if (worker != null) {
+                worker.pushQueue(messageDto);
+                channel.write(MmsMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     private void recvKatDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+        try {
+            ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            channel.read(bodyBuffer);
+            ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer);
 
+            BasicMessageDto messageDto = recvCommonMessage(deliverBuffer);
+            messageDto.setUserSubject(KakaoMessage.getSubjectForDeliver(deliverBuffer));
+            messageDto.setUserMessage(KakaoMessage.getMessageForDeliver(deliverBuffer));
+            messageDto.setKakaoSenderKey(KakaoMessage.getKakaoSenderKeyForDeliver(deliverBuffer));
+            messageDto.setKakaoTemplateCode(KakaoMessage.getKakaoTemplateCodeForDeliver(deliverBuffer));
+
+            saveSystemLog("messageDto : " + messageDto.toString());
+
+            String jsonPath = System.getProperty("ROOTPATH") + File.separator + "kakaofile";
+            jsonPath = jsonPath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo();
+            FileUtil.mkdirs(jsonPath);
+
+            ByteBuffer fileHeadBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_JSON_FILENAME_LENGTH + KakaoMessage.DELIVER_JSON_FILESIZE_LENGTH);
+            channel.read(fileHeadBuffer);
+
+            String fileName = KakaoMessage.getFileNameForDeliver(fileHeadBuffer);
+            String fileSize = KakaoMessage.getFileSizeForDeliver(fileHeadBuffer);
+
+            ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
+            channel.read(fileBuffer);
+            fileBuffer.flip();
+            JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer);
+
+            messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName);
+            saveSystemLog("File : " + fileName + ", Size : " + fileSize);
+
+            QueueTypeWorker worker = QueueTypeWorker.find("KAT");
+            if (worker != null) {
+                worker.pushQueue(messageDto);
+                channel.write(KakaoMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus()));
+            } else {
+                saveSystemLog("worker is null");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     private void recvKftDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
+        try {
+            ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            channel.read(bodyBuffer);
+            ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + KakaoMessage.DELIVER_KAKAO_BODY_LENGTH);
+            Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer);
 
+            BasicMessageDto messageDto = recvCommonMessage(deliverBuffer);
+            messageDto.setUserSubject(KakaoMessage.getSubjectForDeliver(deliverBuffer));
+            messageDto.setUserMessage(KakaoMessage.getMessageForDeliver(deliverBuffer));
+            messageDto.setKakaoSenderKey(KakaoMessage.getKakaoSenderKeyForDeliver(deliverBuffer));
+            messageDto.setKakaoTemplateCode(KakaoMessage.getKakaoTemplateCodeForDeliver(deliverBuffer));
+
+            saveSystemLog("messageDto : " + messageDto.toString());
+
+            String jsonPath = System.getProperty("ROOTPATH") + File.separator + "kakaofile";
+            jsonPath = jsonPath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo();
+            FileUtil.mkdirs(jsonPath);
+
+            ByteBuffer fileHeadBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_JSON_FILENAME_LENGTH + KakaoMessage.DELIVER_JSON_FILESIZE_LENGTH);
+            channel.read(fileHeadBuffer);
+
+            String fileName = KakaoMessage.getFileNameForDeliver(fileHeadBuffer);
+            String fileSize = KakaoMessage.getFileSizeForDeliver(fileHeadBuffer);
+
+            ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
+            channel.read(fileBuffer);
+            fileBuffer.flip();
+            JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer);
+
+            messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName);
+            saveSystemLog("File : " + fileName + ", Size : " + fileSize);
+
+            QueueTypeWorker worker = QueueTypeWorker.find("KFT");
+            if (worker != null) {
+                worker.pushQueue(messageDto);
+                channel.write(KakaoMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     private void recvLinkCheck(SocketChannel channel) throws IOException {
src/main/java/com/munjaon/server/util/JobFileFactory.java
--- src/main/java/com/munjaon/server/util/JobFileFactory.java
+++ src/main/java/com/munjaon/server/util/JobFileFactory.java
@@ -8,7 +8,10 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -346,6 +349,17 @@
         return transferStatus;
     }
 
+    public static void saveFileForByteBuffer(final String path, final String fileName, final ByteBuffer buffer) throws IOException {
+        FileChannel fileChannel = FileChannel.open(
+                Paths.get(path + File.separator + fileName),
+                StandardOpenOption.CREATE_NEW,
+                StandardOpenOption.READ,
+                StandardOpenOption.WRITE
+        );
+        fileChannel.write(buffer);
+        fileChannel.close();
+    }
+
     public static String getJobDirectory(final String rootDirectory, final String orderNo, final String companyNo, final String date) {
         return rootDirectory + File.separator + orderNo + File.separator + orderNo + "_" + companyNo + File.separator + date;
     }
src/main/java/com/munjaon/server/util/MessageUtil.java
--- src/main/java/com/munjaon/server/util/MessageUtil.java
+++ src/main/java/com/munjaon/server/util/MessageUtil.java
@@ -171,63 +171,75 @@
         buffer.position(BodyCommonConfig.USERID_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.USERID_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserId(new String(destArray));
+        messageDto.setUserId(QueueConstants.getString(destArray));
+//        messageDto.setUserId(new String(destArray));
         /* 2. 요금제(선불 : P / 후불 : A) : final : 아무작업도 하지 않음 */
         /* 3. 단가 */
         buffer.position(BodyCommonConfig.UNITCOST_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.UNITCOST_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUnitCost(new String(destArray));
+        messageDto.setUnitCost(QueueConstants.getString(destArray));
+//        messageDto.setUnitCost(new String(destArray));
         /* 4. MSG Group ID */
         buffer.position(BodyCommonConfig.MSGGROUPID_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.MSGGROUPID_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setMsgGroupID(new String(destArray));
+        messageDto.setMsgGroupID(QueueConstants.getString(destArray));
+//        messageDto.setMsgGroupID(new String(destArray));
         /* 5. MSG ID */
         buffer.position(BodyCommonConfig.MSGID_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.MSGID_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserMsgID(new String(destArray));
+        messageDto.setUserMsgID(QueueConstants.getString(destArray));
+//        messageDto.setUserMsgID(new String(destArray));
         /* 6. Service Type */
         buffer.position(BodyCommonConfig.SERVICETYPE_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.SERVICETYPE_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setServiceType(new String(destArray));
+        messageDto.setServiceType(QueueConstants.getString(destArray));
+//        messageDto.setServiceType(new String(destArray));
         /* 7. 메시지 전송 결과 >> 성공 : 0 / 필터링 : 기타값  */
         buffer.position(BodyCommonConfig.SENDSTATUS_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.SENDSTATUS_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setSendStatus(new String(destArray));
+        messageDto.setSendStatus(QueueConstants.getString(destArray));
+//        messageDto.setSendStatus(new String(destArray));
         /* 8. 회신번호 */
         buffer.position(BodyCommonConfig.SENDER_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.SENDER_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserSender(new String(destArray));
+        messageDto.setUserSender(QueueConstants.getString(destArray));
+//        messageDto.setUserSender(new String(destArray));
         /* 9. 수신번호 */
         buffer.position(BodyCommonConfig.RECEIVER_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.RECEIVER_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserReceiver(new String(destArray));
+        messageDto.setUserReceiver(QueueConstants.getString(destArray));
+//        messageDto.setUserReceiver(new String(destArray));
         /* 10. 예약시간 */
         buffer.position(BodyCommonConfig.RESERVEDT_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.RESERVEDT_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setReserveDt(new String(destArray));
+        messageDto.setReserveDt(QueueConstants.getString(destArray));
+//        messageDto.setReserveDt(new String(destArray));
         /* 11. 요청시간 */
         buffer.position(BodyCommonConfig.REQUESTDT_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.REQUESTDT_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setRequestDt(new String(destArray));
+        messageDto.setRequestDt(QueueConstants.getString(destArray));
+//        messageDto.setRequestDt(new String(destArray));
         /* 12. 원격 주소 */
         buffer.position(BodyCommonConfig.REMOTEIP_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.REMOTEIP_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setRemoteIP(new String(destArray));
+        messageDto.setRemoteIP(QueueConstants.getString(destArray));
+//        messageDto.setRemoteIP(new String(destArray));
         /* 13. 발송망 */
         buffer.position(BodyCommonConfig.AGENT_CODE_BYTE_POSITION);
         destArray = new byte[BodyCommonConfig.AGENT_CODE_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setRouterSeq(new String(destArray));
+        messageDto.setRouterSeq(QueueConstants.getString(destArray));
+//        messageDto.setRouterSeq(new String(destArray));
     }
 
     public static void setBytesForSmsMessage(ByteBuffer buffer, BasicMessageDto messageDto) {
@@ -245,7 +257,8 @@
         buffer.position(SmsBodyConfig.SMS_MSG_BYTE_POSITION);
         destArray = new byte[SmsBodyConfig.SMS_MSG_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserMessage(new String(destArray));
+        messageDto.setUserMessage(QueueConstants.getString(destArray));
+//        messageDto.setUserMessage(new String(destArray));
     }
 
     public static void setBytesForMediaMessage(ByteBuffer buffer, BasicMessageDto messageDto) {
@@ -257,6 +270,61 @@
         buffer.put(messageDto.getUserMessage().getBytes());
     }
 
+    public static void setBytesForKakaoMessage(ByteBuffer buffer, BasicMessageDto messageDto) {
+        /* 14. 제목 */
+        buffer.position(KakaoBodyConfig.SUBJECT_BYTE_POSITION);
+        buffer.put(messageDto.getUserSubject().getBytes());
+        /* 15. 메시지 */
+        buffer.position(KakaoBodyConfig.MEDIA_MSG_BYTE_POSITION);
+        buffer.put(messageDto.getUserMessage().getBytes());
+        /* 16. KAKAO_SENDER_KEY */
+        buffer.position(KakaoBodyConfig.KAKAO_SENDER_KEY_BYTE_POSITION);
+        buffer.put(messageDto.getKakaoSenderKey().getBytes());
+        /* 17. KAKAO_TEMPLATE_CODE */
+        buffer.position(KakaoBodyConfig.KAKAO_TEMPLATE_CODE_BYTE_POSITION);
+        buffer.put(messageDto.getKakaoTemplateCode().getBytes());
+        /* 18. KAKAO_JSON_FILE */
+        buffer.position(KakaoBodyConfig.FILENAME_JSON_BYTE_POSITION);
+        buffer.put(messageDto.getKakaoJsonFile().getBytes());
+    }
+
+    public static void getBytesForKakaoMessage(ByteBuffer buffer, BasicMessageDto messageDto) {
+        byte[] destArray = null;
+        if (buffer == null || messageDto == null) {
+            return;
+        }
+        /* 14. 제목 */
+        buffer.position(KakaoBodyConfig.SUBJECT_BYTE_POSITION);
+        destArray = new byte[KakaoBodyConfig.SUBJECT_BYTE_LENGTH];
+        buffer.get(destArray);
+        messageDto.setUserSubject(QueueConstants.getString(destArray));
+//        messageDto.setUserSubject(new String(destArray));
+        /* 15. 메시지 */
+        buffer.position(KakaoBodyConfig.MEDIA_MSG_BYTE_POSITION);
+        destArray = new byte[KakaoBodyConfig.MEDIA_MSG_BYTE_LENGTH];
+        buffer.get(destArray);
+        messageDto.setUserMessage(QueueConstants.getString(destArray));
+//        messageDto.setUserMessage(new String(destArray));
+        /* 16. KAKAO_SENDER_KEY */
+        buffer.position(KakaoBodyConfig.KAKAO_SENDER_KEY_BYTE_POSITION);
+        destArray = new byte[KakaoBodyConfig.KAKAO_SENDER_KEY_BYTE_LENGTH];
+        buffer.get(destArray);
+        messageDto.setKakaoSenderKey(QueueConstants.getString(destArray));
+//        messageDto.setUserSubject(new String(destArray));\
+        /* 17. KAKAO_TEMPLATE_CODE */
+        buffer.position(KakaoBodyConfig.KAKAO_TEMPLATE_CODE_BYTE_POSITION);
+        destArray = new byte[KakaoBodyConfig.KAKAO_TEMPLATE_CODE_BYTE_LENGTH];
+        buffer.get(destArray);
+        messageDto.setKakaoTemplateCode(QueueConstants.getString(destArray));
+//        messageDto.setUserSubject(new String(destArray));
+        /* 18. KAKAO_JSON_FILE */
+        buffer.position(KakaoBodyConfig.FILENAME_JSON_BYTE_POSITION);
+        destArray = new byte[KakaoBodyConfig.FILENAME_JSON_BYTE_LENGTH];
+        buffer.get(destArray);
+        messageDto.setKakaoJsonFile(QueueConstants.getString(destArray));
+//        messageDto.setUserSubject(new String(destArray));
+    }
+
     public static void getBytesForMediaMessage(ByteBuffer buffer, BasicMessageDto messageDto) {
         byte[] destArray = null;
         if (buffer == null || messageDto == null) {
@@ -266,12 +334,14 @@
         buffer.position(MediaBodyConfig.SUBJECT_BYTE_POSITION);
         destArray = new byte[MediaBodyConfig.SUBJECT_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserSubject(new String(destArray));
+        messageDto.setUserSubject(QueueConstants.getString(destArray));
+//        messageDto.setUserSubject(new String(destArray));
         /* 15. 메시지 */
         buffer.position(MediaBodyConfig.MEDIA_MSG_BYTE_POSITION);
         destArray = new byte[MediaBodyConfig.MEDIA_MSG_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserMessage(new String(destArray));
+        messageDto.setUserMessage(QueueConstants.getString(destArray));
+//        messageDto.setUserMessage(new String(destArray));
     }
 
     public static void setBytesForMmsMessage(ByteBuffer buffer, BasicMessageDto messageDto) {
@@ -304,22 +374,26 @@
         buffer.position(MediaBodyConfig.FILECNT_BYTE_POSITION);
         destArray = new byte[MediaBodyConfig.FILECNT_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserFileCnt(Integer.parseInt(new String(destArray)));
+        messageDto.setUserFileCnt(Integer.parseInt(QueueConstants.getString(destArray)));
+//        messageDto.setUserFileCnt(Integer.parseInt(new String(destArray)));
         /* 17. 파일명 #1 */
         buffer.position(MediaBodyConfig.FILENAME_ONE_BYTE_POSITION);
         destArray = new byte[MediaBodyConfig.FILENAME_ONE_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserFileName01(new String(destArray));
+        messageDto.setUserFileName01(QueueConstants.getString(destArray));
+//        messageDto.setUserFileName01(new String(destArray));
         /* 18. 파일명 #2 */
         buffer.position(MediaBodyConfig.FILENAME_TWO_BYTE_POSITION);
         destArray = new byte[MediaBodyConfig.FILENAME_TWO_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserFileName02(new String(destArray));
+        messageDto.setUserFileName02(QueueConstants.getString(destArray));
+//        messageDto.setUserFileName02(new String(destArray));
         /* 19. 파일명 #3 */
         buffer.position(MediaBodyConfig.FILENAME_THREE_BYTE_POSITION);
         destArray = new byte[MediaBodyConfig.FILENAME_THREE_BYTE_LENGTH];
         buffer.get(destArray);
-        messageDto.setUserFileName03(new String(destArray));
+        messageDto.setUserFileName03(QueueConstants.getString(destArray));
+//        messageDto.setUserFileName03(new String(destArray));
     }
 
     public static int isValidateMessageForReport(ReportDto reportDto) {
src/main/resources/dev/application-dev.yml
--- src/main/resources/dev/application-dev.yml
+++ src/main/resources/dev/application-dev.yml
@@ -2,7 +2,7 @@
   datasource:
     server:
       driver-class-name: org.mariadb.jdbc.Driver
-      jdbc-url: jdbc:mariadb://119.193.215.98:3306/mjon_agent
+      jdbc-url: jdbc:mariadb://119.193.215.98:3306/mjon_agent_back
       username: mjonUr_agent
       password: mjagent123$
 
@@ -12,6 +12,6 @@
 
 # ### 에이전트 설정 관련 ####################################################################################
 agent:
-  root-path: C:/apps/agent_server
-  server-property-file: C:/apps/agent_server/config/server.properties
+  root-path: /home/mjon_server_agent
+  server-property-file: /home/mjon_server_agent/config/server.properties
   db-name: mjon_agent_back
(No newline at end of file)
src/main/resources/local/application-local.yml
--- src/main/resources/local/application-local.yml
+++ src/main/resources/local/application-local.yml
@@ -2,6 +2,7 @@
   datasource:
     server:
       driver-class-name: org.mariadb.jdbc.Driver
+      url: jdbc:mariadb://119.193.215.98:3306/mjon_agent_back
       jdbc-url: jdbc:mariadb://119.193.215.98:3306/mjon_agent_back
       username: mjonUr_agent
       password: mjagent123$
 
src/main/resources/sqlmap/kat_sql.xml (added)
+++ src/main/resources/sqlmap/kat_sql.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.munjaon.server.queue.mapper.KatMapper">
+    <insert id="insert">
+        INSERT INTO MJ_MSG_DATA (
+                                  MSG_ID
+                                , MSG_GROUP_ID
+                                , USER_ID
+                                , AGENT_MSG_ID
+                                , AGENT_CODE
+                                , CUR_STATE
+                                , MSG_NOTICETALK_SENDER_KEY
+                                , MSG_NOTICETALK_TMP_KEY
+                                , REQ_DATE
+                                , CALL_TO
+                                , CALL_FROM
+                                , SMS_TXT
+                                , BIZ_KAKAO_TITLE
+                                , MSG_TYPE
+                                , BIZ_KAKAO_RESEND_YN
+                                , BIZ_KAKAO_RESEND_DATA
+                                , BIZ_KAKAO_RESEND_TYPE
+                                , BIZ_KAKAO_JSON_FILE
+        ) VALUES (#{id}, #{msgGroupID}, #{userId}, #{userMsgID}, '04', 0, #{kakaoSenderKey}, #{kakaoTemplateCode}, NOW(), #{userReceiver}, #{userSender}, #{userMessage}, #{userSubject}, '8', 'N', null, null, #{kakaoJsonFile})
+    </insert>
+</mapper>(No newline at end of file)
 
src/main/resources/sqlmap/kft_sql.xml (added)
+++ src/main/resources/sqlmap/kft_sql.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.munjaon.server.queue.mapper.KftMapper">
+    <insert id="insert">
+        INSERT INTO MJ_MSG_DATA (MSG_ID
+                                , MSG_GROUP_ID
+                                , USER_ID
+                                , AGENT_MSG_ID
+                                , AGENT_CODE
+                                , CUR_STATE
+                                , MSG_NOTICETALK_SENDER_KEY
+                                , MSG_NOTICETALK_TMP_KEY
+                                , REQ_DATE
+                                , CALL_TO
+                                , CALL_FROM
+                                , SMS_TXT
+                                , BIZ_KAKAO_TITLE
+                                , MSG_TYPE
+                                , BIZ_KAKAO_RESEND_YN
+                                , BIZ_KAKAO_RESEND_DATA
+                                , BIZ_KAKAO_RESEND_TYPE
+                                , BIZ_KAKAO_JSON_FILE
+        ) VALUES (#{id}, #{msgGroupID}, #{userId}, #{userMsgID}, '04', 0, #{kakaoSenderKey}, #{kakaoTemplateCode}, NOW(), #{userReceiver}, #{userSender}, #{userMessage}, #{userSubject}, '9', 'N', null, null, #{kakaoJsonFile})
+    </insert>
+</mapper>(No newline at end of file)
 
src/main/resources/sqlmap/mms_sql.xml (added)
+++ src/main/resources/sqlmap/mms_sql.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.munjaon.server.queue.mapper.MmsMapper">
+    <insert id="insert">
+        INSERT INTO MJ_MSG_DATA (
+                                  MSG_ID
+                                , MSG_GROUP_ID
+                                , USER_ID
+                                , AGENT_MSG_ID
+                                , AGENT_CODE
+                                , CUR_STATE
+                                , REQ_DATE
+                                , CALL_TO
+                                , CALL_FROM
+                                , SUBJECT
+                                , SMS_TXT
+                                , MSG_TYPE
+                                , CONT_SEQ
+                                , FILE_CNT
+                                , FILE_PATH1
+                                , FILE_PATH2
+                                , FILE_PATH3
+                                , NEO_TYPE
+        ) VALUES (#{id}, #{msgGroupID}, #{userId}, #{userMsgID}, '04', 0, NOW(), #{userReceiver}, #{userSender}, #{userSubject}, #{userMessage}, '6', null, #{userFileCnt}, #{userFileName01}, #{userFileName02}, #{userFileName03}, null)
+    </insert>
+</mapper>(No newline at end of file)
Add a comment
List