feat: keySequence 서비스 추가

p6spy log 출력 변경
      - connection ID 출력 추가 적용
      - sql 로그 포맷 적용
main
Jonguk. Lim 2 months ago
parent 0e3fd7c23b
commit d2acc24567

@ -2,64 +2,46 @@ package cokr.xit.ens.core.config.logging;
import java.util.Locale; import java.util.Locale;
import javax.annotation.PostConstruct;
import org.hibernate.engine.jdbc.internal.FormatStyle; import org.hibernate.engine.jdbc.internal.FormatStyle;
import com.p6spy.engine.logging.Category; import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.P6SpyOptions;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class P6spySqlFormatConfiguration implements MessageFormattingStrategy { public class P6spySqlFormatConfiguration implements MessageFormattingStrategy {
private static final String NEW_LINE = "\n";
private static final String TAP = "\t";
private static final String CREATE = "create"; private static final String CREATE = "create";
private static final String ALTER = "alter"; private static final String ALTER = "alter";
private static final String DROP = "drop"; private static final String DROP = "drop";
private static final String COMMENT = "comment"; private static final String COMMENT = "comment";
@Override @PostConstruct
public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { public void setLogMessageFormat() {
if (sql.trim().isEmpty()) { P6SpyOptions.getActiveInstance().setLogMessageFormat(this.getClass().getName());
return formatByCommand(category);
} return formatBySql(sql, category) + getAdditionalMessages(elapsed);
}
private static String formatByCommand(String category) {
return NEW_LINE
+ "Execute Command : "
+ NEW_LINE
+ NEW_LINE
+ TAP
+ category
+ NEW_LINE
+ NEW_LINE
+ "----------------------------------------------------------------------------------------------------";
} }
private String formatBySql(String sql, String category) {
if (isStatementDDL(sql, category)) { @Override
return NEW_LINE public String formatMessage(final int connectionId, final String now, final long elapsed, final String category, final String prepared, final String sql, final String url) {
+ "Execute DDL : "
+ NEW_LINE // FIXME: JPA 미사용시 SQL format 적용
+ FormatStyle.DDL //return "connection " + connectionId + " | took " + elapsed + "ms | " + category + "\n" + sql;
.getFormatter()
.format(sql); // FIXME: JPA 사용시 SQL format 적용
} return NEW_LINE if(isStatementDDL(sql, category)) {
+ "Execute DML : "
+ NEW_LINE return "connection " + connectionId + " | took " + elapsed + "ms | " + category + "\n" + FormatStyle.DDL.getFormatter().format(sql);
+ FormatStyle.BASIC }
.getFormatter() return "connection " + connectionId + " | took " + elapsed + "ms | " + category + "\n" + FormatStyle.BASIC.getFormatter().format(sql);
.format(sql);
}
private String getAdditionalMessages(long elapsed) {
return NEW_LINE
+ NEW_LINE
+ String.format("Execution Time: %s ms", elapsed)
+ NEW_LINE
+ "----------------------------------------------------------------------------------------------------";
} }
private boolean isStatementDDL(String sql, String category) { private boolean isStatementDDL(String sql, String category) {
return isStatement(category) && isDDL(sql.trim().toLowerCase(Locale.ROOT)); return isStatement(category) && isDDL(sql.trim().toLowerCase(Locale.ROOT));
} }
private boolean isStatement(String category) { private boolean isStatement(String category) {
return Category.STATEMENT.getName().equals(category); return Category.STATEMENT.getName().equals(category);
} }

@ -1,10 +1,14 @@
package cokr.xit.ens.modules.common.ctgy.sys.mng.mapper; package cokr.xit.ens.modules.common.ctgy.sys.mng.mapper;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/** /**
* <pre> * <pre>
* description : * description :
* packageName : cokr.xit.ens.modules.common.ctgy.sys.mng.mapper * packageName : cokr.xit.ens.modules.common.ctgy.sys.mng.mapper
* fileName : IOrgMngMapper * fileName : IKeySequenceMapper
* author : limju * author : limju
* date : 2024 9 03 * date : 2024 9 03
* ====================================================================== * ======================================================================
@ -14,5 +18,9 @@ package cokr.xit.ens.modules.common.ctgy.sys.mng.mapper;
* *
* </pre> * </pre>
*/ */
public interface IOrgMngMapper { // FIXME: 카카오톡 신규 추가
@Mapper
public interface IKeySequenceMapper {
Long selectKeySequence(String seqName);
void saveKeySequence(Map<String, Object> map);
} }

@ -0,0 +1,36 @@
package cokr.xit.ens.modules.common.ctgy.sys.mng.service;
import java.util.HashMap;
import java.util.Map;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import cokr.xit.ens.modules.common.ctgy.sys.mng.mapper.IKeySequenceMapper;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class KeySequenceService {
private final IKeySequenceMapper mapper;
/**
* 퀀
* @param seqName 퀀
* @return Long
*/
@Transactional
public Long getKeySequence(String seqName) {
Long nextSeq = mapper.selectKeySequence(seqName);
if(nextSeq == null) {
nextSeq = 1L;
}
Map<String, Object> map = new HashMap<>();
map.put("seqName", seqName);
map.put("nextVal", nextSeq);
mapper.saveKeySequence(map);
return nextSeq;
}
}

@ -39,6 +39,7 @@ import cokr.xit.ens.modules.common.ctgy.intgrnbill.support.entity.repository.Bil
import cokr.xit.ens.modules.common.ctgy.mblpage.domain.SendDetailMblPage; import cokr.xit.ens.modules.common.ctgy.mblpage.domain.SendDetailMblPage;
import cokr.xit.ens.modules.common.ctgy.mblpage.domain.repository.SendDetailMblPageRepository; import cokr.xit.ens.modules.common.ctgy.mblpage.domain.repository.SendDetailMblPageRepository;
import cokr.xit.ens.modules.common.ctgy.sys.mng.domain.OrgMng; import cokr.xit.ens.modules.common.ctgy.sys.mng.domain.OrgMng;
import cokr.xit.ens.modules.common.ctgy.sys.mng.service.KeySequenceService;
import cokr.xit.ens.modules.common.ctgy.sys.mng.service.OrgMngService; import cokr.xit.ens.modules.common.ctgy.sys.mng.service.OrgMngService;
import cokr.xit.ens.modules.common.ctgy.sys.mng.service.TmpltMngService; import cokr.xit.ens.modules.common.ctgy.sys.mng.service.TmpltMngService;
import cokr.xit.ens.modules.common.domain.SendMast; import cokr.xit.ens.modules.common.domain.SendMast;
@ -57,6 +58,7 @@ public class KkoTalkAcceptor implements EnsPhaseProcSupport<EnsResponseVO<?>, Kk
private final SendMastRepository sendMastRepository; private final SendMastRepository sendMastRepository;
private final IKkoTalkMapper kkoTalkMapper; private final IKkoTalkMapper kkoTalkMapper;
private final KeySequenceService keySequenceService;
private final SendDetailMblPageRepository sendDetailMblPageRepository; private final SendDetailMblPageRepository sendDetailMblPageRepository;
private final BillRepository billRepository; private final BillRepository billRepository;
private final OrgMngService orgMngService; private final OrgMngService orgMngService;
@ -235,7 +237,10 @@ public class KkoTalkAcceptor implements EnsPhaseProcSupport<EnsResponseVO<?>, Kk
); );
// kkotalk 발송상세 저장 // kkotalk 발송상세 저장
sendDetails.forEach(kkoTalkMapper::saveSndDtlKkoTalk); sendDetails.forEach(d -> {
d.setSendDetailId(keySequenceService.getKeySequence("SendDetailKkoTalk_id"));
kkoTalkMapper.saveSndDtlKkoTalk(d);
});
if (!sendDetailMblPages.isEmpty()) if (!sendDetailMblPages.isEmpty())

