Preloader image
DDD

자바

전자 결재 시스템

작성자 관리자 (admin)
조회수 1,361
입력일 2025-02-23 15:16:07

전자 결재 시스템의 테이블을 설계할 때, 기안(작성), 승인, 대결(대신 결재), 반려(거절), 전결(최종 승인) 등의 상태를 고려해야 합니다. 아래는 주요 테이블의 예시입니다.

1. 결재 문서 테이블 (approval_documents)

전자 결재의 기본 문서 정보를 저장하는 테이블입니다.

컬럼명 데이터 타입 설명
doc_id INT (PK) 문서 고유 ID
title VARCHAR(255) 문서 제목
content TEXT 문서 내용
drafter_id INT (FK) 기안자 (작성자) ID (사용자 테이블 참조)
status ENUM 문서 상태 (기안, 승인, 대결, 반려, 전결)
created_at TIMESTAMP 문서 생성일
updated_at TIMESTAMP 최근 수정일

2. 결재 진행 내역 테이블 (approval_process)

문서가 어떤 결재 단계를 거쳤는지 기록하는 테이블입니다.

컬럼명 데이터 타입 설명
process_id INT (PK) 결재 과정 고유 ID
doc_id INT (FK) 문서 ID (approval_documents 참조)
approver_id INT (FK) 결재자 ID (사용자 테이블 참조)
action ENUM 결재 상태 (승인, 대결, 반려, 전결)
comment TEXT 결재 의견
processed_at TIMESTAMP 결재 처리일

3. 사용자 테이블 (users)

결재에 참여하는 사용자의 정보를 저장하는 테이블입니다.

컬럼명 데이터 타입 설명
user_id INT (PK) 사용자 고유 ID
name VARCHAR(100) 사용자 이름
role ENUM 역할 (기안자, 결재자, 관리자)
department VARCHAR(100) 부서

이러한 테이블을 사용하면 전자 결재 시스템에서 문서의 생성, 결재 과정, 결재자 정보 등을 효율적으로 관리할 수 있습니다.

**** 자바 프로그램 ****

1. VO (Value Object) 클래스

전자 결재 시스템에서 사용할 VO 클래스를 작성합니다.

1.1 ApprovalDocumentVO.java (결재 문서 VO)

import lombok.Data;
import java.util.Date;
import java.util.List;

@Data
public class ApprovalDocumentVO {
    private int docId;         // 문서 고유 ID
    private String title;      // 문서 제목
    private String content;    // 문서 내용
    private int drafterId;     // 기안자 ID
    private String status;     // 문서 상태 (기안, 승인, 대결, 반려, 전결)
    private Date createdAt;    // 생성일
    private Date updatedAt;    // 수정일
}

1.2 ApprovalProcessVO.java (결재 진행 내역 VO)

import lombok.Data;
import java.util.Date;

@Data
public class ApprovalProcessVO {
    private int processId;      // 결재 과정 고유 ID
    private int docId;          // 문서 ID
    private int approverId;     // 결재자 ID
    private String action;      // 결재 상태 (승인, 대결, 반려, 전결)
    private String comment;     // 결재 의견
    private Date processedAt;   // 결재 처리일
}
 

1.3 UserVO.java (사용자 VO)

import lombok.Data;

@Data
public class UserVO {
    private int userId;       // 사용자 ID
    private String name;      // 사용자 이름
    private String role;      // 역할 (기안자, 결재자, 관리자)
    private String department;// 부서
}
 

2. MyBatis Mapper XML

2.1 ApprovalMapper.xml (전자 결재 관련 SQL)

<?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.example.mapper.ApprovalMapper">
    
    <!-- 결재 문서 등록 -->
    <insert id="insertApprovalDocument" parameterType="ApprovalDocumentVO">
        INSERT INTO approval_documents (title, content, drafter_id, status, created_at, updated_at)
        VALUES (#{title}, #{content}, #{drafterId}, '기안', NOW(), NOW());
    </insert>

    <!-- 결재 문서 조회 -->
    <select id="getApprovalDocument" resultType="ApprovalDocumentVO">
        SELECT * FROM approval_documents WHERE doc_id = #{docId};
    </select>

    <!-- 결재 문서 목록 조회 -->
    <select id="getApprovalDocuments" resultType="ApprovalDocumentVO">
        SELECT * FROM approval_documents ORDER BY created_at DESC;
    </select>

    <!-- 결재 처리 -->
    <insert id="insertApprovalProcess" parameterType="ApprovalProcessVO">
        INSERT INTO approval_process (doc_id, approver_id, action, comment, processed_at)
        VALUES (#{docId}, #{approverId}, #{action}, #{comment}, NOW());
    </insert>

    <!-- 문서 상태 변경 -->
    <update id="updateDocumentStatus">
        UPDATE approval_documents SET status = #{status}, updated_at = NOW() WHERE doc_id = #{docId};
    </update>

</mapper>
 

3. Mapper 인터페이스 (ApprovalMapper.java)

import com.example.vo.ApprovalDocumentVO;
import com.example.vo.ApprovalProcessVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface ApprovalMapper {
    
    void insertApprovalDocument(ApprovalDocumentVO document);  // 문서 등록
    ApprovalDocumentVO getApprovalDocument(int docId);         // 문서 조회
    List<ApprovalDocumentVO> getApprovalDocuments();           // 문서 목록 조회
    void insertApprovalProcess(ApprovalProcessVO process);     // 결재 처리 내역 추가
    void updateDocumentStatus(int docId, String status);       // 문서 상태 업데이트
}
 

4. 서비스 클래스 (ApprovalService.java)

import com.example.mapper.ApprovalMapper;
import com.example.vo.ApprovalDocumentVO;
import com.example.vo.ApprovalProcessVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
@RequiredArgsConstructor
public class ApprovalService {
    
    private final ApprovalMapper approvalMapper;

    // 문서 생성
    public void createDocument(ApprovalDocumentVO document) {
        approvalMapper.insertApprovalDocument(document);
    }

    // 문서 조회
    public ApprovalDocumentVO getDocument(int docId) {
        return approvalMapper.getApprovalDocument(docId);
    }

    // 문서 목록 조회
    public List<ApprovalDocumentVO> getDocuments() {
        return approvalMapper.getApprovalDocuments();
    }

    // 결재 처리
    public void processApproval(ApprovalProcessVO process) {
        approvalMapper.insertApprovalProcess(process);
        approvalMapper.updateDocumentStatus(process.getDocId(), process.getAction());
    }
}
 

5. 컨트롤러 (ApprovalController.java)

import com.example.service.ApprovalService;
import com.example.vo.ApprovalDocumentVO;
import com.example.vo.ApprovalProcessVO;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/approval")
@RequiredArgsConstructor
public class ApprovalController {
    
    private final ApprovalService approvalService;

    // 문서 생성 API
    @PostMapping("/create")
    public String createDocument(@RequestBody ApprovalDocumentVO document) {
        approvalService.createDocument(document);
        return "문서가 기안되었습니다.";
    }

    // 문서 조회 API
    @GetMapping("/{docId}")
    public ApprovalDocumentVO getDocument(@PathVariable int docId) {
        return approvalService.getDocument(docId);
    }

    // 문서 목록 조회 API
    @GetMapping("/list")
    public List<ApprovalDocumentVO> getDocuments() {
        return approvalService.getDocuments();
    }

    // 결재 처리 API
    @PostMapping("/process")
    public String processApproval(@RequestBody ApprovalProcessVO process) {
        approvalService.processApproval(process);
        return "결재 처리가 완료되었습니다.";
    }
}