feat(core): AgentOrgHistoryResp + MapStruct mapper 3종 추가 (리뷰 5a)

코드 품질 5단계 ga-core 준비물. ga-api 적용은 5b에서 진행.

AgentOrgHistoryResp 추가:
- AgentOrgHistoryVO 직접 노출 문제 해소 (감사 필드 누설 + FK ID만 노출)
- 표시용 조인 필드 포함: agentName, from/toOrgName, from/toGradeName,
  changeTypeName (CHANGE_TYPE 코드그룹 스칼라 서브쿼리)
- AgentMapper.selectHistoryResp + AgentMapper.xml 조인 쿼리 추가

MapStruct mapper 3종 (com.ga.core.mapstruct):
- ContractMapStruct (ContractSaveReq → ContractVO + update 패턴)
- ExceptionLedgerMapStruct (ExceptionLedgerSaveReq → ExceptionLedgerVO)
- UserMapStruct (UserSaveReq → UserVO)
- @Mapper(componentModel="spring"), 감사 필드 ignore
This commit is contained in:
GA Pro
2026-05-12 23:42:58 +09:00
parent 498d0d44f0
commit 4b211ecdfe
6 changed files with 161 additions and 0 deletions
@@ -1,6 +1,7 @@
package com.ga.core.mapper.org; package com.ga.core.mapper.org;
import com.ga.core.vo.org.AgentExcelVO; import com.ga.core.vo.org.AgentExcelVO;
import com.ga.core.vo.org.AgentOrgHistoryResp;
import com.ga.core.vo.org.AgentOrgHistoryVO; import com.ga.core.vo.org.AgentOrgHistoryVO;
import com.ga.core.vo.org.AgentResp; import com.ga.core.vo.org.AgentResp;
import com.ga.core.vo.org.AgentSearchParam; import com.ga.core.vo.org.AgentSearchParam;
@@ -28,5 +29,6 @@ public interface AgentMapper {
/** 이력 */ /** 이력 */
List<AgentOrgHistoryVO> selectHistory(@Param("agentId") Long agentId); List<AgentOrgHistoryVO> selectHistory(@Param("agentId") Long agentId);
List<AgentOrgHistoryResp> selectHistoryResp(@Param("agentId") Long agentId);
int insertHistory(AgentOrgHistoryVO vo); int insertHistory(AgentOrgHistoryVO vo);
} }
@@ -0,0 +1,27 @@
package com.ga.core.mapstruct;
import com.ga.core.vo.product.ContractSaveReq;
import com.ga.core.vo.product.ContractVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@Mapper(componentModel = "spring")
public interface ContractMapStruct {
@Mapping(target = "contractId", ignore = true)
@Mapping(target = "status", ignore = true)
@Mapping(target = "lapseDate", ignore = true)
@Mapping(target = "revivalDate", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
ContractVO toVO(ContractSaveReq req);
@Mapping(target = "contractId", ignore = true)
@Mapping(target = "status", ignore = true)
@Mapping(target = "lapseDate", ignore = true)
@Mapping(target = "revivalDate", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
void updateVO(ContractSaveReq req, @MappingTarget ContractVO vo);
}
@@ -0,0 +1,24 @@
package com.ga.core.mapstruct;
import com.ga.core.vo.ledger.ExceptionLedgerSaveReq;
import com.ga.core.vo.ledger.ExceptionLedgerVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring")
public interface ExceptionLedgerMapStruct {
@Mapping(target = "ledgerId", ignore = true)
@Mapping(target = "contractId", ignore = true)
@Mapping(target = "commissionYear", ignore = true)
@Mapping(target = "taxAmount", ignore = true)
@Mapping(target = "approveStatus", ignore = true)
@Mapping(target = "approverId", ignore = true)
@Mapping(target = "approveDate", ignore = true)
@Mapping(target = "recurringLeft", ignore = true)
@Mapping(target = "status", ignore = true)
@Mapping(target = "version", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
ExceptionLedgerVO toVO(ExceptionLedgerSaveReq req);
}
@@ -0,0 +1,34 @@
package com.ga.core.mapstruct;
import com.ga.core.vo.user.UserSaveReq;
import com.ga.core.vo.user.UserVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@Mapper(componentModel = "spring")
public interface UserMapStruct {
@Mapping(target = "userId", ignore = true)
@Mapping(target = "password", ignore = true)
@Mapping(target = "failCount", ignore = true)
@Mapping(target = "lastLoginAt", ignore = true)
@Mapping(target = "pwdChangedAt", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "updatedBy", ignore = true)
UserVO toVO(UserSaveReq req);
@Mapping(target = "userId", ignore = true)
@Mapping(target = "loginId", ignore = true)
@Mapping(target = "password", ignore = true)
@Mapping(target = "failCount", ignore = true)
@Mapping(target = "lastLoginAt", ignore = true)
@Mapping(target = "pwdChangedAt", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "updatedBy", ignore = true)
void updateVO(UserSaveReq req, @MappingTarget UserVO vo);
}
@@ -0,0 +1,27 @@
package com.ga.core.vo.org;
import lombok.Data;
import java.time.LocalDate;
@Data
public class AgentOrgHistoryResp {
private Long historyId;
private Long agentId;
private String agentName;
private Long fromOrgId;
private String fromOrgName;
private Long toOrgId;
private String toOrgName;
private Long fromGradeId;
private String fromGradeName;
private Long toGradeId;
private String toGradeName;
private String changeType; // TRANSFER / PROMOTE / DEMOTE / JOIN / LEAVE
private String changeTypeName;
private LocalDate changeDate;
private String changeReason;
}
@@ -143,10 +143,57 @@
WHERE agent_id = #{agentId} WHERE agent_id = #{agentId}
</update> </update>
<resultMap id="AgentOrgHistoryRespMap" type="com.ga.core.vo.org.AgentOrgHistoryResp">
<id property="historyId" column="history_id"/>
<result property="agentId" column="agent_id"/>
<result property="agentName" column="agent_name"/>
<result property="fromOrgId" column="from_org_id"/>
<result property="fromOrgName" column="from_org_name"/>
<result property="toOrgId" column="to_org_id"/>
<result property="toOrgName" column="to_org_name"/>
<result property="fromGradeId" column="from_grade_id"/>
<result property="fromGradeName" column="from_grade_name"/>
<result property="toGradeId" column="to_grade_id"/>
<result property="toGradeName" column="to_grade_name"/>
<result property="changeType" column="change_type"/>
<result property="changeTypeName" column="change_type_name"/>
<result property="changeDate" column="change_date"/>
<result property="changeReason" column="change_reason"/>
</resultMap>
<select id="selectHistory" resultMap="AgentHistoryMap"> <select id="selectHistory" resultMap="AgentHistoryMap">
SELECT * FROM agent_org_history WHERE agent_id = #{agentId} ORDER BY change_date DESC, history_id DESC SELECT * FROM agent_org_history WHERE agent_id = #{agentId} ORDER BY change_date DESC, history_id DESC
</select> </select>
<!-- 이력 조회 — 조인으로 이름 필드 포함 (AgentOrgHistoryResp 매핑) -->
<select id="selectHistoryResp" resultMap="AgentOrgHistoryRespMap">
SELECT
h.history_id,
h.agent_id,
a.agent_name,
h.from_org_id,
fo.org_name AS from_org_name,
h.to_org_id,
to_.org_name AS to_org_name,
h.from_grade_id,
fg.grade_name AS from_grade_name,
h.to_grade_id,
tg.grade_name AS to_grade_name,
h.change_type,
(SELECT cc.code_name FROM common_code cc
WHERE cc.group_code = 'CHANGE_TYPE' AND cc.code = h.change_type) AS change_type_name,
h.change_date,
h.change_reason
FROM agent_org_history h
LEFT JOIN agent a ON a.agent_id = h.agent_id
LEFT JOIN organization fo ON fo.org_id = h.from_org_id
LEFT JOIN organization to_ ON to_.org_id = h.to_org_id
LEFT JOIN grade fg ON fg.grade_id = h.from_grade_id
LEFT JOIN grade tg ON tg.grade_id = h.to_grade_id
WHERE h.agent_id = #{agentId}
ORDER BY h.change_date DESC, h.history_id DESC
</select>
<insert id="insertHistory" parameterType="com.ga.core.vo.org.AgentOrgHistoryVO" useGeneratedKeys="true" keyProperty="historyId"> <insert id="insertHistory" parameterType="com.ga.core.vo.org.AgentOrgHistoryVO" useGeneratedKeys="true" keyProperty="historyId">
INSERT INTO agent_org_history (agent_id, from_org_id, to_org_id, from_grade_id, to_grade_id, INSERT INTO agent_org_history (agent_id, from_org_id, to_org_id, from_grade_id, to_grade_id,
change_type, change_date, change_reason, created_at, created_by) change_type, change_date, change_reason, created_at, created_by)