@ -0,0 +1,27 @@
<?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="cokr.xit.ens.modules.common.ctgy.sys.mng.mapper.IKeySequenceMapper">
<select id="selectKeySequence" parameterType="string" resultType="long">
/** iup-keyseq-mapper|selectKeySequence-key sequence 조회|julim */
SELECT next_val + 1
FROM ens_seq_generator
WHERE seq_name = #{seqName}
FOR UPDATE
</select>
<insert id="saveKeySequence" parameterType="map">
/** iup-keyseq-mapper|saveKeySequence-key sequence 저장|julim */
MERGE
INTO ens_seq_generator tgt
USING (SELECT #{seqName} AS seq_name, #{nextVal} AS next_val FROM dual) src
ON (tgt.seq_name = src.seq_name)
WHEN MATCHED THEN
UPDATE SET tgt.next_val = src.next_val
WHEN NOT MATCHED THEN
INSERT (seq_name, next_val)
VALUES (src.seq_name, src.next_val)
</insert>
</mapper>

@ -1,79 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cokr.xit.ens.modules.kkotalk.mapper.IKkoTalkMapper"> <mapper namespace="cokr.xit.ens.modules.kkotalk.mapper.IKkoTalkMapper">
<!-- // FIXME: 카카오톡 신규 추가 --> <!-- // FIXME: 카카오톡 신규 추가 -->
<!-- =================================================================================== --> <!-- =================================================================================== -->
<!-- ================================ accept =========================================== --> <!-- ================================ accept =========================================== -->
<!-- =================================================================================== --> <!-- =================================================================================== -->
<insert id="saveSndDtlKkoTalk" parameterType="cokr.xit.ens.modules.kkotalk.model.KkotalkDTO$SendDetailKkoTalkDTO"> <insert id="saveSndDtlKkoTalk" parameterType="cokr.xit.ens.modules.kkotalk.model.KkotalkDTO$SendDetailKkoTalkDTO">
/** iup-kkotalk-mapper|saveSndDtlKkoTalk-카카오톡발송상세생성|julim */ /** iup-kkotalk-mapper|saveSndDtlKkoTalk-카카오톡발송상세생성|julim */
INSERT INTO ens_snd_dtl_kko_talk ( INSERT INTO ens_snd_dtl_kko_talk (
send_detail_id, send_detail_id,
title, title,
link, link,
hash, hash,
guide, guide,
payload, payload,
read_expires_at, read_expires_at,
review_expires_at, review_expires_at,
use_non_personalized_noti, use_non_personalized_noti,
ci, ci,
phone_number, phone_number,
name, name,
birthday, birthday,
external_id, external_id,
error_code, error_code,
error_message, error_message,
bill_uid, bill_uid,
send_mast_id, send_mast_id,
regist_dt regist_dt
) VALUES ( ) VALUES (
#{sendDetailId}, select ens_seq_generator.nextval from dual,
#{title}, #{title},
#{link}, #{link},
#{hash}, #{hash},
#{guide}, #{guide},
#{payload}, #{payload},
#{readExpiresAt}, #{readExpiresAt},
#{reviewExpiresAt}, #{reviewExpiresAt},
#{useNonPersonalizedNotification}, #{useNonPersonalizedNotification},
#{ci}, #{ci},
#{phoneNumber}, #{phoneNumber},
#{name}, #{name},
#{birthday}, #{birthday},
#{externalId}, #{externalId},
#{errorCode}, #{errorCode},
#{errorMessage}, #{errorMessage},
#{billUid}, #{billUid},
#{sendMastId}, #{sendMastId},
sysdate sysdate
) )
</insert> </insert>
<select id="findAllBySendMastId" parameterType="string" resultType="cokr.xit.ens.modules.kkotalk.model.KkotalkDTO$SendDetailKkoTalkDTO"> <select id="findAllBySendMastId" parameterType="string" resultType="cokr.xit.ens.modules.kkotalk.model.KkotalkDTO$SendDetailKkoTalkDTO">
/** iup-kkotalk-mapper|findAllBySendMastId-카카오톡발송대상 조회|julim */ /** iup-kkotalk-mapper|findAllBySendMastId-카카오톡발송대상 조회|julim */
SELECT send_detail_id, SELECT send_detail_id,
title, title,
link, link,
hash, hash,
guide, guide,
payload, payload,
read_expires_at, read_expires_at,
review_expires_at, review_expires_at,
use_non_personalized_noti AS useNonPersonalizedNotification, use_non_personalized_noti AS useNonPersonalizedNotification,
ci, ci,
phone_number, phone_number,
name, name,
birthday, birthday,
external_id, external_id,
error_code, error_code,
error_message, error_message,
bill_uid, bill_uid,
send_mast_id, send_mast_id,
regist_dt regist_dt
FROM ens_snd_dtl_kko_talk FROM ens_snd_dtl_kko_talk
WHERE send_mast_id = #{sendMastId} WHERE send_mast_id = #{sendMastId}
</select> </select>
</mapper> </mapper>

Loading…
Cancel
Save