diff --git a/src/main/java/cokr/xit/fims/mngt/Ntc.java b/src/main/java/cokr/xit/fims/mngt/Ntc.java
new file mode 100644
index 00000000..c64d23fd
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/Ntc.java
@@ -0,0 +1,43 @@
+package cokr.xit.fims.mngt;
+
+import cokr.xit.foundation.AbstractEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/** 공지사항
+ * @author leebj
+ */
+@Getter
+@Setter
+public class Ntc extends AbstractEntity {
+
+ /**
+ * 공지 ID
+ */
+ private String ntcId;
+
+ /**
+ * 공지 제목
+ */
+ private String ntcTtl;
+
+ /**
+ * 공지 내용
+ */
+ private String ntcCn;
+
+ /**
+ * 삭제 여부
+ */
+ private String delYn;
+
+ /**
+ * 삭제 사유
+ */
+ private String delRsn;
+
+ /**
+ * 시군구 코드
+ */
+ private String sggCd;
+}
diff --git a/src/main/java/cokr/xit/fims/mngt/NtcQuery.java b/src/main/java/cokr/xit/fims/mngt/NtcQuery.java
new file mode 100644
index 00000000..14dc1d43
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/NtcQuery.java
@@ -0,0 +1,19 @@
+package cokr.xit.fims.mngt;
+
+import cokr.xit.fims.cmmn.CmmnQuery;
+
+/**공지사항 정보 조회 요청
+*
+*
상세 설명:
+*
+*
+* ============ 변경 이력 ============
+* 2024-01-02 leebj 최초 작성
+* ================================
+*
+*/
+public class NtcQuery extends CmmnQuery {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/cokr/xit/fims/mngt/dao/NtcMapper.java b/src/main/java/cokr/xit/fims/mngt/dao/NtcMapper.java
new file mode 100644
index 00000000..ba3ec45d
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/dao/NtcMapper.java
@@ -0,0 +1,91 @@
+package cokr.xit.fims.mngt.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import cokr.xit.fims.mngt.Ntc;
+import cokr.xit.fims.mngt.NtcQuery;
+import cokr.xit.foundation.component.AbstractMapper;
+import cokr.xit.foundation.data.DataObject;
+
+/**공지사항 DAO
+ * @author leebj
+ */
+@Mapper("ntcMapper")
+public interface NtcMapper extends AbstractMapper {
+
+ /**지정한 조건에 따라 공지사항 목록을 조회하여 반환한다.
+ * @param req 공지사항 조회 조건
+ * @return 공지사항 목록
+ */
+ List selectNtcList(NtcQuery req);
+
+ /**지정한 공지사항ID로 공지사항 객체를 반환한다.
+ * @param ntcId 공지사항 ID
+ * @return 공지사항 객체
+ */
+ DataObject selectNtcInfo(String ntcId);
+
+ /**공지사항 정보를 등록한다.
+ * @param params 파라미터
+ * - "ntc" - 공지사항
+ * - "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int insertNtc(Map params);
+
+ /**공지사항 정보를 등록한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ default boolean insert(Ntc ntc) {
+ return ntc != null && insertNtc(params().set("ntc", ntc)) == 1;
+ }
+
+ /**공지사항 정보를 수정한다.
+ * @param params 파라미터
+ * - "ntc" - 공지사항
+ * - "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int updateNtc(Map params);
+
+ /**공지사항 정보를 수정한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ default boolean update(Ntc ntc) {
+ return ntc != null && updateNtc(params().set("ntc", ntc)) == 1;
+ }
+
+ /**지정한 공지사항을 삭제한다.
+ * @param params 파라미터
+ * - "ntc" - 공지사항
+ * - "currentUser" - 현재 접속한 사용자
+ *
+ * @return 저장된 정보수
+ */
+ int deleteNtc(Map params);
+
+ /**공지사항 정보를 삭제한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ default boolean delete(Ntc ntc) {
+ return ntc != null && deleteNtc(params().set("ntc", ntc)) == 1;
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/mngt/service/NtcService.java b/src/main/java/cokr/xit/fims/mngt/service/NtcService.java
new file mode 100644
index 00000000..9213ebf6
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/service/NtcService.java
@@ -0,0 +1,50 @@
+package cokr.xit.fims.mngt.service;
+
+import java.util.List;
+
+import cokr.xit.fims.mngt.Ntc;
+import cokr.xit.fims.mngt.NtcQuery;
+import cokr.xit.foundation.data.DataObject;
+
+public interface NtcService {
+
+ /**지정한 조건에 따라 공지사항 목록을 조회하여 반환한다.
+ * @param req 공지사항 조회 조건
+ * @return 공지사항 목록
+ */
+ List getNtcList(NtcQuery req);
+
+ /**지정한 공지사항ID로 공지사항 객체를 반환한다.
+ * @param ntcId 공지사항 ID
+ * @return 공지사항 객체
+ */
+ DataObject getNtcInfo(String ntcId);
+
+ /**공지사항 정보를 등록한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ String create(Ntc ntc);
+
+ /**공지사항 정보를 수정한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ String update(Ntc ntc);
+
+ /**공지사항 정보를 삭제한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ String remove(Ntc ntc);
+
+}
diff --git a/src/main/java/cokr/xit/fims/mngt/service/bean/NtcBean.java b/src/main/java/cokr/xit/fims/mngt/service/bean/NtcBean.java
new file mode 100644
index 00000000..1173184d
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/service/bean/NtcBean.java
@@ -0,0 +1,73 @@
+package cokr.xit.fims.mngt.service.bean;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Component;
+
+import cokr.xit.fims.mngt.Ntc;
+import cokr.xit.fims.mngt.NtcQuery;
+import cokr.xit.fims.mngt.dao.NtcMapper;
+import cokr.xit.foundation.component.AbstractBean;
+import cokr.xit.foundation.data.DataObject;
+
+/** 공지사항 Bean
+ * @author leebj
+ */
+@Component("ntcBean")
+public class NtcBean extends AbstractBean {
+
+ @Resource(name="ntcMapper")
+ private NtcMapper ntcMapper;
+
+ /**지정한 조건에 따라 공지사항 목록을 조회하여 반환한다.
+ * @param req 공지사항 조회 조건
+ * @return 공지사항 목록
+ */
+ public List getNtcList(NtcQuery req) {
+ return ntcMapper.selectNtcList(req);
+ }
+
+ /**지정한 공지사항ID로 공지사항 객체를 반환한다.
+ * @param ntcId 공지사항 ID
+ * @return 공지사항 객체
+ */
+ public DataObject getNtcInfo(String ntcId) {
+ return ntcMapper.selectNtcInfo(ntcId);
+ }
+
+ /**공지사항 정보를 등록한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ public boolean create(Ntc ntc) {
+ return ntcMapper.insert(ntc);
+ }
+
+ /**공지사항 정보를 수정한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ public boolean update(Ntc ntc) {
+ return ntcMapper.update(ntc);
+ }
+
+ /**공지사항 정보를 삭제한다.
+ * @param ntc 공지사항
+ * @return 저장 여부
+ * - 저장됐으면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ public boolean remove(Ntc ntc) {
+ return ntcMapper.delete(ntc);
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/mngt/service/bean/NtcServiceBean.java b/src/main/java/cokr/xit/fims/mngt/service/bean/NtcServiceBean.java
new file mode 100644
index 00000000..58df5e09
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/service/bean/NtcServiceBean.java
@@ -0,0 +1,46 @@
+package cokr.xit.fims.mngt.service.bean;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+
+import cokr.xit.fims.mngt.Ntc;
+import cokr.xit.fims.mngt.NtcQuery;
+import cokr.xit.fims.mngt.service.NtcService;
+import cokr.xit.foundation.component.AbstractServiceBean;
+import cokr.xit.foundation.data.DataObject;
+
+@Service("ntcService")
+public class NtcServiceBean extends AbstractServiceBean implements NtcService {
+
+ @Resource(name="ntcBean")
+ private NtcBean ntcBean;
+
+ @Override
+ public List getNtcList(NtcQuery req) {
+ return ntcBean.getNtcList(req);
+ }
+
+ @Override
+ public DataObject getNtcInfo(String ntcId) {
+ return ntcBean.getNtcInfo(ntcId);
+ }
+
+ @Override
+ public String create(Ntc ntc) {
+ return ntcBean.create(ntc) ? "[S]" : "[F]";
+ }
+
+ @Override
+ public String update(Ntc ntc) {
+ return ntcBean.update(ntc) ? "[S]" : "[F]";
+ }
+
+ @Override
+ public String remove(Ntc ntc) {
+ return ntcBean.remove(ntc) ? "[S]" : "[F]";
+ }
+
+}
diff --git a/src/main/java/cokr/xit/fims/mngt/web/Mngt01Controller.java b/src/main/java/cokr/xit/fims/mngt/web/Mngt01Controller.java
new file mode 100644
index 00000000..e0efd851
--- /dev/null
+++ b/src/main/java/cokr/xit/fims/mngt/web/Mngt01Controller.java
@@ -0,0 +1,171 @@
+package cokr.xit.fims.mngt.web;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import cokr.xit.base.user.SigunguQuery;
+import cokr.xit.base.user.service.SigunguDepartmentService;
+import cokr.xit.base.web.ApplicationController;
+import cokr.xit.fims.base.FimsUser;
+import cokr.xit.fims.mngt.Ntc;
+import cokr.xit.fims.mngt.NtcQuery;
+import cokr.xit.fims.mngt.service.NtcService;
+import cokr.xit.foundation.data.DataObject;
+
+/**공지사항 서비스 웹 컨트롤러.
+ * {웹 컨텍스트}/mngt/mngt01 로 접근할 수 있다.
+ * @author leebj
+ */
+@Controller
+@RequestMapping(name="공지사항 관리", value=Mngt01Controller.CLASS_URL)
+public class Mngt01Controller extends ApplicationController {
+
+ public static final String CLASS_URL = "/mngt/mngt01";
+
+ public class METHOD_URL {
+ public static final String
+ ntcMain = "/010/main.do",
+ getNtcList = "/010/list.do",
+ getNtcInfo = "/020/info.do",
+ create = "/020/create.do",
+ update = "/020/update.do",
+ remove = "/020/remove.do"
+ ;
+ }
+
+ @Resource(name="ntcService")
+ private NtcService ntcService;
+
+ @Resource(name="sigunguDepartmentService")
+ private SigunguDepartmentService sggDeptService;
+
+
+ /** 공지사항 메인화면을 연다.
+ * @return fims/mngt/mngt01010-main
+ */
+ @RequestMapping(name="공지사항 메인", value=METHOD_URL.ntcMain)
+ public ModelAndView ntcMain() {
+ ModelAndView mav = new ModelAndView();
+ mav.setViewName("fims/mngt/mngt01010-main");
+ mav.addObject("pageName", "mngt01010");
+
+ return mav;
+ }
+
+ /**공지사항 목록을 조회하여 반환한다.
+ * {@link NtcService#getNtcList(NtcQuery)} 참고
+ * @param req 공지사항 조회 조건
+ * @return jsonView
+ * {
+ * "ntcList": [공지사항 목록]
+ * "ntcStart": 공지사항 목록 시작 인덱스
+ * "ntcFetch": 한 번에 가져오는 공지사항 목록 수
+ * "ntcTotal": 조회 결과 찾은 전체 공지사항 수
+ * }
+ */
+ @RequestMapping(name="공지사항 목록 조회", value=METHOD_URL.getNtcList)
+ public ModelAndView getNtcList(NtcQuery req) {
+ ModelAndView mav = new ModelAndView("jsonView");
+ setFetchSize(req);
+
+ FimsUser currentUser = (FimsUser) currentUser().getUser();
+ String sggCd = currentUser.getOrgID();
+ req.setSggCd(sggCd);
+ List list = ntcService.getNtcList(req);
+ return setPagingInfo(mav, list, "");
+ }
+
+ /**공지사항 상세 내용을 조회하여 반환한다.
+ * {@link NtcService#getNtcInfo(NtcQuery)} 참고
+ * @param ntcId 공지사항 ID
+ * @return jsonView
+ */
+ @RequestMapping(name="공지사항 상세 조회", value=METHOD_URL.getNtcInfo)
+ public ModelAndView getNtcInfo(String ntcId) {
+ boolean json = jsonResponse();
+ ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/mngt/mngt01020-info");
+ mav.addObject("pageName", "mngt01020");
+ DataObject info = new DataObject();
+ if(!ifEmpty(ntcId, ()->"").equals("")) {
+ info = ntcService.getNtcInfo(ntcId);
+ } else {
+ info = null;
+ }
+ mav.addObject("ntcInfo", json ? info : toJson(info));
+
+ List allSggList = sggDeptService.getSigunguList(new SigunguQuery());
+ mav.addObject("sggList", allSggList);
+
+ return mav;
+ }
+
+ /**공지사항를 등록한다.
+ * @param ntc 공지사항 정보
+ * @return jsonView
+ * {
+ * "saved": 등록되었으면 true, 그렇지 않으면 false
+ * }
+ */
+ @RequestMapping(name="공지사항 등록", value=METHOD_URL.create)
+ public ModelAndView create(Ntc ntc) {
+ ModelAndView mav = new ModelAndView("jsonView");
+ boolean saved = false;
+
+ String rtnMsg = ntcService.create(ntc);
+
+ if(rtnMsg.contains("[S]")) {
+ saved = true;
+ }
+ mav.addObject("saved", saved);
+ return mav;
+ }
+
+ /**공지사항 정보를 수정한다.
+ * @param ntc 공지사항 정보
+ * @return jsonView
+ * {
+ * "saved": 수정되었으면 true, 그렇지 않으면 false
+ * }
+ */
+ @RequestMapping(name="공지사항 수정", value=METHOD_URL.update)
+ public ModelAndView update(Ntc ntc) {
+ ModelAndView mav = new ModelAndView("jsonView");
+ boolean saved = false;
+
+ String rtnMsg = ntcService.update(ntc);
+
+ if(rtnMsg.contains("[S]")) {
+ saved = true;
+ }
+ mav.addObject("saved", saved);
+ return mav;
+ }
+
+ /**지정한 공지사항를 제거한다.
+ * @param ntcIDs 공지사항 아이디
+ * @return jsonView
+ * {
+ * "affected": 저장된 정보수
+ * "saved": 저장되었으면 true, 그렇지 않으면 false
+ * }
+ */
+ @RequestMapping(name="공지사항 삭제", value=METHOD_URL.remove)
+ public ModelAndView remove(Ntc ntc) {
+ ModelAndView mav = new ModelAndView("jsonView");
+ boolean saved = false;
+
+ String rtnMsg = ntcService.remove(ntc);
+
+ if(rtnMsg.contains("[S]")) {
+ saved = true;
+ }
+ mav.addObject("saved", saved);
+ return mav;
+
+ }
+}
diff --git a/src/main/resources/sql/mapper/fims/mngt/ntc-mapper.xml b/src/main/resources/sql/mapper/fims/mngt/ntc-mapper.xml
new file mode 100644
index 00000000..ce73ad87
--- /dev/null
+++ b/src/main/resources/sql/mapper/fims/mngt/ntc-mapper.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SELECT A.NTC_ID
+ , A.SGG_CD
+ , (CASE
+ WHEN (SELECT SGG_NM FROM TB_SGG WHERE SGG_CD = A.SGG_CD) IS NOT NULL
+ THEN (SELECT SGG_NM FROM TB_SGG WHERE SGG_CD = A.SGG_CD)
+ ELSE '전체' END) AS SGG_NM
+ , A.NTC_TTL
+ , A.NTC_CN
+ , A.DEL_YN
+ , A.REG_DT
+ , A.RGTR
+ , A.MDFCN_DT
+ , A.MDFR
+ , A.DEL_DT
+ , A.DLTR
+ , A.DEL_RSN
+ FROM TB_NOTICE A
+
+
+
+
+
+
+
+/* 공지사항 등록(ntcMapper.insertNtc) */
+
+
+
+
+
+
+
+INSERT
+ INTO TB_NOTICE (
+ NTC_ID
+ , SGG_CD
+ , NTC_TTL
+ , NTC_CN
+ , DEL_YN
+ , REG_DT
+ , RGTR
+ , MDFCN_DT
+ , MDFR
+) VALUES (
+ #{ntc.ntcId}
+ , #{ntc.sggCd}
+ , #{ntc.ntcTtl}
+ , #{ntc.ntcCn}
+ , 'N'
+ ,
+ , #{currentUser.id}
+ ,
+ , #{currentUser.id}
+)
+
+
+
+/* 공지사항 수정(ntcMapper.updateNtc) */
+UPDATE TB_NOTICE
+ SET NTC_TTL = #{ntc.ntcTtl}
+ , NTC_CN = #{ntc.ntcCn}
+ , MDFCN_DT =
+ , MDFR = #{currentUser.id}
+ WHERE NTC_ID = #{ntc.ntcId}
+
+
+
+/* 공지사항 삭제(ntcMapper.deleteNtc) */
+UPDATE TB_NOTICE
+ SET DEL_YN = 'Y'
+ , DEL_DT =
+ , DLTR = #{currentUser.id}
+ WHERE NTC_ID = #{ntc.ntcId}
+
+
+
\ No newline at end of file