Entity
package kr.go.dfe.tds.domain;
import java.time.LocalDateTime;
/**
* 평가 운영 영속성 모델
* - MyBatis 매핑 전용
* - Getter/Setter만 제공 (비즈니스 로직 없음)
* - 변환 로직은 MapStruct Mapper에서 처리
*
* @author Ayaan
* @version 1.0
* @since 2026-02-25
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ----------- -------------- ----------------------------
* 2026-02-25 Ayaan 최초 생성
*/
public class EvaluationOperationEntity {
private Long id;
private Long evaluationDesignId;
private String commonCode;
private String commonCodeDetail;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String notice;
private boolean isConfirmed;
// 기본 생성자 (MyBatis 필수)
public EvaluationOperationEntity() {
}
// Getter/Setter (MyBatis 매핑용)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getEvaluationDesignId() {
return evaluationDesignId;
}
public void setEvaluationDesignId(Long evaluationDesignId) {
this.evaluationDesignId = evaluationDesignId;
}
public String getCommonCode() {
return commonCode;
}
public void setCommonCode(String commonCode) {
this.commonCode = commonCode;
}
public String getCommonCodeDetail() {
return commonCodeDetail;
}
public void setCommonCodeDetail(String commonCodeDetail) {
this.commonCodeDetail = commonCodeDetail;
}
public LocalDateTime getStartDate() {
return startDate;
}
public void setStartDate(LocalDateTime startDate) {
this.startDate = startDate;
}
public LocalDateTime getEndDate() {
return endDate;
}
public void setEndDate(LocalDateTime endDate) {
this.endDate = endDate;
}
public String getNotice() {
return notice;
}
public void setNotice(String notice) {
this.notice = notice;
}
public boolean isConfirmed() {
return isConfirmed;
}
public void setConfirmed(boolean confirmed) {
isConfirmed = confirmed;
}
}
DTO (Inner Class)
package com.dfe.tds.evaluation_operation.domain.dto;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.List;
/**
* 평가 운영 DTO (Inner Class 패턴)
* - Lombok 미사용, 순수 Java
* - 변환 로직은 MapStruct Mapper에서 처리
*
* @author Ayaan
* @version 1.0
* @since 2026-02-25
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ----------- -------------- ----------------------------
* 2026-02-25 Ayaan 최초 생성
*/
public class EvaluationOperationDto {
private EvaluationOperationDto() {} // 인스턴스화 방지
/**
* 평가 운영 영속성 모델
*/
public static class Entity {
private Long id;
private Long evaluationDesignId;
private String commonCode;
private String commonCodeDetail;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String notice;
private boolean isConfirmed;
// 기본 생성자 (MyBatis 필수)
public Entity() {
}
// Getter/Setter (MyBatis 매핑용)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getEvaluationDesignId() {
return evaluationDesignId;
}
public void setEvaluationDesignId(Long evaluationDesignId) {
this.evaluationDesignId = evaluationDesignId;
}
public String getCommonCode() {
return commonCode;
}
public void setCommonCode(String commonCode) {
this.commonCode = commonCode;
}
public String getCommonCodeDetail() {
return commonCodeDetail;
}
public void setCommonCodeDetail(String commonCodeDetail) {
this.commonCodeDetail = commonCodeDetail;
}
public LocalDateTime getStartDate() {
return startDate;
}
public void setStartDate(LocalDateTime startDate) {
this.startDate = startDate;
}
public LocalDateTime getEndDate() {
return endDate;
}
public void setEndDate(LocalDateTime endDate) {
this.endDate = endDate;
}
public String getNotice() {
return notice;
}
public void setNotice(String notice) {
this.notice = notice;
}
public boolean isConfirmed() {
return isConfirmed;
}
public void setConfirmed(boolean confirmed) {
isConfirmed = confirmed;
}
}
/**
* 목록 조회 요청
*/
public static class ListRequest {
private Long evaluationDesignId;
private String commonCode;
private int page = 1;
private int size = 20;
private String sort = "id,desc";
// Getter/Setter
public Long getEvaluationDesignId() { return evaluationDesignId; }
public void setEvaluationDesignId(Long evaluationDesignId) { this.evaluationDesignId = evaluationDesignId; }
public String getCommonCode() { return commonCode; }
public void setCommonCode(String commonCode) { this.commonCode = commonCode; }
public int getPage() { return page; }
public void setPage(int page) { this.page = page; }
public int getSize() { return size; }
public void setSize(int size) { this.size = size; }
public String getSort() { return sort; }
public void setSort(String sort) { this.sort = sort; }
}
/**
* 생성 요청
*/
public static class CreateRequest {
@NotNull(message = "평가 설계 ID는 필수입니다")
private Long evaluationDesignId;
@Size(max = 255, message = "공통 코드는 255자 이내여야 합니다")
private String commonCode;
@Size(max = 255, message = "공통 코드 상세는 255자 이내여야 합니다")
private String commonCodeDetail;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String notice;
// Getter/Setter
public Long getEvaluationDesignId() { return evaluationDesignId; }
public void setEvaluationDesignId(Long evaluationDesignId) { this.evaluationDesignId = evaluationDesignId; }
public String getCommonCode() { return commonCode; }
public void setCommonCode(String commonCode) { this.commonCode = commonCode; }
public String getCommonCodeDetail() { return commonCodeDetail; }
public void setCommonCodeDetail(String commonCodeDetail) { this.commonCodeDetail = commonCodeDetail; }
public LocalDateTime getStartDate() { return startDate; }
public void setStartDate(LocalDateTime startDate) { this.startDate = startDate; }
public LocalDateTime getEndDate() { return endDate; }
public void setEndDate(LocalDateTime endDate) { this.endDate = endDate; }
public String getNotice() { return notice; }
public void setNotice(String notice) { this.notice = notice; }
}
/**
* 수정 요청
*/
public static class UpdateRequest {
@Size(max = 255, message = "공통 코드는 255자 이내여야 합니다")
private String commonCode;
@Size(max = 255, message = "공통 코드 상세는 255자 이내여야 합니다")
private String commonCodeDetail;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String notice;
// Getter/Setter
public String getCommonCode() { return commonCode; }
public void setCommonCode(String commonCode) { this.commonCode = commonCode; }
public String getCommonCodeDetail() { return commonCodeDetail; }
public void setCommonCodeDetail(String commonCodeDetail) { this.commonCodeDetail = commonCodeDetail; }
public LocalDateTime getStartDate() { return startDate; }
public void setStartDate(LocalDateTime startDate) { this.startDate = startDate; }
public LocalDateTime getEndDate() { return endDate; }
public void setEndDate(LocalDateTime endDate) { this.endDate = endDate; }
public String getNotice() { return notice; }
public void setNotice(String notice) { this.notice = notice; }
}
/**
* 응답 (읽기 전용)
*/
public static class Response {
private final Long id;
private final Long evaluationDesignId;
private final String commonCode;
private final String commonCodeDetail;
private final LocalDateTime startDate;
private final LocalDateTime endDate;
private final String notice;
private final boolean isConfirmed;
public Response(Long id, Long evaluationDesignId, String commonCode, String commonCodeDetail,
LocalDateTime startDate, LocalDateTime endDate, String notice, boolean isConfirmed) {
this.id = id;
this.evaluationDesignId = evaluationDesignId;
this.commonCode = commonCode;
this.commonCodeDetail = commonCodeDetail;
this.startDate = startDate;
this.endDate = endDate;
this.notice = notice;
this.isConfirmed = isConfirmed;
}
// Getter만 제공 (Setter 없음 - 불변 객체)
public Long getId() { return id; }
public Long getEvaluationDesignId() { return evaluationDesignId; }
public String getCommonCode() { return commonCode; }
public String getCommonCodeDetail() { return commonCodeDetail; }
public LocalDateTime getStartDate() { return startDate; }
public LocalDateTime getEndDate() { return endDate; }
public String getNotice() { return notice; }
public boolean isConfirmed() { return isConfirmed; }
}
/**
* 목록 응답 (페이징 정보 포함)
*/
public static class ListResponse {
private final List<Response> evaluationOperations;
private final int totalCount;
private final int totalPages;
private final int currentPage;
public ListResponse(List<Response> evaluationOperations, int totalCount,
int totalPages, int currentPage) {
this.evaluationOperations = evaluationOperations;
this.totalCount = totalCount;
this.totalPages = totalPages;
this.currentPage = currentPage;
}
// Getter만 제공 (Setter 없음 - 불변 객체)
public List<Response> getEvaluationOperations() { return evaluationOperations; }
public int getTotalCount() { return totalCount; }
public int getTotalPages() { return totalPages; }
public int getCurrentPage() { return currentPage; }
}
}
Map Struct
package com.dfe.tds.evaluation_operation.domain;
import com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto;
import org.mapstruct.Mapper;
/**
* 평가 운영 매퍼 (MapStruct)
* - Entity ↔ Domain ↔ DTO 변환 담당
*
* @author Ayaan
* @version 1.0
* @since 2026-02-25
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ----------- -------------- ----------------------------
* 2026-02-25 Ayaan 생성자 접근 제어자 이슈로 인한 default 메소드 수동 매핑 적용
*/
@Mapper(componentModel = "spring")
public interface EvaluationOperationMapStruct {
/**
* Entity → Domain 변환
* (수동 매핑: 도메인 객체의 Setter가 없고 생성자가 Private이기 때문에 정적 팩토리 메소드 사용)
*/
default EvaluationOperation entityToDomain(EvaluationOperationDto.Entity entity) {
if (entity == null) {
return null;
}
return EvaluationOperation.reconstitute(
entity.getId(),
entity.getEvaluationDesignId(),
entity.getCommonCode(),
entity.getCommonCodeDetail(),
entity.getStartDate(),
entity.getEndDate(),
entity.getNotice(),
entity.isConfirmed()
);
}
/**
* Domain → Entity 변환
* (자동 매핑: Entity 객체는 기본 생성자와 Setter가 존재하므로 MapStruct가 자동 생성)
*/
EvaluationOperationDto.Entity domainToEntity(EvaluationOperation domain);
/**
* DTO(CreateRequest) → Domain 변환
* (수동 매핑: 클라이언트 요청 정보를 기반으로 신규 도메인 객체 생성)
*/
default EvaluationOperation createRequestToDomain(EvaluationOperationDto.CreateRequest request) {
if (request == null) {
return null;
}
return EvaluationOperation.create(
request.getEvaluationDesignId(),
request.getCommonCode(),
request.getCommonCodeDetail(),
request.getStartDate(),
request.getEndDate(),
request.getNotice()
);
}
/**
* Domain → DTO(Response) 변환
* (자동 매핑: Response 객체의 모든 필드를 받는 생성자를 통해 MapStruct가 자동 매핑 지원)
*/
EvaluationOperationDto.Response domainToResponse(EvaluationOperation domain);
}
DAO
package com.dfe.tds.evaluation_operation.dao;
import com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto;
import org.egovframe.rte.psl.dataaccess.EgovAbstractMapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 평가 운영 DAO
* - 전자정부 프레임워크 표준(EgovAbstractMapper) 적용
* - MyBatis XML 매퍼와 연결
*
* @author Ayaan
* @version 1.0
* @since 2026-02-25
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ----------- -------------- ----------------------------
* 2026-02-25 Ayaan 최초 생성
*/
@Repository("evaluationOperationDao")
public class EvaluationOperationDao extends EgovAbstractMapper {
/**
* 평가 운영 단건 조회
*
* @param id 평가 운영 ID
* @return EvaluationOperationEntity 평가 운영 영속성 모델
*/
public EvaluationOperationDto.Entity selectEvaluationOperation(Long id) {
return selectOne("evaluationOperationMapper.selectEvaluationOperation", id);
}
/**
* 평가 운영 목록 조회 (페이징 적용)
*
* @param request 목록 조회 요청 DTO (검색 조건 및 페이징 정보 포함)
* @return List<EvaluationOperationEntity> 평가 운영 영속성 모델 목록
*/
public List<EvaluationOperationDto.Entity> selectEvaluationOperationList(EvaluationOperationDto.ListRequest request) {
return selectList("evaluationOperationMapper.selectEvaluationOperationList", request);
}
/**
* 평가 운영 목록 총 건수 조회
*
* @param request 목록 조회 요청 DTO (검색 조건 포함)
* @return int 총 건수
*/
public int selectEvaluationOperationListTotCnt(EvaluationOperationDto.ListRequest request) {
return selectOne("evaluationOperationMapper.selectEvaluationOperationListTotCnt", request);
}
/**
* 평가 운영 등록
*
* @param entity 평가 운영 영속성 모델
* @return int 등록된 건수
*/
public int insertEvaluationOperation(EvaluationOperationDto.Entity entity) {
return insert("evaluationOperationMapper.insertEvaluationOperation", entity);
}
/**
* 평가 운영 수정
*
* @param entity 평가 운영 영속성 모델
* @return int 수정된 건수
*/
public int updateEvaluationOperation(EvaluationOperationDto.Entity entity) {
return update("evaluationOperationMapper.updateEvaluationOperation", entity);
}
/**
* 평가 운영 삭제
*
* @param id 평가 운영 ID
* @return int 삭제된 건수
*/
public int deleteEvaluationOperation(Long id) {
return delete("evaluationOperationMapper.deleteEvaluationOperation", id);
}
}
XML Mapper
<?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">
<!--
* @description 평가_운영 MyBatis XML Mapper
* @author Ayaan
* @version 1.0
* @since 2026-02-25
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* 2026-02-25 Ayaan 최초 생성
-->
<mapper namespace="evaluationOperationMapper">
<!-- ResultMap 정의 -->
<resultMap id="evaluationOperationResult" type="com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto$Entity">
<id property="id" column="evaluation_operation_id"/>
<result property="evaluationDesignId" column="evaluation_design_id"/>
<result property="commonCode" column="common_code"/>
<result property="commonCodeDetail" column="common_code_detail"/>
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
<result property="notice" column="notice"/>
<result property="isConfirmed" column="is_confirmed"/>
</resultMap>
<!-- 공통 검색 조건 (Where 절) -->
<sql id="evaluationOperationWhere">
<where>
<if test="evaluationDesignId != null">
AND evaluation_design_id = #{evaluationDesignId}
</if>
<if test="commonCode != null and commonCode != ''">
AND common_code = #{commonCode}
</if>
</where>
</sql>
<!-- 단건 조회 -->
<select id="selectEvaluationOperation" resultMap="evaluationOperationResult">
SELECT
evaluation_operation_id,
evaluation_design_id,
common_code,
common_code_detail,
start_date,
end_date,
notice,
is_confirmed
FROM evaluation_operation
WHERE evaluation_operation_id = #{id}
</select>
<!-- 다건 목록 조회 (페이징 적용) -->
<select id="selectEvaluationOperationList" parameterType="com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto$ListRequest" resultMap="evaluationOperationResult">
<!-- MyBatis에서 제공하는 bind를 사용하여 offset 계산 (page - 1) * size -->
<bind name="offset" value="page > 0 ? (page - 1) * size : 0"/>
SELECT
evaluation_operation_id,
evaluation_design_id,
common_code,
common_code_detail,
start_date,
end_date,
notice,
is_confirmed
FROM evaluation_operation
<include refid="evaluationOperationWhere"/>
ORDER BY evaluation_operation_id DESC
LIMIT #{size} OFFSET #{offset}
</select>
<!-- 목록 총 건수 조회 -->
<select id="selectEvaluationOperationListTotCnt" parameterType="com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto$ListRequest" resultType="int">
SELECT COUNT(evaluation_operation_id)
FROM evaluation_operation
<include refid="evaluationOperationWhere"/>
</select>
<!-- 등록 (PK useGeneratedKeys 적용) -->
<insert id="insertEvaluationOperation" parameterType="com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto$Entity" useGeneratedKeys="true" keyProperty="id" keyColumn="evaluation_operation_id">
INSERT INTO evaluation_operation (
evaluation_design_id,
common_code,
common_code_detail,
start_date,
end_date,
notice,
is_confirmed
) VALUES (
#{evaluationDesignId},
#{commonCode},
#{commonCodeDetail},
#{startDate},
#{endDate},
#{notice},
#{isConfirmed}
)
</insert>
<!-- 수정 -->
<update id="updateEvaluationOperation" parameterType="com.dfe.tds.evaluation_operation.domain.dto.EvaluationOperationDto$Entity">
UPDATE evaluation_operation
SET evaluation_design_id = #{evaluationDesignId},
common_code = #{commonCode},
common_code_detail = #{commonCodeDetail},
start_date = #{startDate},
end_date = #{endDate},
notice = #{notice},
is_confirmed = #{isConfirmed}
WHERE evaluation_operation_id = #{id}
</update>
<!-- 삭제 -->
<delete id="deleteEvaluationOperation" parameterType="long">
DELETE FROM evaluation_operation
WHERE evaluation_operation_id = #{id}
</delete>
</mapper>