From e34595f7841c882a8e9ab4dfeb2ee2726668b6e2 Mon Sep 17 00:00:00 2001 From: KNKIM Date: Tue, 20 Jul 2021 22:11:30 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AC=BB=EA=B3=A0=EB=8B=B5=ED=95=98=EA=B8=B0,?= =?UTF-8?q?=20XML=EB=B3=80=ED=99=98=20=EA=B0=9C=EB=B0=9C=20(=EC=A4=91?= =?UTF-8?q?=EA=B0=84=EB=B0=B1=EC=97=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uac.service.board.qna.list_GET.xml | 94 +++++++++++++++++++ .../java/nlib/bbs/service/BoardService.java | 28 ++++++ .../java/nlib/bbs/service/impl/BoardDAO.java | 16 +++- .../bbs/service/impl/BoardServiceImpl.java | 8 +- .../java/nlib/bbs/web/BoardController.java | 68 ++++++++++++-- .../java/nlib/cmm/NlibCommonController.java | 64 +++++++++++++ .../restful/service/DataApiInterface.java | 7 +- .../nlib/restful/service/XmlConverter.java | 79 ++++++++++++++++ .../egovframework/spring/context-common.xml | 4 +- .../spring/context-validator.xml | 8 +- src/main/resources/log4j2.xml | 2 +- .../WEB-INF/jsp/nlib/board/listQnAs.jsp | 62 ++++++++++-- target/classes/log4j2.xml | 2 +- .../web-resources/META-INF/MANIFEST.MF | 10 +- 14 files changed, 420 insertions(+), 32 deletions(-) create mode 100644 data/dataxml/uac.service.board.qna.list_GET.xml create mode 100644 src/main/java/nlib/cmm/NlibCommonController.java create mode 100644 src/main/java/nlib/restful/service/XmlConverter.java diff --git a/data/dataxml/uac.service.board.qna.list_GET.xml b/data/dataxml/uac.service.board.qna.list_GET.xml new file mode 100644 index 00000000..e2289653 --- /dev/null +++ b/data/dataxml/uac.service.board.qna.list_GET.xml @@ -0,0 +1,94 @@ + + + + S + 성공적으로 조회되었습니다. + 10 + 1 + 15 + + 1 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 2 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 3 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 4 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 5 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 6 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 7 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 8 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 9 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 10 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 11 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + 12 + 101 + 공지사항 테스트 + 55 + 2021-07-19 + + + diff --git a/src/main/java/nlib/bbs/service/BoardService.java b/src/main/java/nlib/bbs/service/BoardService.java index 4d7497cb..1a19b390 100644 --- a/src/main/java/nlib/bbs/service/BoardService.java +++ b/src/main/java/nlib/bbs/service/BoardService.java @@ -4,6 +4,28 @@ package nlib.bbs.service; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; +/** + *
+ * @Class Name : BoardService.java
+ * 
+ * @Description : 게시물 관리 클래스
+ * 
+ * 
+ * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
+ *
+ * 
+ * + * @ ------------ -------- --------------------------- + * @ 수정일 수정자 수정내용 + * @ ------------ -------- --------------------------- + * @ 2021. 7. 19. KNKIM 최초 생성 + * + * + * @author 이씨플라자 * DIGITALSHIP KNKIM + * @since 2021. 7. 19. + * @version 1.0 + * + */ public interface BoardService { public DataApiResVO listNotices(DataApiReqVO reqVO); @@ -12,6 +34,12 @@ public interface BoardService public DataApiResVO listFAQs(DataApiReqVO reqVO); + /** + * 묻고답하기 목록 조회한다. + * + * @param reqVO + * @return + */ public DataApiResVO listQnAs(DataApiReqVO reqVO); public DataApiResVO selectQnA(DataApiReqVO reqVO); diff --git a/src/main/java/nlib/bbs/service/impl/BoardDAO.java b/src/main/java/nlib/bbs/service/impl/BoardDAO.java index 4eca6c94..321c64e0 100644 --- a/src/main/java/nlib/bbs/service/impl/BoardDAO.java +++ b/src/main/java/nlib/bbs/service/impl/BoardDAO.java @@ -14,7 +14,12 @@ import nlib.restful.service.DataApiResVO; public class BoardDAO extends DataApi { private static final Logger log = LoggerFactory.getLogger(BoardDAO.class); - + + /** + * 주 자원의 URI + */ + public static final String RESOURCE_URI = "/uac/service/board/qna"; + public DataApiResVO listNotices(DataApiReqVO reqVO) { return null; } @@ -27,8 +32,15 @@ public class BoardDAO extends DataApi return null; } + /** + * 묻고답하기 목록 조회한다. + * + * @param reqVO + * @return + */ public DataApiResVO listQnAs(DataApiReqVO reqVO) { - return null; + reqVO.setReqUrl(RESOURCE_URI + "/list"); + return get(reqVO); } public DataApiResVO selectQnA(DataApiReqVO reqVO) { diff --git a/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java b/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java index 73a3b1f6..833cb950 100644 --- a/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java +++ b/src/main/java/nlib/bbs/service/impl/BoardServiceImpl.java @@ -32,8 +32,14 @@ public class BoardServiceImpl implements BoardService return null; } + /* + * 묻고답하기 목록 조회한다. + * + * (non-Javadoc) + * @see nlib.bbs.service.BoardService#listQnAs(nlib.restful.service.DataApiReqVO) + */ public DataApiResVO listQnAs(DataApiReqVO reqVO) { - return null; + return boardDAO.listQnAs(reqVO); } public DataApiResVO selectQnA(DataApiReqVO reqVO) { diff --git a/src/main/java/nlib/bbs/web/BoardController.java b/src/main/java/nlib/bbs/web/BoardController.java index 9f0e97a3..d42757b1 100644 --- a/src/main/java/nlib/bbs/web/BoardController.java +++ b/src/main/java/nlib/bbs/web/BoardController.java @@ -1,32 +1,40 @@ package nlib.bbs.web; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import egovframework.com.cmm.service.FileVO; import nlib.bbs.service.BoardService; +import nlib.cmm.NlibCommonController; +import nlib.restful.service.DataApiReqVO; +import nlib.restful.service.DataApiResVO; @Controller -public class BoardController +public class BoardController extends NlibCommonController { private static final Logger log = LoggerFactory.getLogger(BoardController.class); @Resource(name = "boardService") private BoardService boardService; + @Autowired + private AuthenticationManager authenticationManager; /** * 공지사항 목록 조회한다. @@ -34,8 +42,10 @@ public class BoardController * @param req * @return */ + @SuppressWarnings("deprecation") @RequestMapping("/board/listNotices.do") public String listNotices(HttpServletRequest req) { + return "nlib/board/listNotices"; } @@ -61,16 +71,56 @@ public class BoardController } /** - * 묻고답하기 목록 조회한다. + * 묻고답하기 목록 조회 화면을 구성한다. * * @param req * @return */ @RequestMapping("/board/listQnAs.do") - public String listQnAs(HttpServletRequest req) { + public String listQnAs(HttpServletRequest req, Authentication authentication, @RequestParam Map commandMap, ModelMap model) { + return "nlib/board/listQnAs"; } + /** + * 묻고답하기 목록 조회한다. + * + * @param req + * @return + */ + @RequestMapping(value="/board/listQnAsAjax.do") + public ResponseEntity listQnAsAjax(HttpServletRequest req, + Authentication authentication, @RequestBody Map paramMap) { + + String searchKeyword = paramMap.get("searchKeyword"); + String pageNo = paramMap.get("pageNo"); + String pageRows = paramMap.get("pageRows"); + + log.debug("listQnAs > pageNo = " + pageNo); + log.debug("listQnAs > pageRows = " + pageRows); + log.debug("listQnAs > keyword = " + searchKeyword); + + //------------------------------- + // REQ VO 구성 + //------------------------------- + DataApiReqVO reqVO = new DataApiReqVO(); + reqVO.setAuthKey(getAuthKey(authentication)); + reqVO.setPageNo(pageNo); + reqVO.setPageRows(pageRows); + + // 추가 정보 설정 + HashMap info = new HashMap(); + info.put("keyword", searchKeyword); + reqVO.setInfo(info); + + // 요청 + DataApiResVO resVO = boardService.listQnAs(reqVO); + + // JSON변환 응답 처리 + return makeResponseEntityJson(resVO); + } + + /** * 묻고답하기 상세 내용 조회한다. * diff --git a/src/main/java/nlib/cmm/NlibCommonController.java b/src/main/java/nlib/cmm/NlibCommonController.java new file mode 100644 index 00000000..55b5c029 --- /dev/null +++ b/src/main/java/nlib/cmm/NlibCommonController.java @@ -0,0 +1,64 @@ +package nlib.cmm; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import nlib.bbs.web.BoardController; +import nlib.cmm.exception.ErrorMessage; +import nlib.restful.service.DataApiResVO; +import nlib.security.SecUserVO; +import nlib.user.service.NlibLoginVO; + +public class NlibCommonController { + + private static final Logger log = LoggerFactory.getLogger(BoardController.class); + static final String ANONYMOUS_AUTH_KEY = "ANONYMOUS_AUTH_KEY_NONE"; + + public NlibLoginVO getNlibLoginVO(Authentication authentication) { + if(authentication == null) return null; + + return (NlibLoginVO)authentication.getPrincipal(); + } + + public SecUserVO getSecLoginVO(Authentication authentication) { + + if(authentication == null) return null; + + return (SecUserVO)authentication.getPrincipal(); + } + + public String getAuthKey(Authentication authentication) { + if(authentication == null) return ANONYMOUS_AUTH_KEY; + + return ((NlibLoginVO)authentication.getPrincipal()).getAuthKey(); + } + + public ResponseEntity makeResponseEntityJson(DataApiResVO resVO) { + + // Convert Json + ObjectMapper mapper = new ObjectMapper(); + String jsonStr = null; + + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8"); + + try { + jsonStr = mapper.writeValueAsString(resVO); + log.debug("RETURN DATA > json:" + jsonStr); + } catch (JsonProcessingException e) { + ErrorMessage eMsg = new ErrorMessage("ERR_JSON_CONVERT", "응답객체를 JSON으로 변환 처리 중 오류가 발생하였습니다. : " + e.toString()); + try { jsonStr = mapper.writeValueAsString(eMsg); } catch (JsonProcessingException ee) {} + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).headers(headers).body(jsonStr); + } + + return ResponseEntity.ok().headers(headers).body(jsonStr); + } +} diff --git a/src/main/java/nlib/restful/service/DataApiInterface.java b/src/main/java/nlib/restful/service/DataApiInterface.java index 7f4d1cf8..71160de1 100644 --- a/src/main/java/nlib/restful/service/DataApiInterface.java +++ b/src/main/java/nlib/restful/service/DataApiInterface.java @@ -26,7 +26,7 @@ import nlib.util.StringUtil; * * * @ ------------ -------- --------------------------- - * @ 수정일 수정자 수정내용 + * @ 수정일 수정자 수정내용 * @ ------------ -------- --------------------------- * @ 2021. 7. 9. KNKIM 최초 생성 * @@ -114,6 +114,11 @@ public interface DataApiInterface { } } + // 요청 파라메타 확인 + for(String key : map.keySet()) { + log.debug("MultiValueMap > " + key + "=" + map.get(key)); + } + return map; } diff --git a/src/main/java/nlib/restful/service/XmlConverter.java b/src/main/java/nlib/restful/service/XmlConverter.java new file mode 100644 index 00000000..e869fe39 --- /dev/null +++ b/src/main/java/nlib/restful/service/XmlConverter.java @@ -0,0 +1,79 @@ +package nlib.restful.service; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.HashMap; + +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; + +public class XmlConverter { + + @SuppressWarnings("restriction") + public static void main(String argv[]) { + + String inputFile = "C:/iams/workspace/nlib/data/dataxml/uac.service.board.qna.list_GET.xml"; + HashMap resMap = new HashMap(); + + try { + // First create a new XMLInputFactory + XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + // Setup a new eventReader + InputStream in = new FileInputStream(inputFile); + XMLEventReader eventReader = inputFactory.createXMLEventReader(in); + // Read the XML document + + int depth = 0; + StartElement startElement = null; + + while (eventReader.hasNext()) { + XMLEvent event = eventReader.nextEvent(); + System.out.println(" -> " + event); + String elementName = null; + String elementValue = null; + HashMap elementValues = null; + + if (event.isStartElement()) { + + startElement = event.asStartElement(); + + if (startElement.getName().getLocalPart().equals("result")) { + depth++; + + event = eventReader.nextEvent(); + System.out.println(" > " + event); + + // result의 하위 엘리먼트 시작 찾기 + while (!event.isStartElement()) { + event = eventReader.nextEvent(); + System.out.println(" 하위엘리먼트 시작전: " + event); + } + + while (!event.isEndElement()) { + if (event.isCharacters()) { + String content = event.asCharacters().getData(); + System.out.println("content: -" + content + "_"); + } + event = eventReader.nextEvent(); + System.out.println(" >> " + event); + } + + event = eventReader.nextEvent(); + System.out.println(" >>> " + event); + + continue; + } + + } + } + } catch (FileNotFoundException e) { + System.out.println("File not Found: " + inputFile); + } catch (XMLStreamException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/egovframework/spring/context-common.xml b/src/main/resources/egovframework/spring/context-common.xml index 15bd6393..2a5cd8aa 100644 --- a/src/main/resources/egovframework/spring/context-common.xml +++ b/src/main/resources/egovframework/spring/context-common.xml @@ -2,9 +2,12 @@ - diff --git a/src/main/resources/egovframework/spring/context-validator.xml b/src/main/resources/egovframework/spring/context-validator.xml index 03ebe32c..f128f50f 100644 --- a/src/main/resources/egovframework/spring/context-validator.xml +++ b/src/main/resources/egovframework/spring/context-validator.xml @@ -2,10 +2,10 @@ - + + diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 8ec520f2..3b82c206 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -16,7 +16,7 @@ - + diff --git a/src/main/webapp/WEB-INF/jsp/nlib/board/listQnAs.jsp b/src/main/webapp/WEB-INF/jsp/nlib/board/listQnAs.jsp index 87fe9c85..495d64b5 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/board/listQnAs.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/board/listQnAs.jsp @@ -30,6 +30,7 @@ <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> + 묻고답하기 @@ -41,22 +42,37 @@ + - +

묻고답하기

- +
+ + + + + + + + +
- + +
diff --git a/target/classes/log4j2.xml b/target/classes/log4j2.xml index 8ec520f2..3b82c206 100644 --- a/target/classes/log4j2.xml +++ b/target/classes/log4j2.xml @@ -16,7 +16,7 @@ - + diff --git a/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF b/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF index 97f32202..3d685daf 100644 --- a/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF +++ b/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF @@ -1,5 +1,5 @@ -Manifest-Version: 1.0 -Built-By: KNKIM -Build-Jdk: 1.8.0_291 -Created-By: Maven Integration for Eclipse - +Manifest-Version: 1.0 +Built-By: KNKIM +Build-Jdk: 1.8.0_291 +Created-By: Maven Integration for Eclipse +