diff --git a/egovframe-template-simple-react-contribution/src/pages/standardCode/viwerComponents.js b/egovframe-template-simple-react-contribution/src/pages/standardCode/viwerComponents.js
new file mode 100644
index 0000000..9a4bc40
--- /dev/null
+++ b/egovframe-template-simple-react-contribution/src/pages/standardCode/viwerComponents.js
@@ -0,0 +1,171 @@
+import * as EgovNet from "../../api/egovFetch";
+import React, {useEffect, useState} from "react";
+import SbItem from "./SbItem";
+import {Col, Row} from "react-bootstrap";
+import {VwDiv, VwPtag} from "./Sb.style";
+
+/*최상위 컴포넌트*/
+export function Maincontent({docCode}) {
+ const [doccode, setdoccode] = useState('');
+ const [docname, setdocname] = useState('');
+//TODO 맨처음 목차코드 및 목차제목 안나오는 문제 수정
+ function setdoccodandname(doccode, docname) {
+ setdoccode(doccode);
+ setdocname(docname);
+ }
+
+
+ return (
+
+
{doccode+' '+docname}
+
+
+
+
+ )
+}
+
+/*글 트리 컴포넌트*/
+export function CodeTree({docCode, setdoccodandname}) {
+ const [codeTree, setcodeTree] = useState([]);
+ const [doccode, setdoccode] = useState(docCode);
+ let data = [];
+ const getCodeTree = () => {
+ EgovNet.requestFetch(
+ '/standardCode/getCodeTree.do',
+ {
+ method: "POST",
+ headers: {
+ 'Content-type': 'application/json'
+ },
+ body: JSON.stringify({})
+ }, (item) => {
+ data = item.result.codeTree;
+ const nest = (menuData, parent_seq = null, link = 'parent_seq') =>
+ menuData.filter(item => item[link] === parent_seq)
+ .map(item => ({...item, childrens: nest(menuData, item.seq)}));
+ setcodeTree(nest(data));
+ }, () => {
+ })
+ }
+ useEffect(() => {
+ getCodeTree()
+ }, [])
+
+ return (
+ {codeTree.map(resp => {
+ return (
+
+ )
+ }
+ )}
+ )
+}
+
+
+/*글 내용+목차 분리 컴포넌트*/
+//TODO 추가 분리 작업 필요
+export function CodeCotentData({docCode}) {
+ const [codeChapter, setcodeChapter] = useState([]);
+ const [codeContent, setcodeContetn] = useState([]);
+ let result =[];
+ const getCodeDetail = (docCode) => {
+ EgovNet.requestFetch(
+ '/standardCode/getCodeDetailInfo.do',
+ {
+ method: "POST",
+ headers: {
+ 'Content-type': 'application/json'
+ },
+ body: JSON.stringify({
+ docCode: docCode
+ })
+ }, (item) => {
+ result = item.result.document;
+ }, () => {
+ })
+ }
+ useEffect(() => {
+ getCodeDetail(docCode)
+ setcodeChapter(result.map(item =>{
+ const isTitle = item.full_content.includes(item.group_title);
+ return(
+
+ {
+ document.location.hash="#"+item.cont_type_cd;
+ }} dangerouslySetInnerHTML={ {__html: item.group_title} }>
+
+
+ )
+ }))
+ setcodeContetn(result.map(item =>{
+ const isTitle = item.full_content.includes(item.group_title);
+ const docLinkReg = /([A-Z]{3,5}(\s[0-9]{2}){3,4})/g
+ const docPartReg = /\((?:표|그림|부록)?\s*([A-Z]\.)?(?!\d\))\d+(\.\d+)*(\s?\(\d\))?(-\d+)?(?:\s*[A-Z])?\)/g
+ if(docLinkReg.test(item.full_content)){
+ const docCodeAry = item.full_content.match(docLinkReg);
+ const docCodeMap = new Map();
+ for(let i=0; i' + docCode + '')
+ }
+ docCodeMap.forEach((docCodeLink, docCode)=>{
+ item.full_content = item.full_content.replaceAll(docCode, docCodeLink);
+ })
+ if(docPartReg.test(item.full_content)){
+
+ const docPartAry = item.full_content.match(docPartReg);
+ const docPartMap = new Map();
+ for(let i=0; i'+
+ ''+
+ '');
+ }
+ docPartMap.forEach((docPartLink, docPart)=>{
+ item.full_content = item.full_content.replaceAll(docPart, docPartLink);
+ })
+ }
+ if(item.full_content.includes(""+item.full_content;
+ }
+ item.full_content = item.full_content+"
"
+ return(
+
+ )
+ }
+ }))
+ }, [docCode])
+
+ return (<>
+
+
+ >)
+}
+
+
+
+
+
+
+
+
+/*글 목차 컴포넌트*/
+export function CodeChapter({codeChapter}) {
+ return (<>{codeChapter}>)
+}
+
+/*글 내용 컴포넌트*/
+export function CodeContent({codeContent}) {
+ return (<>{codeContent}>)
+}
\ No newline at end of file