package itn.let.cop.bbs.web;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springmodules.validation.commons.DefaultBeanValidator;

import com.penta.scpdb.ScpDbAgent;
import com.sci.v2.pcc.secu.SciSecuManager;
import com.sci.v2.pcc.secu.hmac.SciHmac;

import NiceID.Check.CPClient;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.EgovMultiPartEmail;
import itn.com.cmm.LoginVO;
import itn.com.cmm.ReadVO;
import itn.com.cmm.UserVO;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.service.ReadService;
import itn.com.cmm.util.EgovDoubleSubmitHelper;
import itn.com.cmm.util.StringUtil;
import itn.com.cmm.util.WebUtil;
import itn.com.uss.ion.cnf.service.ProhibitMngService;
import itn.com.uss.ion.cnf.service.WordFilterService;
import itn.com.uss.ion.cnf.service.WordFilterVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cop.bbs.service.Board;
import itn.let.cop.bbs.service.BoardChgHst;
import itn.let.cop.bbs.service.BoardMaster;
import itn.let.cop.bbs.service.BoardMasterVO;
import itn.let.cop.bbs.service.BoardVO;
import itn.let.cop.bbs.service.EgovBBSAttributeManageService;
import itn.let.cop.bbs.service.EgovBBSManageService;
import itn.let.cop.cmt.service.CommentVO;
import itn.let.cop.cmt.service.EgovArticleCommentService;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.sym.mnu.mpm.service.EgovMenuManageService;
import itn.let.sym.mnu.mpm.service.MenuManageVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.sym.site.service.SiteManagerVO;
import itn.let.sym.site.service.TermsVO;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.utl.sim.service.EgovClntInfo;
import itn.let.utl.user.service.MjonNoticeSendUtil;

/**
 * 게시물 관리를 위한 컨트롤러 클래스
 * @author 공통 서비스 개발팀 이삼섭
 * @since 2009.03.19
 * @version 1.0
 * @see
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자          수정내용
 *  -------    --------    ---------------------------
 *  2009.03.19  이삼섭          최초 생성
 *  2009.06.29  한성곤	       2단계 기능 추가 (댓글관리, 만족도조사)
 *  2011.08.31  JJY            경량환경 템플릿 커스터마이징버전 생성
 *
 *  </pre>
 */
@Controller
public class EgovBBSManageController {

	@Resource(name = "EgovBBSManageService")
	private EgovBBSManageService bbsMngService;

	@Resource(name = "EgovBBSAttributeManageService")
	private EgovBBSAttributeManageService bbsAttrbService;

	@Resource(name = "EgovFileMngService")
	private EgovFileMngService fileMngService;

	@Resource(name = "EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;

	@Resource(name = "propertiesService")
	protected EgovPropertyService propertyService;

	@Resource(name = "egovMessageSource")
	EgovMessageSource egovMessageSource;

	@Resource(name = "egovMultiPartEmail")
	private EgovMultiPartEmail egovMultiPartEmail;

	//문자발송 서비스
	@Resource(name = "MjonMsgDataService")
	private MjonMsgDataService mjonMsgDataService;
		
	@Autowired
	private DefaultBeanValidator beanValidator;
	
	@Value("#{globalSettings['Globals.Site.URL']}")
	private String SITE_URL;
	
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;
	
	/** WordFilterService 필터링 */
	@Resource(name = "wordFilterService")
	private WordFilterService wordFilterService;
	
	@Resource(name = "egovSiteManagerService")
	private EgovSiteManagerService egovSiteManagerService;
	
	@Resource(name = "readService")
	private ReadService readService;
	
	/** scriptMngService 금지어 */
	@Resource(name = "prohibitMngService")
	private ProhibitMngService prohibitMngService;
	
	@Resource(name = "EgovFileMngService")
	private EgovFileMngService fileService;
	
	/** EgovMenuManageService */
	@Resource(name = "meunManageService")
	private EgovMenuManageService menuManageService;
	
	/** 댓글 */
	@Resource(name = "EgovArticleCommentService")
    protected EgovArticleCommentService egovArticleCommentService;
	
	/** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;
	
	
	/** 알림전송 Util */
	@Resource(name = "mjonNoticeSendUtil")
	private MjonNoticeSendUtil mjonNoticeSendUtil;
	
	@Resource(name="MjonCommon")
	private MjonCommon mjonCommon;
	
	private static final Logger LOGGER = LoggerFactory.getLogger(EgovBBSManageController.class);

	//배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
	private String[][] bbsExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "제목" , "글쓰기 테스트" , "[코드]"}, 
	    {"2", "첨부파일유무" , "유", ""}, 
	    {"3", "공개여부" , "공개", ""}, 
	    {"4", "작성자" , "홍길동", "[코드]"},
	    {"5", "조회수" , "2", ""},
	    {"6", "작성일" , "2019-10-29", ""} 
	} ;
	/**
	 * XSS 방지 처리.
	 *
	 * @param data
	 * @return
	 */
	protected String unscript(String data) {
		if (data == null || data.trim().equals("")) {
			return "";
		}

		String ret = data;

		ret = ret.replaceAll("<(S|s)(C|c)(R|r)(I|i)(P|p)(T|t)", "&lt;script");
		ret = ret.replaceAll("</(S|s)(C|c)(R|r)(I|i)(P|p)(T|t)", "&lt;/script");

		ret = ret.replaceAll("<(O|o)(B|b)(J|j)(E|e)(C|c)(T|t)", "&lt;object");
		ret = ret.replaceAll("</(O|o)(B|b)(J|j)(E|e)(C|c)(T|t)", "&lt;/object");

		ret = ret.replaceAll("<(A|a)(P|p)(P|p)(L|l)(E|e)(T|t)", "&lt;applet");
		ret = ret.replaceAll("</(A|a)(P|p)(P|p)(L|l)(E|e)(T|t)", "&lt;/applet");

		ret = ret.replaceAll("<(E|e)(M|m)(B|b)(E|e)(D|d)", "&lt;embed");
		ret = ret.replaceAll("</(E|e)(M|m)(B|b)(E|e)(D|d)", "&lt;embed");

		ret = ret.replaceAll("<(F|f)(O|o)(R|r)(M|m)", "&lt;form");
		ret = ret.replaceAll("</(F|f)(O|o)(R|r)(M|m)", "&lt;form");

		ret = ret.replaceAll("<", "&lt;");
		ret = ret.replaceAll(">", "&gt;");
		ret = ret.replaceAll("alert", "");
		//ret = ret.replaceAll("iframe", "");
		
		return ret;
	}

	/**
	 * 게시물에 대한 목록을 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/selectBoardList.do")
	public String selectBoardArticles(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model
			, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) throws Exception {

		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		BoardMasterVO vo = new BoardMasterVO();
		vo.setBbsId(boardVO.getBbsId());
		BoardMasterVO master = bbsAttrbService.selectBBSMasterInf(vo);
		String listNum = "";
		if (("BBST05").equals(master.getBbsTyCode())) {
			listNum = "12"; // 포토형
		} else {
			listNum = master.getListNum();
		}
		
		boardVO.setPageUnit(Integer.parseInt(listNum));
		boardVO.setPageSize(Integer.parseInt(master.getPageNum()));

		PaginationInfo paginationInfo = new PaginationInfo();

		paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
		paginationInfo.setPageSize(boardVO.getPageSize());

		boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
		boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		boardVO.setLoginId(user.getId());
		
		if("".equals(master.getSearchSortCnd())){ //최초조회시 최신것 조회List
			if("BBSMSTR_000000000528".equals(master.getBbsId())) { //묻고답하기 제외
				
			}else {
				boardVO.setSearchSortCnd("FRST_REGIST_PNTTM desc, NTT_ID");
				boardVO.setSearchSortOrd("desc");	
			}

		}
		
		// 공지사항
		if (("Y").equals(master.getNoticeYn()) && ("").equals(boardVO.getSearchWrd())) {
			List<BoardVO> notifyList = bbsMngService.selectBoardNotifyArticles(boardVO, vo.getBbsAttrbCode());
			model.addAttribute("notifyList", notifyList);
			boardVO.setNoticeAt("N"); //다음에 공지사항 아닌것만 검색
		}
		
		if (("BBST05").equals(master.getBbsTyCode())) { //재단소식이면 
			boardVO.setSearchSortCnd("FRST_REGIST_PNTTM desc, NTT_ID");
			boardVO.setSearchSortOrd("desc");
		}
		Map<String, Object> map = bbsMngService.selectBoardArticles(boardVO, vo.getBbsAttrbCode());
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));

		
		paginationInfo.setTotalRecordCount(totCnt);

		model.addAttribute("resultList", map.get("resultList"));
		model.addAttribute("resultCnt", map.get("resultCnt"));
		model.addAttribute("boardVO", boardVO);
		model.addAttribute("brdMstrVO", master);
		model.addAttribute("paginationInfo", paginationInfo);

		//임시 데이터 이관용
		/*String ip = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
		if (ip == null) ip = request.getRemoteAddr();
		
		String ddd = "";
		if("219.240.88.15".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
			model.addAttribute("Transfer", true );
		}
		System.out.println("---ip----"+ip);*/
		return "cop/bbs/EgovNoticeList";
	}

	/**
	 * 게시물을 등록한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/cop/bbs/insertBoardArticle.do" , "/cop/bbs/insertBoardArticleAjax.do"})
	public ModelAndView insertBoardArticle(final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("searchVO") BoardVO boardVO
			, @ModelAttribute("bdMstr") BoardMasterVO bdMstr
			, @ModelAttribute("board") Board board
			, BindingResult bindingResult
			, ModelMap model
			, SessionStatus status
			, RedirectAttributes redirectAttributes
			, @RequestParam Map<String, Object> commandMap ) throws Exception {

		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		
		BoardMasterVO bmvo = new BoardMasterVO();
		bmvo.setBbsId(board.getBbsId());
		bmvo = bbsAttrbService.selectBBSMasterInf(bmvo);

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		// 관리권한, 사용여부
		/*if (bmvo == null || !isBBSAuthFlag(bmvo.getManageAuth(), bmvo.getBbsId(), null)) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			modelAndView.addObject("result", "no_auth");
			return modelAndView;
		}*/
		
		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			model.addAttribute("bdMstr", bmvo);
			modelAndView.addObject("result", "no_validate");
			return modelAndView;
		}
		
		String atchFileId = "";
		String isThumbFile = "";
		if (("BBST05").equals(bmvo.getBbsTyCode()) || ("BBST06").equals(bmvo.getBbsTyCode())) isThumbFile = "thumbFile";
		
		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		if (!files.isEmpty()) {
			
			List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", 0, atchFileId, "", isThumbFile);
			
			if(!isPosblAtchFile(result, bmvo, model, 0)) {
				modelAndView.addObject("result", "no_atchFile");
				return modelAndView;
			}

			atchFileId = fileMngService.insertFileInfs(result);
			board.setAtchFileId(atchFileId);
		}
		
		
		board.setFrstRegisterId(user.getUniqId());
		
		//데이터 이관용
		if(null ==board.getNtcrNm() || "".equals(board.getNtcrNm())) {
			board.setNtcrNm(user.getName());
		}
		
		board.setBbsId(board.getBbsId());
		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		board.setNttCn(board.getNttCn().replace("\r\n", ""));
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);
		
		if(null !=board.getFrstRegisterPnttm() && !"".equals(board.getFrstRegisterPnttm()) ) {
			board.getFrstRegisterPnttm();
			String tempDete = board.getFrstRegisterPnttm().split("-")[0]+board.getFrstRegisterPnttm().split("-")[1]+board.getFrstRegisterPnttm().split("-")[2];
			board.setFrstRegisterPnttm(tempDete);
		}
		
		bbsMngService.insertBoardArticle(board);
		
		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
		modelAndView.addObject("result", "success");
		return modelAndView;
	}

	/**
	 * 게시물을 등록 미리보기
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/bbsPreview.do")
	public String insertBoardArticle(@ModelAttribute("board") Board board, @ModelAttribute("bdMstr") BoardMaster bdMstr,
			SessionStatus status, ModelMap model, RedirectAttributes redirectAttributes) throws Exception {
		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		
        Calendar today = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String day = sdf.format(today.getTime());
		
		board.setFrstRegisterPnttm(day);
		
		model.addAttribute("board", board);
		model.addAttribute("bdMstr", bdMstr);
		return "cop/bbs/bbsPreview";
	}
	
	/**
	 * 공지사항, 채용공고 데이터 과기부 연동
	 *
	 * @param boardVO
	 * @return
	 * @throws Exception
	 */
	public String msitShareIn(Board board, String workType) throws Exception {
		if (1 == 1 ) return "asdf";
		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = user.getId();
		
		// yu3145 test s
		if (userId.equals("yu3145")) {
			
		
//		if (1 == 1 ) return "asdf";
		
		URL url;
		HttpURLConnection conn = null;
		Date today = new Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		String dTime = dateFormat.format(today); // ex)"2014-11-19 17:01:05"; // 요청 시간 (서버의 현재 시간을 입력 해 주세요.)
		String sPassword = "2fd1cf70fca385b36c6e4296a1afcd2b";  // 암호키 ( 미래창조과학부에서 제공 하는 기관의 암호키로 변경 하세요) : 10자이상
		String organCd = "POLAORKR";  // 기관코드 (  미래창조과학부에서 제공 하는 기관코드 )
		String timeKey =""; // 시간키(요청시간)
		String certKey =""; // 인증키 =  MD5(기관코드  + timeKey + 암호키)
		
		String bbsId = board.getBbsId();
		long nttId = board.getNttId();
		String linkUrl = SITE_URL+"/web/cop/bbsWeb/selectBoardArticle.do?bbsId="+bbsId+"&nttId="+nttId;
		String contentType;
		 
		timeKey = dTime.replace("-","");
		timeKey = timeKey.replace(":","");
		timeKey = timeKey.replace(" ","");    // 현재 시간에서 숫자를 제외한 모든 문자를 제거함 (14자리 문자열)
		
		long timeKeyInt = ( Long.parseLong(timeKey) + 222222 ) * 2 ;    // 제거된 시간을 숫자로 치환수 더하고 곱함
		timeKey = Long.toString(timeKeyInt);	// 다시 문자열로 치환 : param_01
		 
		 // MD5 인증키 생성
		WebUtil webutil = new WebUtil();   
		certKey = webutil.MD5(organCd + timeKey + sPassword); // 인증키  ( 기관코드 + 변형된시간 + 암호키) : param_02
		 
		// 과기부 컨텐츠 타입
		if (("BBSMSTR_000000000018").equals(bbsId)) { // 공지사항
			contentType = "NT";
		} else if (("BBSMSTR_000000000029").equals(bbsId)) { // 채용공고
			contentType = "RE";
		} else {
			contentType = "";
			linkUrl = "";
		}
		
		System.out.println("### msit shareIn: param_01: " + timeKey);
		System.out.println("### msit shareIn: param_02: " + certKey);
		System.out.println("### msit shareIn: organCd: " + organCd);
		System.out.println("### msit shareIn: workType: " + workType);
		System.out.println("### msit shareIn: contentType: " + contentType);
		System.out.println("### msit shareIn: board_type: " + bbsId);
		System.out.println("### msit shareIn: board_cd: " + nttId);
		System.out.println("### msit shareIn: board_subject: " + board.getNttSj());
		System.out.println("### msit shareIn: board_reg_date: " + dTime);
		System.out.println("### msit shareIn: board_link_url: " + linkUrl);
		
		if (1 == 1 ) return "asdf";
		
		try {
		    Map<String,Object> params = new LinkedHashMap<>(); // 파라미터 세팅
		    params.put("param_01", timeKey);
		    params.put("param_02", certKey);
		    params.put("organ_cd", organCd);
		    params.put("work_type", workType); // I, U, D
		    params.put("content_type", contentType);
		    params.put("board_type", bbsId);
		    params.put("board_cd", nttId);
		    params.put("board_subject", board.getNttSj());
		    params.put("board_reg_date", dTime);
		    params.put("board_link_url", linkUrl);
			
		    StringBuilder postData = new StringBuilder();
		    for(Map.Entry<String,Object> param : params.entrySet()) {
		        if(postData.length() != 0) postData.append('&');
		        postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
		        postData.append('=');
		        postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
		    }
		    byte[] postDataBytes = postData.toString().getBytes("UTF-8");
		
		    url = new URL("https://www.msit.go.kr/web/shareData/shareIn.do");
		
		    conn = (HttpURLConnection)url.openConnection();
		    conn.setRequestMethod("POST");
		    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		    conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
		    conn.setDoOutput(true);
		    conn.getOutputStream().write(postDataBytes);
		
		    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
		    
		    String inputLine;
		    while((inputLine = in.readLine()) != null) { // response 출력
		    	System.out.println("### msit shareIn: " + inputLine);
		    }
		    // 처리결과 Y : 처리완료 , E : 에러 , M : 데이터 누락, O : 시간초과 ,A : 인증실패
		    
		    in.close();
		} catch (Exception e) {
			System.out.println("과기부연동에러. msit shareIn error");
		} finally {
			if (conn != null) conn.disconnect();
		}
		
		} 		// yu3145 test e
		
		return "";
	}
	
	/**
	 * 게시물에 대한 답변 등록을 위한 등록페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/addReplyBoardArticle.do")
	public String addReplyBoardArticle(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO bdMstr = new BoardMasterVO();
		bdMstr.setBbsId(boardVO.getBbsId());
		bdMstr = bbsAttrbService.selectBBSMasterInf(bdMstr);

		// 관리권한, 사용여부
		/*if (bdMstr == null || ("N").equals(bdMstr.getUseAt()) 
				|| !isBBSAuthFlag(bdMstr.getManageAuth(), bdMstr.getBbsId(), null)) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/cop/bbs/SelectBBSMasterInfs.do";
		}*/
		
		//boardVO.setNttSj("[답변]" + boardVO.getNttSj());
		boardVO.setNttSj(boardVO.getNttSj());
		model.addAttribute("board", boardVO);
		model.addAttribute("bdMstr", bdMstr);

		return "cop/bbs/EgovNoticeReply";
	}

	/**
	 * 게시물에 대한 답변을 등록한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/replyBoardArticleAjax.do")
	public ModelAndView replyBoardArticle(final MultipartHttpServletRequest multiRequest, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("bdMstr") BoardMaster bdMstr,
			@ModelAttribute("board") Board board, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception {

		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		
		BoardMasterVO bmvo = new BoardMasterVO();
		bmvo.setBbsId(boardVO.getBbsId());
		bmvo = bbsAttrbService.selectBBSMasterInf(bmvo);

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		// 관리권한, 사용여부
		/*if (bmvo == null || !isBBSAuthFlag(bmvo.getManageAuth(), bmvo.getBbsId(), null)) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/cop/bbs/SelectBBSMasterInfs.do";
		}*/
		
		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			model.addAttribute("bdMstr", bmvo);
			modelAndView.addObject("result", "no_validate");
			return modelAndView;
		}

		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		String atchFileId = "";

		if (!files.isEmpty()) {
			List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", 0, "", "", "");
			// 파일 사이즈, 개수, 확장자 체크. model에 체크 오류 메세지 set
			if(!isPosblAtchFile(result, bmvo, model, 0)) {
				modelAndView.addObject("result", "no_atchFile");
				return modelAndView;
			}

			atchFileId = fileMngService.insertFileInfs(result);
		}

		// 사용자 본인인증값 조회
		boardVO.setPlusCount(false);
		BoardVO vo = bbsMngService.selectBoardArticle(boardVO);
		
		board.setMblDn(vo.getMblDn());
		
		board.setAtchFileId(atchFileId);
		board.setReplyAt("Y");
		board.setFrstRegisterId(user.getUniqId());
		board.setNtcrNm(user.getName());
		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		board.setParnts(Long.toString(boardVO.getNttId()));
		board.setReplyLc(Integer.toString(Integer.parseInt(boardVO.getReplyLc()) + 1));
		board.setNttCn(board.getNttCn().replace("\r\n", ""));
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);
		
		bbsMngService.insertBoardArticle(board);

		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
		//return "redirect:/cop/bbs/selectBoardList.do";
		modelAndView.addObject("result", "success");
		return modelAndView;
	}

	/**
	 * 게시물에 대한 내용을 삭제한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/deleteBoardArticle.do")
	public String deleteBoardArticle(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("board") Board board,
			@ModelAttribute("bdMstr") BoardMaster bdMstr, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {

		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();

		board.setLastUpdusrId(user.getUniqId());
		board.setLastUpdusrNm(user.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(request);
		board.setNtcrIp(userIp);

		bbsMngService.deleteBoardArticle(board);
		boardVO.setPageIndex(1); //삭제후 첫페이지로 로딩
		
		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.useN"));
		return "redirect:/cop/bbs/selectBoardList.do";
	}
	
	/**
	 * 게시물에 대한 내용을 사용처리한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/updateBoardArticleUseY.do")
	public String updateBoardArticleUseY(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("board") Board board,
			@ModelAttribute("bdMstr") BoardMaster bdMstr, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {

		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();

		board.setLastUpdusrId(user.getUniqId());
		board.setLastUpdusrNm(user.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(request);
		board.setNtcrIp(userIp);

		bbsMngService.updateBoardArticleUseY(board);
		boardVO.setPageIndex(1); //삭제후 첫페이지로 로딩
		
		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.useY"));
		return "redirect:/cop/bbs/selectBoardList.do";
	}
	

	/**
	 * 템플릿에 대한 미리보기용 게시물 목록을 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/bbsTmplatPreview.do")
	public String previewBoardArticles(@ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("brdMstrVO") BoardMasterVO brdMstrVO, ModelMap model) throws Exception {

		String template = boardVO.getSearchWrd(); // 템플릿 URL
		String viewCnd = boardVO.getSearchCnd(); // 미리보기 목록/상세 구분

		brdMstrVO.setTmplatCours(template);
		model.addAttribute("brdMstrVO", brdMstrVO);

		if (brdMstrVO.getSearchCnd().equals("detail")) {
			return "cop/bbs/EgovPreviewTmplatBBSInqire";
		} else {
			return "cop/bbs/EgovPreviewTmplatBBSList";
		}
	}
	
	/**
	 * 게시물 등록을 위한 등록페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/addBoardArticle.do")
	public String addBoardArticle(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model ,HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception {
		
		BoardMasterVO bdMstr = new BoardMasterVO();
		bdMstr.setBbsId(boardVO.getBbsId());
		bdMstr = bbsAttrbService.selectBBSMasterInf(bdMstr);

		// 관리권한, 사용여부
		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		if(!"ROLE_ADMIN".equals(user.getAuthority())){ //관리자 제외
			if (bdMstr == null || ("N").equals(bdMstr.getUseAt()) 
					|| !isBBSAuthFlag(bdMstr.getManageAuth(), bdMstr.getBbsId(), null)) {
				redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
				return "redirect:/cop/bbs/SelectBBSMasterInfs.do";
			}
		}
		
		
		//권한조회 하여 flag 값에 세팅ddd
		bdMstr.setAuthorities(EgovUserDetailsHelper.getAuthorities());
		model.addAttribute("bdMstr", bdMstr);
		model.addAttribute("board", boardVO);
		
		//팝업창시작일자(시)
		model.addAttribute("ntceBgndeHH", getTimeHH());
		//팝업창시작일자(분)
		model.addAttribute("ntceBgndeMM", getTimeMM());
		//팝업창종료일자(시)
		model.addAttribute("ntceEnddeHH", getTimeHH());
		//팝업창정료일자(분)
		model.addAttribute("ntceEnddeMM", getTimeMM());	
		ComDefaultCodeVO vo = new ComDefaultCodeVO();  //모집상태
		vo.setCodeId("ITN015");
		model.addAttribute("codeList", cmmUseService.selectCmmCodeDetail(vo));
		//임시 데이터 이관용
		/*String ip = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
		if (ip == null) ip = request.getRemoteAddr();
		
		String ddd = "";
		if("219.240.88.15".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
			model.addAttribute("Transfer", true );
		}*/
				
		return "cop/bbs/EgovNoticeRegist";
	}
	
	/**
	 * 게시물에 대한 상세 정보를 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/selectBoardArticle.do")
	public String selectBoardArticle(@ModelAttribute("searchVO") BoardVO boardVO
			, ModelMap model
			, HttpServletRequest request
			, RedirectAttributes redirectAttributes) throws Exception {
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();

		BoardMasterVO master = new BoardMasterVO();
		master.setBbsId(boardVO.getBbsId());
		BoardMasterVO masterVo = bbsAttrbService.selectBBSMasterInf(master);
		
		// 조회수 증가 여부 지정
		boardVO.setPlusCount(true);
		BoardVO vo = bbsMngService.selectBoardArticle(boardVO);
		
		//읽음처리 Insert
		ReadVO readVO = new ReadVO();
		readVO.setReadId(String.valueOf(boardVO.getNttId()));
		readVO.setLoginId(user.getId());
		readVO.setMenuNo("2400000");
		
		// 삭제 및 노 데이터 조회 시
		if (vo == null) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("info.nodata.msg"));
			redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
			redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
			redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
			redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
			return "redirect:/cop/bbs/selectBoardList.do";
		}
		
		// 위/아래 게시글 번호, 제목 조회
		EgovMap upDownNttid =  bbsMngService.getUpDownNttIdNSj(boardVO);
		if(null != upDownNttid) {
			model.addAttribute("nextNttIdNSj", upDownNttid.get("nextNttIdNSj"));
			model.addAttribute("prevNttIdNSj", upDownNttid.get("prevNttIdNSj"));
		}else {
			model.addAttribute("nextNttIdNSj", null);
			model.addAttribute("prevNttIdNSj", null);
		}
		
		model.addAttribute("result", vo);
		model.addAttribute("brdMstrVO", masterVo);

		String isTotalPage = request.getParameter("isTotalPage");
		if (StringUtil.isEmpty(isTotalPage)) {
			isTotalPage = "N";
		}
		model.addAttribute("isTotalPage", isTotalPage);
				
		return "cop/bbs/EgovNoticeInqire";
	}

	/**
	 * 게시물에 대한 내용을 수정한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/cop/bbs/updateBoardArticle.do" , "/cop/bbs/updateBoardArticleAjax.do"})
	public ModelAndView updateBoardArticle(final MultipartHttpServletRequest multiRequest, 
			@ModelAttribute("searchVO") BoardVO boardVO, 
			@ModelAttribute("bdMstr") BoardMaster bdMstr,
			@ModelAttribute("board") Board board, 
			BindingResult bindingResult, 
			ModelMap model, 
			SessionStatus status, 
			RedirectAttributes redirectAttributes) throws Exception {

		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();

		BoardMasterVO bmvo = new BoardMasterVO();
		bmvo.setBbsId(board.getBbsId());
		bmvo = bbsAttrbService.selectBBSMasterInf(bmvo);
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		// 관리권한, 사용여부
		/*if (bmvo == null || !isBBSAuthFlag(bmvo.getManageAuth(), bmvo.getBbsId(), null)) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			modelAndView.addObject("result", "no_auth");
			return modelAndView;
		}*/

		String atchFileId = boardVO.getAtchFileId();

		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			model.addAttribute("bdMstr", bmvo);
			modelAndView.addObject("result", "no_validate");
			return modelAndView;
		}

		String isThumbFile = "";
		if (("BBST05").equals(bmvo.getBbsTyCode()) || ("BBST06").equals(bmvo.getBbsTyCode())) isThumbFile = "thumbFile";

		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		if (!files.isEmpty()) {
			if ("".equals(atchFileId)) {
				List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", 0, atchFileId, "", isThumbFile);
				
				if(!isPosblAtchFile(result, bmvo, model, 0)) {
					modelAndView.addObject("result", "no_atchFile");
					return modelAndView;
				}
				
				atchFileId = fileMngService.insertFileInfs(result);
				board.setAtchFileId(atchFileId);
			} else {
				FileVO fvo = new FileVO();
				fvo.setAtchFileId(atchFileId);
				int cnt = fileMngService.getMaxFileSN(fvo);
				List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", cnt, atchFileId, "", isThumbFile);
				
				/*if(!isPosblAtchFile(result, bmvo, model, board.getAtchFileCnt())) {
					if(multiRequest.getServletPath().equals("/cop/bbs/updateBoardArticleAjax.do")) {
						modelAndView.addObject("result", "fail");
						modelAndView.addObject("failMessage", model.get("message"));
						return modelAndView;
					}
					
					model.addAttribute("bdMstr", bmvo);
					modelAndView.addObject("result", "no_atchFile");
					return modelAndView;
				}*/
				
				fileMngService.updateFileInfs(result);
			}
		}

		board.setLastUpdusrId(user.getUniqId());
		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		board.setLastUpdusrNm(user.getName());	// 변경이력에 사용
		board.setNttCn(board.getNttCn().replace("\r\n", ""));
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);
		if(null !=board.getFrstRegisterPnttm() && !"".equals(board.getFrstRegisterPnttm()) ) {
			board.getFrstRegisterPnttm();
			String tempDete = board.getFrstRegisterPnttm().split("-")[0]+board.getFrstRegisterPnttm().split("-")[1]+board.getFrstRegisterPnttm().split("-")[2];
			board.setFrstRegisterPnttm(tempDete);
		}
		
		bbsMngService.updateBoardArticle(board);

		// 공지사항, 채용공고 과기부 연동
		if (("BBSMSTR_000000000018").equals(board.getBbsId()) || ("BBSMSTR_000000000029").equals(board.getBbsId())) {
			 msitShareIn(board, "U"); // 실서버에서만 테스트
		}
		
		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		modelAndView.addObject("result", "success");
		return modelAndView;
	}
	
	/**
	 * 게시물 수정을 위한 수정페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param vo
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/forUpdateBoardArticle.do")
	public String forUpdateBoardArticle(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model , HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO masterVO = new BoardMasterVO();
		masterVO.setBbsId(boardVO.getBbsId());

		BoardMasterVO bmvo = bbsAttrbService.selectBBSMasterInf(masterVO);
		bmvo.setAuthorities(EgovUserDetailsHelper.getAuthorities());
		
		BoardVO bdvo = bbsMngService.selectBoardArticle(boardVO);
		if(null == bdvo.getPubLinkTxt() || "".equals(bdvo.getPubLinkTxt())){ //게시판명이 없으면 
			bdvo.setPubLinkTxt(bdvo.getPubLink());
		}
		
		if(bdvo.getAtchFileId() !=null) {
			FileVO fileVO = new FileVO();
			fileVO.setAtchFileId(bdvo.getAtchFileId());
			List<FileVO> fileList = fileService.selectFileInfs(fileVO);
			model.addAttribute("fileList", fileList);	
		}
		
		model.addAttribute("board", bdvo);
		model.addAttribute("bdMstr", bmvo);
		
		//팝업창시작일자(시)
		model.addAttribute("ntceBgndeHH", getTimeHH());
		//팝업창시작일자(분)
		model.addAttribute("ntceBgndeMM", getTimeMM());
		//팝업창종료일자(시)
		model.addAttribute("ntceEnddeHH", getTimeHH());
		//팝업창정료일자(분)
		model.addAttribute("ntceEnddeMM", getTimeMM());	
		ComDefaultCodeVO vo = new ComDefaultCodeVO();  //모집상태
		vo.setCodeId("ITN015");
		model.addAttribute("codeList", cmmUseService.selectCmmCodeDetail(vo));
		
		//임시 데이터 이관용
		String ip = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
		if (ip == null) ip = request.getRemoteAddr();
		if("219.240.88.15".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
			model.addAttribute("Transfer", true );
		}
		
		return "cop/bbs/EgovNoticeUpdt";
	}
	
	/**
	 * 게시판 관리 권한 여부 체크
	 * @param manageAuth 게시판 관리권한
	 * @param bbsId 게시판ID
	 * @return boolean
	 * @throws Exception 
	 */
	private boolean isBBSAuthFlag(String manageAuth, String bbsId, List<EgovMap> mngIdList) throws Exception {
		boolean authFlag = false;
		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		
		// 게시판 관리권한 체크
		for (String authority : authorities) {
			if (authority.equals(manageAuth)) authFlag = true;
		}
		
		// 게시판 관리자 체크
		if (!authFlag) {
			BoardMaster vo = new BoardMaster();
			vo.setBbsId(bbsId);
			if (mngIdList == null) mngIdList = (List<EgovMap>)bbsAttrbService.selectBBSMngIdList(vo);
			
			int mngYn = 0;
			for(int i = 0; i < mngIdList.size(); i++) {
				String emplyrId = (String) mngIdList.get(i).get("emplyrId");
				if (emplyrId.equals(user.getId())) mngYn++;
			}
			
			if (mngYn != 0) authFlag = true;
			if(mngIdList.size() == 0 ) { //관리자 등록 안 되어 있으면 모두 사용가능
				authFlag = true;
			}
		}
		
		return authFlag;
	}
	
	/**
	 * 첨부파일 개수, 사이즈, 확장자 체크
	 * @param fileList 파일리스트
	 * @param boardMasterVO 게시판마스터
	 * @param atchFileCnt 업로드된 파일 수
	 * @return boolean
	 * @return 체크 오류 메세지 model 'flashMessage' 에 set
	 * @throws Exception 
	 */
	private boolean isPosblAtchFile(List<FileVO> fileList, BoardMaster boardMaster, ModelMap model, int atchFileCnt) throws Exception {
		int fileCnt = 0;
		long posblAtchFileSize = Long.parseLong(boardMaster.getPosblAtchFileSize()) * 1024 * 1024 ;
		int posblAtchFileNumber = Integer.parseInt(boardMaster.getPosblAtchFileNumber());
		String bbsTyCode = boardMaster.getBbsTyCode();
		String flashMessage = "";
		boolean posblAtchFileFlag = true;
		boolean posblAtchFileSizeFlag = true; 
		boolean posblAtchFileExtFlag = true; 
		
		Iterator<?> iter = fileList.iterator();
		while (iter.hasNext()) {
			FileVO vo = (FileVO) iter.next();
			long fileMg = Long.parseLong(vo.getFileMg());
			String fileExt = vo.getFileExtsn();
			
			if (fileMg > posblAtchFileSize) posblAtchFileSizeFlag = false;
			
			if (("BBST05").equals(bbsTyCode) || ("BBST06").equals(bbsTyCode)) {
				String[] imgExts = {"gif", "jpg", "bmp", "jpeg", "png"};
				if (ArrayUtils.indexOf(imgExts, fileExt.toLowerCase()) == -1) posblAtchFileExtFlag = false;
			}
			
			fileCnt++;
		}
		
		if (!posblAtchFileExtFlag) {
			flashMessage += "이미지 형식의 확장자만 업로드 가능합니다." + "\\n";
			posblAtchFileFlag = false;
		}
		if(!posblAtchFileSizeFlag) {
			flashMessage += "파일사이즈가 초과되었습니다. 최대크기 " + posblAtchFileSize + "mb" + "\\n";
			posblAtchFileFlag = false;
		}
		if ((fileCnt+atchFileCnt) > posblAtchFileNumber) {
			flashMessage += "파일 개수가 초과되었습니다. 최대개수 " + posblAtchFileNumber + "개" + "\\n";
			posblAtchFileFlag = false;
		}
		
		if (!posblAtchFileFlag) model.addAttribute("message", flashMessage);

		return posblAtchFileFlag;
	}
		
	/**
	 * 게시물 변경 이력에 대한 목록을 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping("/cop/bbs/selectBoardChgHstList.do")
	public String selectBoardChgHstList(@ModelAttribute("boardChgHst") BoardChgHst boardChgHst, ModelMap model) throws Exception {
		boardChgHst.setPageUnit(propertyService.getInt("pageUnit"));
		boardChgHst.setPageSize(propertyService.getInt("pageSize"));
		
		PaginationInfo paginationInfo = new PaginationInfo();

		paginationInfo.setCurrentPageNo(boardChgHst.getPageIndex());
		paginationInfo.setRecordCountPerPage(boardChgHst.getPageUnit());
		paginationInfo.setPageSize(boardChgHst.getPageSize());

		boardChgHst.setFirstIndex(paginationInfo.getFirstRecordIndex());
		boardChgHst.setLastIndex(paginationInfo.getLastRecordIndex());
		boardChgHst.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

		Map<String, Object> map = bbsMngService.selectBoardChgHsts(boardChgHst);
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));
		paginationInfo.setTotalRecordCount(totCnt);

		// 내용에 html 제거
		List<BoardChgHst> list = (List<BoardChgHst>) map.get("resultList");
		for (BoardChgHst vo : list) {
			vo.setNttCn(StringUtil.stripTag(vo.getNttCn()));
		}
		
		model.addAttribute("resultList", map.get("resultList"));
		model.addAttribute("resultCnt", map.get("resultCnt"));
		model.addAttribute("paginationInfo", paginationInfo);

		return "cop/bbs/EgovNoticeChgHstList";
	}
	
	/**
	 * 게시물 변경이력에 대한 상세 정보를 조회한다.
	 *
	 * @param boardChgHst
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/cop/bbs/selectBoardChgHst.do")
	public String selectBoardChgHst(@ModelAttribute("boardChgHst") BoardChgHst boardChgHst, ModelMap model , RedirectAttributes redirectAttributes) throws Exception {
		BoardChgHst vo = bbsMngService.selectBoardChgHst(boardChgHst);
		model.addAttribute("result", vo);

		return "cop/bbs/EgovNoticeChgHstInqire";
	}
	
	/**
	 * 선택된 게시물에 대한 내용을 삭제한다.
	 * @param nttIds String
	 * @param boardVO BoardVO
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/cop/bbs/deleteBoardArticles.do")
	public String deleteBoardArticles(HttpServletRequest request, @RequestParam("nttIds") String nttIds, @ModelAttribute("BoardVO") BoardVO boardVO, RedirectAttributes redirectAttributes)
			throws Exception {
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();

		boardVO.setLastUpdusrId(user.getUniqId());
		boardVO.setLastUpdusrNm(user.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(request);
		boardVO.setNtcrIp(userIp);

		String[] strNttIds = nttIds.split(";");
		for (int i = 0; i < strNttIds.length; i++) {
			String[] strNttIdNAtchFileId = strNttIds[i].split("\\|");
			boardVO.setNttId(Integer.parseInt(strNttIdNAtchFileId[0]));
			if (strNttIdNAtchFileId.length > 1) boardVO.setAtchFileId(strNttIdNAtchFileId[1]);
			
			bbsMngService.deleteBoardArticle(boardVO);
		}
		
		// 공지사항, 채용공고 과기부 연동
		if (("BBSMSTR_000000000018").equals(boardVO.getBbsId()) || ("BBSMSTR_000000000029").equals(boardVO.getBbsId())) {
			 msitShareIn(boardVO, "D"); // 실서버에서만 테스트
		}
		
		boardVO.setPageIndex(1); //삭제후 첫페이지로 로딩
		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		return "redirect:/cop/bbs/selectBoardList.do";
	}

	/**
	 * 선택된 게시물 메인화면 폴라스토리 첫번째 게시물 등록
	 * @param nttIds String
	 * @param boardVO BoardVO
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/cop/bbs/mainPolaImgUpdate.do")
	public String mainPolaImgUpdate(HttpServletRequest request, @RequestParam("nttIds") String nttIds, @ModelAttribute("BoardVO") BoardVO boardVO, RedirectAttributes redirectAttributes)
			throws Exception {
		
		String[] strNttIdNAtchFileId = nttIds.split("\\|");
		boardVO.setNttId(Integer.parseInt(strNttIdNAtchFileId[0]));
		
		bbsMngService.updateMainPolaImg(boardVO);
		
		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		return "redirect:/cop/bbs/selectBoardList.do";
	}
	
	/**
	 * 사용자 게시글 등록 시 해당 게시판 관리자에게 메일 전송
	 * @param mailAddres 메일 주소
	 * @param bbsId 게시판ID
	 * @param nttId 게시글ID
	 * @param bbsNm 게시판 명
	 * @return boolean
	 * @throws Exception 
	 */
	private void sendBBSInsertMail(String mailAddres, String bbsId, long nttId, String bbsNm, String nttSj) throws Exception {
		try {
			String mailSj = "우체국물류지원단 홈페이지 \'" + bbsNm + "\' 게시판에 사용자 게시글이 등록되었습니다.";
			
			String htmlMsg = "<html>";
			htmlMsg += "\'" + bbsNm + "\' 게시판에 사용자 게시글이 등록되었습니다.";
			htmlMsg += "<br/><br/>제목: " + nttSj;
			htmlMsg += "<br/>링크: <a href='"+SITE_URL+"/cop/bbs/selectBoardArticle.do?bbsId="+bbsId+"&nttId="+nttId+"' target='_blank'>게시물</a>";
			htmlMsg += "<br/><br/>우체국물류지원단 시스템관리자";
			htmlMsg += "</html>";
			
			// test
			/*mailAddres = "yu3145@iten.co.kr";
			mailAddres = "kerinet@iten.co.kr" ;
			mailAddres = "fruit@pola.or.kr" ;*/
			
			
			egovMultiPartEmail.send(mailAddres, mailSj, "", htmlMsg);
//			egovMultiPartEmail.send(mailAddres, mailSj", mgs); // Simple Text Mail method
		} catch (Exception ex) {
			LOGGER.error("Sending Mail Exception : {} [unknown Exception]", ex.getCause());
			LOGGER.debug(ex.getMessage());
		}
	}
	
	/**
	 *  @@@@@@@@@@@@@@@@@@@@@@@@@@@@사용자
	 */

	/**
	 * (사용자)본인 인증 처리 Test
	 *
	 * @param boardVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/authenticationResult.do")
	public String authenticationResult(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, ModelMap model
			,RedirectAttributes redirectAttributes) throws Exception {
		UserVO userVO = new UserVO();
		String nameEn =  (String)request.getParameter("nameEn");

		switch (nameEn) {
			case "yu1" :
				userVO.setName("홍현준"); userVO.setMblDn("1111"); break;
			case "yu2" :
				userVO.setName("김현준"); userVO.setMblDn("2222"); break;
			case "yu3" :
				userVO.setName("박현준"); userVO.setMblDn("3333"); break;
		}
		
		request.getSession().setAttribute("userVO", userVO);
		
		String url = (String)request.getSession().getAttribute("url");
		BoardVO searchVO = (BoardVO)request.getSession().getAttribute("searchVO");
		redirectAttributes.addAttribute("pageIndex", searchVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", searchVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", searchVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", searchVO.getBbsId());
		redirectAttributes.addAttribute("nttId", searchVO.getNttId());

		return "redirect:" + url;
	}

	
	/**
	 * (사용자)게시물에 대한 목록을 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/cop/bbsWeb/selectBoardList.do" , "/web/cop/bbsWeb/selectMoreListAjax.do"})
	public String selectBoardArticlesWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, ModelMap model
			,RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/web/main/mainPage.do";
		}

		// 신고게시판 여부
		if (("BBST02").equals(bmVO.getBbsTyCode()) || ("BBST03").equals(bmVO.getBbsTyCode())) {
			// 신고게시판 인트로 화면 구분
			if (("Y").equals(boardVO.getReportIntroYn())) {
				
				redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
				return "redirect:/web/cop/selfauth/reportIntro.do";
			}
			
			if (userVO != null) { // 사용자 인증
				 boardVO.setMblDn(userVO.getMblDn()); // 사용자 인증 키. 본인글만 조회
			} else { // 인증 필요
				request.getSession().setAttribute("searchVO", boardVO);
				request.getSession().setAttribute("url", "/web/cop/bbsWeb/selectBoardList.do");
				return "redirect:/web/cop/selfauth/authentication.do";
			}
		}
		
		boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
		boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));

		PaginationInfo paginationInfo = new PaginationInfo();

		paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
		paginationInfo.setPageSize(boardVO.getPageSize());

		boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
		boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		if (("BBST05").equals(bmVO.getBbsTyCode())){ //사진게시판 8개씩 9개조회후 9개면 더보기
			boardVO.setRecordCountPerPage(8); //리스트 수 
			boardVO.setFirstIndex( (boardVO.getPageIndex()-1)*8); //offset
			paginationInfo.setRecordCountPerPage(boardVO.getRecordCountPerPage()); //웹 접근성 획득 후 롤백
		}	
		
		if(!"9410000".equals(bmVO.getMenuNo())) {
			boardVO.setParntScttNo("0"); //질문글만 가져오기(데이터 이관 숫자 틀려서 질문도 가져옴:공지사항)
		}
		 
		// 공지사항
		if (("Y").equals(bmVO.getNoticeYn())) {
			List<BoardVO> notifyList = bbsMngService.selectBoardNotifyArticles(boardVO, null);
			model.addAttribute("notifyList", notifyList);
			boardVO.setNoticeAt("N"); //다음에 공지사항 아닌것만 검색
		}
		
		if("BBST05".equals(bmVO.getBbsTyCode())){ //재단소식
			boardVO.setSearchSortCnd("FRST_REGIST_PNTTM");
			boardVO.setSearchSortOrd("desc");
		}
		Map<String, Object> map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));
		paginationInfo.setTotalRecordCount(totCnt);
		

		List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		SimpleDateFormat t1 = new SimpleDateFormat("yyyyMMdd");
		String nowTime = t1.format(cal.getTime());
		
		for (BoardVO bvo: resultList) {
			Document doc = Jsoup.parse(bvo.getNttCn());
			String text = doc.text();
			bvo.setNttCn2(text);
			if("9470000".equals(bmVO.getMenuNo())){ //인재채용시
				String tempYmd = "";
				if(null != bvo.getNtceBgnde() && !"".equals(bvo.getNtceBgnde())) { //모집기간 요일 추가하여 txt로 변환
					tempYmd = bvo.getNtceBgnde().substring(0,4)+"-"+ bvo.getNtceBgnde().substring(4,6)+"-"+ bvo.getNtceBgnde().substring(6,8);
					tempYmd = tempYmd+"("+getDateDay(tempYmd , "yyyy-MM-dd")+")" ;
					tempYmd = tempYmd + " "+bvo.getNtceBgnde().substring(8,10) +":"+bvo.getNtceBgnde().substring(10,12) ;
					bvo.setNtceBgndeView(tempYmd);
					if(Integer.parseInt(nowTime) >  Integer.parseInt(bvo.getNtceEndde().substring(0,8)) ) {
						bvo.setSeCd("09");
					}
			}
			if(null != bvo.getNtceEndde() && !"".equals(bvo.getNtceEndde())) {
					tempYmd = bvo.getNtceEndde().substring(0,4)+"-"+ bvo.getNtceEndde().substring(4,6)+"-"+ bvo.getNtceEndde().substring(6,8);
					tempYmd = tempYmd+"("+getDateDay(tempYmd , "yyyy-MM-dd")+")" ;
					tempYmd = tempYmd + " "+bvo.getNtceEndde().substring(8,10) +":"+bvo.getNtceEndde().substring(10,12) ;
					bvo.setNtceEnddeView(tempYmd);
				}
			}
		}
		PaginationInfo paginationInfoMobile = new PaginationInfo();
		paginationInfoMobile.setCurrentPageNo(paginationInfo.getCurrentPageNo());
		paginationInfoMobile.setTotalRecordCount(paginationInfo.getTotalRecordCount());
		paginationInfoMobile.setPageSize(5);
		paginationInfoMobile.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		model.addAttribute("resultList", resultList);
		model.addAttribute("resultCnt", map.get("resultCnt"));
		model.addAttribute("boardVO", boardVO);
		model.addAttribute("brdMstrVO", bmVO);
		model.addAttribute("paginationInfo", paginationInfo);
		model.addAttribute("paginationInfoMobile", paginationInfoMobile);
		
		if("BBST08".equals(bmVO.getBbsTyCode())){ //인재채용 게시판경우
			ComDefaultCodeVO vo = new ComDefaultCodeVO();  //모집상태
    		vo.setCodeId("ITN015");
    		model.addAttribute("codeList", cmmUseService.selectCmmCodeDetail(vo));
		}
		
		if("BBST05".equals(bmVO.getBbsTyCode())){ //재단소식 포토게시판
			if(resultList.size()>8) { //더보기 더튼 추가
				model.addAttribute("more", true);
			}else {
				model.addAttribute("more", false);
			}
			if("/web/cop/bbsWeb/selectMoreListAjax.do".equals(request.getRequestURI())) { //더보기
				return "web/cop/bbs/EgovNoticePhotoListAjax";	 			
			}
			return "web/cop/bbs/EgovNoticePhotoList"; //메인
		}
		
		if("9540000".equals(bmVO.getMenuNo())){ //개인정보처리방침의 경우 자세히 보기 pdf 파일과 제목가져오기
			if(resultList.size() > 0 ){
				model.addAttribute("pdfFileId", ((BoardVO)resultList.get(0)).getAtchFileId());
				model.addAttribute("pdfSj", ((BoardVO)resultList.get(0)).getNttSj());
			}
		}
		
		return "web/cop/bbs/EgovNoticeList";
	}

	/*nice체크 오프너로 이용*/
	@RequestMapping("/web/cop/bbs/niceCheckAjax.do")
	public String niceCheckWeb(HttpServletRequest request, 
			@RequestParam Map<String, Object> commandMap,
			@ModelAttribute("searchVO") BoardVO boardVO, 
			ModelMap model , HttpSession session
			 ) throws Exception {
		
		String niceMessage = niceCheck(request, session, boardVO).getNiceMessage();
		
		System.out.println("niceMessage --- " + niceMessage) ;
		if("".equals(niceMessage)) { //정상의 경우 세션 생성 후 오프너 close
			UserVO tempVO = new UserVO();
			tempVO.setMblDn(damoEnc(boardVO.getMblDn(), request)); //DI암호화  
			tempVO.setName(boardVO.getNiceNm());
			request.getSession().setAttribute("userVO", tempVO);
		}
		
		
		return "web/cop/selfauth/niceCheckAjax";
	}
	
	
	/**
	 * (사용자)게시물 등록을 위한 등록페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value={"/web/cop/bbs/addQnaBoardArticle.do","/web/cop/bbs/addSuggestBoardArticle.do"})
	public String addQnaBoardArticleWeb(HttpServletRequest request, 
			@RequestParam Map<String, Object> commandMap,
			@ModelAttribute("searchVO") BoardVO boardVO, 
			ModelMap model , HttpSession session,
			RedirectAttributes redirectAttributes ) throws Exception {
		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = user == null ? "" : EgovStringUtil.isNullToString(user.getId());
		
		if("".equals(userId)) {
			return "redirect:/web/user/login/login.do";
		}
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(user.getId());
		
		mberManageVO = bbsMngService.selectboardArticleWebQnaMberInfo(mberManageVO);
		
		
		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setUrl("/web/cop/bbs/SuggestList.do");
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(bmVO);
		
		bmVO.setBbsId(boardMenuList.get(0).getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		/*UserVO userVO = new UserVO();
		if(null != request.getSession().getAttribute("userVO")) { //세션체크
			userVO = ((UserVO)request.getSession().getAttribute("userVO"));
			boardVO.setMblDn(userVO.getMblDn());
			boardVO.setNtcrNm(userVO.getName());
		}else {
			if("9530000".equals(bmVO.getMenuNo())) { //묻고답하기
				return "redirect:/web/cop/selfauth/authentication.do?bbsId="+boardVO.getBbsId();
			}
		}*/
		
		/*if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/web/main/mainPage.do";
		}*/
		
		// 공통코드 Set
		/*setBBSCommCd(model, bmVO);*/
		model.addAttribute("mberManageVO", mberManageVO);
		model.addAttribute("brdMstrVO", bmVO);
		model.addAttribute("board", boardVO);
		model.addAttribute("suggestBbsId", boardMenuList.get(0).getBbsId());
		//최대 첨부파일 갯수 지정
		//model.addAttribute("posAtchFileNum", "1");
		
		String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
		if(pattern.equals("/web/cop/bbs/addSuggestBoardArticle.do")){ // 불편신고
			model.addAttribute("boardType", "suggest");
    	}

		// NEW
		// 공통
		List<TermsVO> resultList = new ArrayList<TermsVO>();			
		
		// 이용약관, 개인정보보호방침 최신버전 List
		TermsVO termsVO3 = new TermsVO();
		termsVO3.setFirstIndex(0);
		termsVO3.setRecordCountPerPage(1);
		termsVO3.setSearchDiv("03");
		termsVO3.setSearchUseYn("Y");			
		termsVO3.setSearchSortCnd("effectDate");
		termsVO3.setSearchSortOrd("desc");
		List<TermsVO> termsMastList2 = egovSiteManagerService.selectTermsMastMngList(termsVO3);
		if (termsMastList2.size() > 0) {
			TermsVO termsVO4 = new TermsVO();
			termsVO4.setFirstIndex(0);
			termsVO4.setRecordCountPerPage(20);				
			termsVO4.setTermsMastNo(termsMastList2.get(0).getTermsMastNo());
			termsVO4.setSearchUseYn("Y");
			termsVO4.setSearchSortCnd("sort");
			termsVO4.setSearchSortOrd("ASC");		
			resultList = egovSiteManagerService.selectTermsSubMngList(termsVO4);				
		}
		
		model.addAttribute("resultList", resultList);
		
		return "web/cop/bbs/EgovNoticeRegist";
	}
	
	
	/**
	 * (사용자)게시물 등록을 위한 등록페이지로 이동한다.(문자온 묻고답하기)
	 *
	 * @param boardVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/addBoardArticle.do")
	public String addBoardArticleWeb(HttpServletRequest request, 
			@RequestParam Map<String, Object> commandMap,
			@ModelAttribute("searchVO") BoardVO boardVO, 
			ModelMap model , HttpSession session,
			BoardMasterVO brdMstrVO ,
			RedirectAttributes redirectAttributes ) throws Exception {
		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = user == null ? "" : EgovStringUtil.isNullToString(user.getId());
		
		if("".equals(userId)) {
			return "redirect:/web/user/login/login.do";
		}
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(user.getId());
		
		mberManageVO = bbsMngService.selectboardArticleWebQnaMberInfo(mberManageVO);
		
		/*if(null != request.getSession().getAttribute("userVO")) { //세션체크
			userVO = ((UserVO)request.getSession().getAttribute("userVO")) ;
			boardVO.setMblDn(userVO.getMblDn());
			boardVO.setNtcrNm(userVO.getName());
		}else {
			return "redirect:/web/cop/bbs/QnaList.do";
		}*/
		/*LoginVO loginvo = new LoginVO();
		if(null != request.getSession().getAttribute("LoginVO")) {
		loginvo = ((LoginVO)request.getSession().getAttribute("LoginVO"));
		System.out.println(loginvo.getName());
		boardVO.setNtcrNm(loginvo.getName());
		}*/
		
		//묻고답하기의 게시판들 가져오기
		BoardMasterVO tempBoardMasterVO = new BoardMasterVO();
		tempBoardMasterVO.setUrl("/web/cop/bbs/QnaList.do");
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(tempBoardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(tempBoardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){
			tempBoardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		model.addAttribute("mberManageVO", mberManageVO);
		model.addAttribute("boardMenuList", boardMenuList);
		model.addAttribute("brdMstrVO", brdMstrVO);
		/*for(BoardMasterVO tempMasterVO : boardMenuList ) {
			tempMasterVO.setBbsNm(tempMasterVO.getBbsNm().split("\\(")[1].split("\\)")[0]) ;
		}*/
		
		model.addAttribute("board", boardVO);
		//최대 첨부파일 갯수 지정
		
		// NEW
		// 공통
		List<TermsVO> resultList = new ArrayList<TermsVO>();			
		
		// 이용약관, 개인정보보호방침 최신버전 List
		TermsVO termsVO3 = new TermsVO();
		termsVO3.setFirstIndex(0);
		termsVO3.setRecordCountPerPage(1);
		termsVO3.setSearchDiv("03");
		termsVO3.setSearchUseYn("Y");			
		termsVO3.setSearchSortCnd("effectDate");
		termsVO3.setSearchSortOrd("desc");
		List<TermsVO> termsMastList2 = egovSiteManagerService.selectTermsMastMngList(termsVO3);
		if (termsMastList2.size() > 0) {
			TermsVO termsVO4 = new TermsVO();
			termsVO4.setFirstIndex(0);
			termsVO4.setRecordCountPerPage(20);				
			termsVO4.setTermsMastNo(termsMastList2.get(0).getTermsMastNo());
			termsVO4.setSearchUseYn("Y");
			termsVO4.setSearchSortCnd("sort");
			termsVO4.setSearchSortOrd("ASC");		
			resultList = egovSiteManagerService.selectTermsSubMngList(termsVO4);				
		}
		
		model.addAttribute("resultList", resultList);
		
		return "web/cop/bbs/EgovNoticeRegist";
	}
	
	/**
	 * (사용자)본인인증 안내 화면
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/selfauth/authentication.do")
	public String authentication(HttpServletRequest request, 
			ModelMap model , @RequestParam Map<String, Object> commandMap, 
			@ModelAttribute("searchVO") BoardVO boardVO) throws Exception {
		boardVO.setNiceSuccUrl(request.getRequestURL().toString().split("selfauth")[0]+"bbs/niceCheckAjax.do");
		boardVO.setNiceFailUrl(request.getRequestURL().toString());
		model.addAttribute("boardVO", boardVO);
		return "web/cop/selfauth/authentication";
	}
	
	/**
	 * (사용자)신고게시판 안내 화면
	 *
	 * @param 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/selfauth/reportIntro.do")
	public String reportIntro(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception {
		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/web/main/mainPage.do";
		}
		
		model.addAttribute("brdMstrVO", bmVO);
		return "web/cop/selfauth/reportIntro";
	}
	
	
	/**
	 * (사용자)글쓰기 권한 없으면 비번 입력란 보이게...
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/cop/bbsWeb/selectBoardChkDetailAjax"} )
	public ModelAndView selectBoardChkDetailAjax(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardVO boardVO, 
			ModelMap model) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		
		LoginVO loginVO  =  new LoginVO();
		if(!"anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) { //최고 관리자면 바로수정
         	loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
         	if("ROLE_ADMIN".equals(loginVO.getAuthority())){ 
         		model.addAttribute("mblDnFlag", true);
         		return modelAndView;
         	}else { //일반관리자
         		bmVO.setBbsMngId(loginVO.getId());
         		if( bbsAttrbService.selectBBSMngInfCnt(bmVO) > 0 ) { //게시판 관리자 조회
             		model.addAttribute("mblDnFlag", true);
             		return modelAndView;
        		}
         	}
        }
		 
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		UserVO userVO = new UserVO();
		if(request.getSession().getAttribute("userVO") != null){
			userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
			if(userVO.getMblDn().equals(bdVO.getMblDn())){
				model.addAttribute("mblDnFlag", true);
			}else {
				model.addAttribute("mblDnFlag", false);
			}
		}else {
			model.addAttribute("mblDnFlag", false);
		}
		return modelAndView;
	}
	
	
	/**
	 * (사용자)게시물에 대한 상세 정보를 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/cop/bbsWeb/selectBoardArticle.do" , 
				"/web/cop/bbsWeb/selectBoardDetail.do",
				"/web/cop/bbs/NewsDetail.do",
				"/web/cop/bbs/LibDetail.do",
				"/web/cop/bbs/BussRealDetail.do",
				"/web/cop/bbs/QnaDetail.do",
				"/web/cop/bbs/SuggestDetail.do",
				"/web/cop/bbs/PubOperDetail.do",
				"/web/contentBbsDetail.do"
				
				//"/web/cop/bbs/EventDetail.do"
				} )
	public String selectBoardArticleWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, 
			BoardMasterVO masterVO,
			ModelMap model,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes) throws Exception {
		
		//XSS 태그 필터링 처리
		boardVO.setBbsId(unscript(boardVO.getBbsId()));
		boardVO.setSeCmmnCdId(unscript(boardVO.getSeCmmnCdId()));
		boardVO.setFrstRegisterId(unscript(boardVO.getFrstRegisterId()));
		boardVO.setSearchBgnDe(unscript(boardVO.getSearchBgnDe()));
		boardVO.setSearchEndDe(unscript(boardVO.getSearchEndDe()));
		boardVO.setSearchSortCnd(unscript(boardVO.getSearchSortCnd()));
		boardVO.setSearchSortOrd(unscript(boardVO.getSearchSortOrd()));
		boardVO.setSearchCnd(unscript(boardVO.getSearchCnd()));
		boardVO.setSearchWrd(unscript(boardVO.getSearchWrd()));
		
		
		BoardMasterVO bmVO = new BoardMasterVO();
		if("".equals(boardVO.getBbsId())) { //검색에서 조회시 nttid로 마스터 조회
			bmVO = bbsAttrbService.selectBbsIdByNttId(boardVO);
			if (bmVO == null) {
				redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
				return "redirect:/web/main/mainPage.do";
			}
			boardVO.setBbsId(bmVO.getBbsId());
		}else {
			bmVO.setBbsId(boardVO.getBbsId());
		}
			
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		if("/web/cop/bbs/NewsDetail.do".equals(request.getRequestURI()) || "/web/contentBbsDetail.do".equals(request.getRequestURI())) { //원자력소식 수정삭제등록 없음.
			bmVO.setWebChgYn("N");
			model.addAttribute("masterVO", masterVO);
		}
		
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/web/main/mainPage.do";
		}
		
		{//묻고답하기 권한체크
			boolean passChk = false; 
			if("9530000".equals(bmVO.getMenuNo())) {
				LoginVO loginVO  =  new LoginVO();
				if(!"anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) { //최고 관리자면 바로수정
		         	loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		         	if("ROLE_ADMIN".equals(loginVO.getAuthority())){
		         		passChk = true;
		         	}else { //일반관리자
		         		bmVO.setBbsMngId(loginVO.getId());
		         		if( bbsAttrbService.selectBBSMngInfCnt(bmVO) > 0 ) { //게시판 관리자 조회
		         			passChk = true;
		        		}
		         	}
		        }else{//방문자 세션있는방문자
		        	UserVO userVO = new UserVO();
		    		if(request.getSession().getAttribute("userVO") != null) {
		    			userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		    			if(userVO.getMblDn().equals(bdVO.getMblDn())) {
		    				passChk = true;
		    			}
		    		}	
		        }
				if(!"T".equals(bdVO.getSecretAt())){
					if(!passChk){
						if("".equals(boardVO.getPassword())) {
							redirectAttributes.addFlashAttribute("message", "패스워드를 넣어주세요");
							return "redirect:/web/cop/bbs/QnaList.do";
						}else {
							if(!damoDec(bdVO.getPassword(), request).equals(boardVO.getPassword())) {
								redirectAttributes.addFlashAttribute("message", "패스워드가 맞지 않습니다.");
								if("9530000".equals(bmVO.getMenuNo())) {
									return "redirect:/web/cop/bbs/QnaList.do";
								}else {
									return "redirect:/web/cop/bbsWeb/selectBoardList.do?bbsId="+boardVO.getBbsId();
								}
							}
						}
					}
				}
				
			}
		}
		
		// 조회수 증가 여부 지정
		boardVO.setPlusCount(true);
		bbsMngService.updateBoardArticleInqireCo(boardVO);
		
		boardVO.setMblDn(bdVO.getMblDn());
		
		// 위/아래 게시글 번호, 제목 조회
		if("/web/cop/bbs/QnaDetail.do".equals(request.getRequestURI())){
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			String userUniqId = user == null ? "" : EgovStringUtil.isNullToString(user.getUniqId());
			boardVO.setFrstRegisterId(userUniqId);
		}
		EgovMap upDownNttid =  bbsMngService.getUpDownNttIdNSj(boardVO);
		
		//게시판 마스터 옵션 정보
		BoardMasterVO searchVO = new BoardMasterVO();
		searchVO.setBbsId(boardVO.getBbsId());
		BoardMasterVO resultBbsMsInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
		
		//답변글 리스트
		if(bdVO.getAnswerCnt() > 0) {
			List<BoardVO> answerList = bbsMngService.selectBoardAnswerList(bdVO);
			model.addAttribute("answerList", answerList);
		}
		model.addAttribute("nextNttIdNSj", upDownNttid.get("nextNttIdNSj"));
		model.addAttribute("prevNttIdNSj", upDownNttid.get("prevNttIdNSj"));
		model.addAttribute("result", bdVO);
		model.addAttribute("brdMstrVO", bmVO);
		model.addAttribute("resultBbsMsInfo", resultBbsMsInfo);
		
		CommentVO commentVO = new CommentVO();
		commentVO.setBbsId(boardVO.getBbsId());		//게시판ID
		commentVO.setNttId(boardVO.getNttId());		//게시글ID
		
		//댓글 조회
		List<?> resultList = egovArticleCommentService.selectArticleCommentListAll(commentVO);
		int totCnt = resultList.size();
		
		model.addAttribute("resultCnt", totCnt);
		model.addAttribute("resultList", resultList);
		
		if("BBST05".equals(bmVO.getBbsTyCode())){ //이벤트 포토게시판
			if(bdVO.getAtchFileCnt() > 0 ) {
				FileVO fileVO = new FileVO();
				fileVO.setAtchFileId(bdVO.getAtchFileId());
				List<FileVO> result = fileService.selectImageFileList(fileVO);
				model.addAttribute("fileList", result);
			}
			return "web/cop/bbs/EgovNoticePhotoInqire";
		}
		
		if("Y".equals(masterVO.getTabBbsId())){
			model.addAttribute("PubDetail", true);
		}
		System.out.println("boardVO.toString()");
		System.out.println(boardVO.toString());
		return "web/cop/bbs/EgovNoticeInqire";
	}


	/**
	 * (사용자)게시물에 대한 상세 정보를 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= { "/web/cop/bbs/NoticeDetail.do" } )
	public String selectBoardNoticeDetailWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, 
			BoardMasterVO masterVO,
			ModelMap model,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes) throws Exception {
		
		//XSS 태그 필터링 처리
		boardVO.setBbsId(unscript(boardVO.getBbsId()));
		boardVO.setSeCmmnCdId(unscript(boardVO.getSeCmmnCdId()));
		boardVO.setFrstRegisterId(unscript(boardVO.getFrstRegisterId()));
		boardVO.setSearchBgnDe(unscript(boardVO.getSearchBgnDe()));
		boardVO.setSearchEndDe(unscript(boardVO.getSearchEndDe()));
		boardVO.setSearchSortCnd(unscript(boardVO.getSearchSortCnd()));
		boardVO.setSearchSortOrd(unscript(boardVO.getSearchSortOrd()));
		boardVO.setSearchCnd(unscript(boardVO.getSearchCnd()));
		boardVO.setSearchWrd(unscript(boardVO.getSearchWrd()));
		
		BoardMasterVO bmVO = new BoardMasterVO();
		
		//선택된 카테고리가 없는 경우
		if("".equals(boardVO.getBbsId())) { //검색에서 조회시 nttid로 마스터 조회
			bmVO = bbsAttrbService.selectBbsIdByNttId(boardVO);
			if (bmVO == null) {
				redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
				return "redirect:/web/main/mainPage.do";
			}
			boardVO.setBbsId(bmVO.getBbsId());
			
		}else {
			bmVO.setBbsId(boardVO.getBbsId());
		}
			
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		if("/web/cop/bbs/NewsDetail.do".equals(request.getRequestURI()) || "/web/contentBbsDetail.do".equals(request.getRequestURI())) { //원자력소식 수정삭제등록 없음.
			bmVO.setWebChgYn("N");
			model.addAttribute("masterVO", masterVO);
		}
		
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/web/main/mainPage.do";
		}
		
		{//묻고답하기 권한체크
			boolean passChk = false; 
			if("9530000".equals(bmVO.getMenuNo())) {
				LoginVO loginVO  =  new LoginVO();
				if(!"anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) { //최고 관리자면 바로수정
		         	loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		         	if("ROLE_ADMIN".equals(loginVO.getAuthority())){
		         		passChk = true;
		         	}else { //일반관리자
		         		bmVO.setBbsMngId(loginVO.getId());
		         		if( bbsAttrbService.selectBBSMngInfCnt(bmVO) > 0 ) { //게시판 관리자 조회
		         			passChk = true;
		        		}
		         	}
		        }else{//방문자 세션있는방문자
		        	UserVO userVO = new UserVO();
		    		if(request.getSession().getAttribute("userVO") != null) {
		    			userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		    			if(userVO.getMblDn().equals(bdVO.getMblDn())) {
		    				passChk = true;
		    			}
		    		}	
		        }
				if(!"T".equals(bdVO.getSecretAt())){
					if(!passChk){
						if("".equals(boardVO.getPassword())) {
							redirectAttributes.addFlashAttribute("message", "패스워드를 넣어주세요");
							return "redirect:/web/cop/bbs/QnaList.do";
						}else {
							if(!damoDec(bdVO.getPassword(), request).equals(boardVO.getPassword())) {
								redirectAttributes.addFlashAttribute("message", "패스워드가 맞지 않습니다.");
								if("9530000".equals(bmVO.getMenuNo())) {
									return "redirect:/web/cop/bbs/QnaList.do";
								}else {
									return "redirect:/web/cop/bbsWeb/selectBoardList.do?bbsId="+boardVO.getBbsId();
								}
							}
						}
					}
				}
				
			}
		}
		
		// 조회수 증가 여부 지정
		boardVO.setPlusCount(true);
		bbsMngService.updateBoardArticleInqireCo(boardVO);
		
		boardVO.setMblDn(bdVO.getMblDn());
		
		// 위/아래 게시글 번호, 제목 조회
		EgovMap upDownNttid =  bbsMngService.getUpDownNttIdNSj(boardVO);
		
		//게시판 마스터 옵션 정보
		BoardMasterVO searchVO = new BoardMasterVO();
		searchVO.setBbsId(boardVO.getBbsId());
		BoardMasterVO resultBbsMsInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
		
		//답변글 리스트
		if(bdVO.getAnswerCnt() > 0) {
			List<BoardVO> answerList = bbsMngService.selectBoardAnswerList(bdVO);
			model.addAttribute("answerList", answerList);
		}
		model.addAttribute("nextNttIdNSj", upDownNttid.get("nextNttIdNSj"));
		model.addAttribute("prevNttIdNSj", upDownNttid.get("prevNttIdNSj"));
		model.addAttribute("result", bdVO);
		bmVO.setUrl(request.getRequestURI()); //url 넘겨주기 - 게시판 상세 jsp는 공용으로 사용하는데, 공지사항 상세는 작성자를 '운영자'로 고정하기 위해 url을 넘겨 메뉴 구분
		model.addAttribute("brdMstrVO", bmVO);
		model.addAttribute("resultBbsMsInfo", resultBbsMsInfo);
		
		CommentVO commentVO = new CommentVO();
		commentVO.setBbsId(boardVO.getBbsId());		//게시판ID
		commentVO.setNttId(boardVO.getNttId());		//게시글ID
		
		//댓글 조회
		List<?> resultList = egovArticleCommentService.selectArticleCommentListAll(commentVO);
		int totCnt = resultList.size();
		
		model.addAttribute("resultCnt", totCnt);
		model.addAttribute("resultList", resultList);
		
		if("BBST05".equals(bmVO.getBbsTyCode())){ //이벤트 포토게시판
			if(bdVO.getAtchFileCnt() > 0 ) {
				FileVO fileVO = new FileVO();
				fileVO.setAtchFileId(bdVO.getAtchFileId());
				List<FileVO> result = fileService.selectImageFileList(fileVO);
				model.addAttribute("fileList", result);
			}
			return "web/cop/bbs/EgovNoticePhotoInqire";
		}
		
		if("Y".equals(masterVO.getTabBbsId())){
			model.addAttribute("PubDetail", true);
		}
		System.out.println("boardVO.toString()");
		System.out.println(boardVO.toString());
		return "web/cop/bbs/EgovNoticeInqire";
	}
	
	/**
	 * (사용자)게시물에 대한 상세 정보를 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/cop/bbsWeb/selectBoardChkDetailAjax.do"} )
	public ModelAndView selectBoardChkDetailAjax(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, 
			BoardMasterVO masterVO,
			ModelMap model , 
			RedirectAttributes redirectAttributes) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		
		
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return modelAndView;
		}
		
		{//묻고답하기 권한체크
			boolean passChk = false; 
			if("9530000".equals(bmVO.getMenuNo())) {
				LoginVO loginVO  =  new LoginVO();
				if(!"anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) { //최고 관리자면 바로수정
		         	loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		         	if("ROLE_ADMIN".equals(loginVO.getAuthority())){
		         		passChk = true;
		         	}else { //일반관리자
		         		bmVO.setBbsMngId(loginVO.getId());
		         		if( bbsAttrbService.selectBBSMngInfCnt(bmVO) > 0 ) { //게시판 관리자 조회
		         			passChk = true;
		        		}
		         	}
		        }else{//방문자 세션있는방문자
		        	UserVO userVO = new UserVO();
		    		if(request.getSession().getAttribute("userVO") != null) {
		    			userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		    			if(userVO.getMblDn().equals(bdVO.getMblDn())) {
		    				passChk = true;
		    			}
		    		}	
		        }
				if(!"T".equals(bdVO.getSecretAt())){
					if(!passChk){
						if("".equals(boardVO.getPassword())) {
							model.addAttribute("passChk", "01"); //패스워드 필요
							return modelAndView;
						}else {
							//패스워드 복구화
							if(!damoDec(bdVO.getPassword(), request).equals(boardVO.getPassword())) {
								model.addAttribute("passChk", "02"); //패스워드가 틀림
								return modelAndView;
							}
						}
					}
				}
			}
		}
		
		boardVO.setMblDn(bdVO.getMblDn());
		model.addAttribute("boardVO", boardVO);
		return modelAndView;
	}
	
	
	/**
	 * (사용자)게시물 수정을 위한 수정페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param vo
	 * @param model
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/forUpdateBoardArticle.do")
	public String forUpdateBoardArticleWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, ModelMap model , RedirectAttributes redirectAttributes, BoardMasterVO brdMstrVO) throws Exception {
		
		/*BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		//게시글 불러오기
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		
		if(bdVO.getAtchFileId() !=null) {
			FileVO fileVO = new FileVO();
			fileVO.setAtchFileId(bdVO.getAtchFileId());
			List<FileVO> fileList = fileService.selectFileInfs(fileVO);
			model.addAttribute("fileList", fileList);	
		}
		UserVO userVO = new UserVO();
		//게시글 본인인증 번호 변수 저장
		String mblDn = bdVO.getMblDn();
		
		// 공통코드 Set
		setBBSCommCd(model, bmVO);
		model.addAttribute("board", bdVO);
		model.addAttribute("brdMstrVO", bmVO);
		//최대 첨부파일 갯수 지정
		model.addAttribute("posAtchFileNum", bmVO.getPosblAtchFileNumber());
		if("9530000".equals(bmVO.getMenuNo())){ //묻고답하기
			//묻고답하기의 게시판들 가져오기
			BoardMasterVO boardMasterVO = new BoardMasterVO();
			boardMasterVO.setUrl("/web/cop/bbs/QnaList.do");
			List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
			List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
			for(BoardMasterVO tempVO : viewBoardMenuList) {
				if("N".equals(tempVO.getViewsYn())){;
					boardMasterVO.setViewsYn("N");
					break ;
				}
			}
			for(BoardMasterVO tempMasterVO : boardMenuList ) {
				tempMasterVO.setBbsNm(tempMasterVO.getBbsNm().split("\\(")[1].split("\\)")[0]) ;
			}
			model.addAttribute("boardMenuList", boardMenuList);
		}*/
		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		String userId = user == null ? "" : EgovStringUtil.isNullToString(user.getId());
		
		if("".equals(userId)) {
			return "redirect:/web/user/login/login.do";
		}
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(user.getId());
		
		mberManageVO = bbsMngService.selectboardArticleWebQnaMberInfo(mberManageVO);
		
		/*if(null != request.getSession().getAttribute("userVO")) { //세션체크
			userVO = ((UserVO)request.getSession().getAttribute("userVO")) ;
			boardVO.setMblDn(userVO.getMblDn());
			boardVO.setNtcrNm(userVO.getName());
		}else {
			return "redirect:/web/cop/bbs/QnaList.do";
		}*/
		/*LoginVO loginvo = new LoginVO();
		if(null != request.getSession().getAttribute("LoginVO")) {
		loginvo = ((LoginVO)request.getSession().getAttribute("LoginVO"));
		System.out.println(loginvo.getName());
		boardVO.setNtcrNm(loginvo.getName());
		}*/
		
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		
		if(bdVO.getAtchFileId() !=null) {
			FileVO fileVO = new FileVO();
			fileVO.setAtchFileId(bdVO.getAtchFileId());
			List<FileVO> fileList = fileService.selectFileInfs(fileVO);
			model.addAttribute("fileList", fileList);	
		}
		
		//묻고답하기의 게시판들 가져오기
		BoardMasterVO tempBoardMasterVO = new BoardMasterVO();
		tempBoardMasterVO.setUrl("/web/cop/bbs/QnaList.do");
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(tempBoardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(tempBoardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){
			tempBoardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		model.addAttribute("mberManageVO", mberManageVO);
		model.addAttribute("boardMenuList", boardMenuList);
		model.addAttribute("brdMstrVO", brdMstrVO);
		/*for(BoardMasterVO tempMasterVO : boardMenuList ) {
			tempMasterVO.setBbsNm(tempMasterVO.getBbsNm().split("\\(")[1].split("\\)")[0]) ;
		}*/
		
		model.addAttribute("board", bdVO);
		//최대 첨부파일 갯수 지정
		
		
		return "web/cop/bbs/EgovNoticeUpdt";
	}

	/**
	 * (사용자)게시물에 대한 내용을 수정한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	
	@RequestMapping(value= {"/web/cop/bbs/updateBoardArticle.do" , "/web/cop/bbs/updateBoardArticleAjax.do"})
	public ModelAndView updateBoardArticleWeb(HttpServletRequest request, final MultipartHttpServletRequest multiRequest, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("bdMstr") BoardMaster bdMstr,
			@ModelAttribute("board") Board board, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		// Start => bbsId를 변조해서 공지사항에 글 등록 방지 처리
		//boardVO.setBbsId("BBSMSTR_000000000651");	// 공지사항
		List<BoardVO> userBbsWriteList = bbsMngService.selectUserBbsWriteList(boardVO);
		System.out.println("boardVO.getBbsId : " + boardVO.getBbsId());
		System.out.println("userBbsWriteList.size() : " + userBbsWriteList.size());
		
		if (userBbsWriteList.size() == 0) {
			// 1:1문의, 불편사항 등 고객이 등록할수있는 게시판 목록이 아닐경우 
			modelAndView.addObject("message", "잘못된 접근입니다.\n관리자에게 문의하세요.");
			modelAndView.addObject("result", "fail");
			return modelAndView;			
		}
		// End		
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			//return "redirect:/web/main/mainPage.do";
			modelAndView.addObject("result", "no_imposbl");
			return modelAndView;
		}
		
//		if (userVO == null) { // 인증 필요
//			multiRequest.getSession().setAttribute("searchVO", boardVO);
//			multiRequest.getSession().setAttribute("url", "/web/cop/bbs/forUpdateBoardArticle.do");
//			return "redirect:/web/cop/selfauth/authentication.do";
//		}

		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
//		String frstRegisterId = bdVO.getFrstRegisterId(); // 관리자 유무
		
		UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		
		//게시글 본인인증 번호 변수 저장
		//String mblDn = bdVO.getMblDn();
		
		// 본인글 체크
		/*if (!mblDn.equals(userVO.getMblDn())) {
			redirectAttributes.addFlashAttribute("message", "본인글 외에는 수정할 수 없습니다.");
			redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
			redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
			redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
			redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
			redirectAttributes.addAttribute("nttId", boardVO.getNttId());
			modelAndView.addObject("result", "no_imposbl");
			return modelAndView;
		}*/
		
		String atchFileId = boardVO.getAtchFileId();

		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			// 공통코드 Set
			setBBSCommCd(model, bmVO);
			model.addAttribute("brdMstrVO", bmVO);
			modelAndView.addObject("result", "no_Validator");
			return modelAndView;
		}

		String isThumbFile = "";
		if (("BBST05").equals(bmVO.getBbsTyCode()) || ("BBST06").equals(bmVO.getBbsTyCode())) isThumbFile = "thumbFile";

		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		if (!files.isEmpty()) {
			
			if ("".equals(atchFileId)) {
				List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", 0, atchFileId, "", isThumbFile);
				
				if(!isPosblAtchFile(result, bmVO, model, 0)) {
					// 공통코드 Set
					setBBSCommCd(model, bmVO);
					model.addAttribute("brdMstrVO", bmVO);
					modelAndView.addObject("result", "no_fileupdate");
					return modelAndView;
				}
				
				atchFileId = fileMngService.insertFileInfs(result);
				board.setAtchFileId(atchFileId);
			} else {
				FileVO fvo = new FileVO();
				fvo.setAtchFileId(atchFileId);
				int cnt = fileMngService.getMaxFileSN(fvo);
				List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", cnt, atchFileId, "", isThumbFile);
				
				/*
				 * 파일 확장자 및 사이즈 등을 체크해주는 부분
				 * if(!isPosblAtchFile(result, bmVO, model, board.getAtchFileCnt())) {
					// 공통코드 Set
					setBBSCommCd(model, bmVO);
					model.addAttribute("brdMstrVO", bmVO);
					//return "web/cop/bbs/EgovNoticeUpdt";
					modelAndView.addObject("result", "no_fileupdate");
					return modelAndView;
				}*/
				
				fileMngService.updateFileInfs(result);
			}
		}

		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		//board.setLastUpdusrNm(userVO.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);

		bbsMngService.updateBoardArticle(board);

		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		modelAndView.addObject("result", "success");
		return modelAndView;
	}

	/**
	 * (사용자)게시물에 대한 내용을 삭제한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/deleteBoardArticle.do")
	public String deleteBoardArticleWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("board") Board board,
			@ModelAttribute("bdMstr") BoardMaster bdMstr, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);

		
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		String userUniqId = user == null ? "" : EgovStringUtil.isNullToString(user.getUniqId());
		
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		//String frstRegisterId = bdVO.getFrstRegisterId(); // 관리자 유무
		String frstRegisterId = bdVO.getFrstRegisterId();
		//bdVO.setMblDn(""); // 화면단으로 모바일키 인증 방지
		
		// 본인글 체크
		if (!frstRegisterId.equals(userUniqId)) {
			redirectAttributes.addFlashAttribute("message", "본인글 외에는 삭제할 수 없습니다.");
			redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
			redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
			redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
			redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
			redirectAttributes.addAttribute("nttId", boardVO.getNttId());
			return "redirect:/web/cop/bbsWeb/selectBoardArticle.do";
		}
		
		
		board.setLastUpdusrNm(user.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(request);
		board.setNtcrIp(userIp);

		bbsMngService.deleteBoardArticle(board);
		boardVO.setPageIndex(1); //삭제후 첫페이지로 로딩

		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		return "redirect:/web/cop/bbs/QnaList.do";
	}

	/**
	 * (사용자)본인인증 요청 입력 Sample
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/pccInput.do")
	public String pccInput(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
		
		return "web/cop/selfauth/pcc_V3_input_seed";
	}
	
	/**
	 * (사용자)본인인증 요청 팝업 Sample
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/selfauth.do")
	public String selfauthTest(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
		
		return "web/cop/selfauth/pcc_V3_sample_seed";
	}
	
	@Value("#{globalSettings['Globals.selfauth.siteId']}")
	private String SELFAUTH_SITE_ID;
	@Value("#{globalSettings['Globals.selfauth.srvNo']}")
	private String SELFAUTH_SRV_NO;
	
	/**
	 * (사용자)본인인증 요청
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/selfauth/selfauth.do")
	public String selfauth(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
		
        //날짜 생성
        Calendar today = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String day = sdf.format(today.getTime());

        java.util.Random ran = new Random();
        //랜덤 문자 길이
        int numLength = 6;
        String randomStr = "";

        for (int i = 0; i < numLength; i++) {
            //0 ~ 9 랜덤 숫자 생성
            randomStr += ran.nextInt(10);
        }

		String certGb = "H";
		String addVar = "";
        String reqNum = day + randomStr; // //reqNum은 최대 40byte 까지 사용 가능
		String certDate=day;
		String exVar = "0000000000000000"; // 복호화용 임시필드

		request.getSession().setAttribute("reqNum", reqNum); // 결과값 복호화시 필요
		
	    //01. 암호화 모듈 선언
		SciSecuManager seed  = new SciSecuManager();

		//02. 1차 암호화
		String encStr = "";
		String reqInfo      = SELFAUTH_SITE_ID+"^"+SELFAUTH_SRV_NO+"^"+reqNum+"^"+certDate+"^"+certGb+"^"+addVar+"^"+exVar;  // 데이터 암호화
		encStr              = seed.getEncPublic(reqInfo);
		
		//03. 위변조 검증 값 생성
		String hmacMsg = SciHmac.HMacEncriptPublic(encStr);

		//03. 2차 암호화
		reqInfo  = seed.getEncPublic(encStr + "^" + hmacMsg + "^" + "0000000000000000");  //2차암호화
		
		request.getSession().setAttribute("reqInfo", reqInfo); // 본인확인 요청 정보
		request.getSession().setAttribute("SITE_URL", SITE_URL); // 사이트 URL
		
		return "web/cop/selfauth/selfauth";
	}
	
	/**
	 * (사용자)본인인증 결과 리턴
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/selfauth/resultSeed.do")
	public String resultSeed(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
		
		String retInfo   = request.getParameter("retInfo").trim();
		String cookiereqNum = (String)request.getSession().getAttribute("reqNum");
		
		//복화화용 변수
		String encPara		= "";
		String encMsg		= "";
		String msgChk       = "N";  
		
        // 1. 암호화 모듈 (jar) Loading
		SciSecuManager sciSecuMg  = new SciSecuManager();
        //쿠키에서 생성한 값을 Key로 생성 한다.
        retInfo  = sciSecuMg.getDec(retInfo, cookiereqNum);

        // 2.1차 파싱---------------------------------------------------------------
        String[] aRetInfo1 = retInfo.split("\\^");

		encPara  = aRetInfo1[0];         //암호화된 통합 파라미터
        encMsg   = aRetInfo1[1];    //암호화된 통합 파라미터의 Hash값
		
		String  encMsg2   = sciSecuMg.getMsg(encPara);
		// 3.위/변조 검증 ---------------------------------------------------------------
        if(encMsg2.equals(encMsg)) msgChk="Y";

        if(msgChk.equals("N")) {
        	// 비정상 접근 처리
        }
		
		retInfo  = sciSecuMg.getDec(encPara, cookiereqNum);

        String[] aRetInfo = retInfo.split("\\^");
    	String name		= aRetInfo[0];                                                               //성명
//    	String birYMD		= aRetInfo[1];																//생년월일
//    	String sex			= aRetInfo[2];																//성별
//    	String fgnGbn	= aRetInfo[3];																//내외국인 구분값
        String di			= aRetInfo[4];																//DI
//        String ci1			= aRetInfo[5];																//CI
//        String ci2			= aRetInfo[6];																//CI
//        String civersion  = aRetInfo[7];                                                               //CI Version
//        String reqNum	= aRetInfo[8];                                                               // 본인확인 요청번호
//        String result		= aRetInfo[9];                                                               // 본인확인결과 (Y/N)
//        String certGb		= aRetInfo[10];                                                               // 인증수단
//        String cellNo		= aRetInfo[11];																// 핸드폰 번호
//    	String cellCorp	= aRetInfo[12];																// 이동통신사
//    	String certDate	= aRetInfo[13];                                                               // 검증시간
//    	String addVar		= aRetInfo[14];

    	// 사용자 세션생성
		UserVO userVO = new UserVO();
		userVO.setName(name);
		userVO.setMblDn(di);
		request.getSession().setAttribute("userVO", userVO);
		
		String url = (String)request.getSession().getAttribute("url");
		BoardVO searchVO = (BoardVO)request.getSession().getAttribute("searchVO");
		model.addAttribute("searchVO", searchVO);
		model.addAttribute("url", url);
    	
		return "web/cop/selfauth/resultSeed";
	}
	
	/**
	 * (사용자)본인인증 결과 리턴 Sample
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/pccPopSeed.do")
	public String pccPopSeed(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
		
		return "web/cop/selfauth/pcc_V3_popup_seed";
	}
	
	/**
	 * (사용자)본인인증 결과 Sample
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/cop/bbs/pccResult.do")
	public String pccResult(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
		
		return "web/cop/selfauth/pcc_V3_result_seed";
	}
	
	/**
	 * 게시판 공통코드
	 * @param model
	 * @throws Exception 
	 */
	private void setBBSCommCd(ModelMap model, BoardMasterVO bmVO) throws Exception {
		ComDefaultCodeVO comDefaultCodeVO = new ComDefaultCodeVO();
		// 폴라스토리. 사용자 유형
		if (("BBSMSTR_000000000153").equals(bmVO.getBbsId())) {
			comDefaultCodeVO.setCodeId("ITN003");
			List<?> userTypeList = cmmUseService.selectCmmCodeDetail(comDefaultCodeVO);
			model.addAttribute("userTypeList", userTypeList);
		}
		// 통합신고게시판. 게시판 유형
		if (("BBST03").equals(bmVO.getBbsTyCode())) {
			comDefaultCodeVO.setCodeId("ITN004");
			List<?> reportTyList = cmmUseService.selectCmmCodeDetail(comDefaultCodeVO);
			model.addAttribute("reportTyList", reportTyList);
		}
	}
	
	
	/**
	 * (사용자)게시물을 등록한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/cop/bbs/insertBoardArticle.do" , "/web/cop/bbs/insertBoardArticleAjax.do"})
	public ModelAndView insertBoardArticleWeb(HttpServletRequest request, 
			final MultipartHttpServletRequest multiRequest, 
			@ModelAttribute("searchVO") BoardVO boardVO, 
			@ModelAttribute("bdMstr") BoardMasterVO bdMstr,
			@ModelAttribute("board") Board board, 
			BindingResult bindingResult, 
			SessionStatus status, 
			ModelMap model, 
			RedirectAttributes redirectAttributes,
			@RequestParam Map<String, Object> commandMap ) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		
		if (!EgovDoubleSubmitHelper.checkAndSaveToken("someKey", multiRequest)) {  
			modelAndView.addObject("message", "너무많은 글쓰기가 시도되었습니다.");
			modelAndView.addObject("result", "fail");
			return modelAndView;
		}
		// Start => bbsId를 변조해서 공지사항에 글 등록 방지 처리
		//boardVO.setBbsId("BBSMSTR_000000000651");	// 공지사항
		List<BoardVO> userBbsWriteList = bbsMngService.selectUserBbsWriteList(boardVO);
		System.out.println("boardVO.getBbsId : " + boardVO.getBbsId());
		System.out.println("userBbsWriteList.size() : " + userBbsWriteList.size());
		
		if (userBbsWriteList.size() == 0) {
			// 1:1문의, 불편사항 등 고객이 등록할수있는 게시판 목록이 아닐경우 
			modelAndView.addObject("message", "잘못된 접근입니다.\n관리자에게 문의하세요.");
			modelAndView.addObject("result", "fail");
			return modelAndView;			
		}
		// End
		
		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);

		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			//return "redirect:/web/main/mainPage.do";
			modelAndView.addObject("result", "no_imposbl");
			return modelAndView;
		}
		
		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			// 공통코드 Set
			setBBSCommCd(model, bmVO);
			model.addAttribute("bdMstr", bmVO);
			//return "web/cop/bbs/EgovNoticeRegist";
			modelAndView.addObject("result", "no_validate");
			return modelAndView;
		}
		
		List<FileVO> result = null;
		String atchFileId = "";
		String isThumbFile = "";
		if (("BBST05").equals(bmVO.getBbsTyCode()) || ("BBST06").equals(bmVO.getBbsTyCode())) isThumbFile = "thumbFile";
		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		if (!files.isEmpty()) {
			result = fileUtil.parseFileInf(files, "BBS_", 0, "", "", isThumbFile);
			// 파일 사이즈, 개수, 확장자 체크. model에 체크 오류 메세지 set
			if(!isPosblAtchFile(result, bmVO, model, 0)) {
				// 공통코드 Set
				setBBSCommCd(model, bmVO);
				model.addAttribute("bdMstr", bmVO);
				//return "web/cop/bbs/EgovNoticeRegist";
				modelAndView.addObject("result", "no_atchFile");
				return modelAndView;
			}
			atchFileId = fileMngService.insertFileInfs(result);
		}
		
		board.setAtchFileId(atchFileId);
		board.setBbsId(board.getBbsId());
		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);
		//게시판 정보 입력
		/*board.setPassword(damoEnc(board.getPassword(), request)); *///비번암호화
		board.setPassword(board.getPassword());
		bbsMngService.insertBoardArticle(board);
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
		modelAndView.addObject("result", "success");
		
		
		// 법인폰 알람여부 체크
		JoinSettingVO joinSettingVO = new JoinSettingVO();
		joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
		// 이메일 체크
		if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
			// 알림 모듈 추가(게시판 id, 게시판 제목, 게시판 내용)
			mjonNoticeSendUtil.mjonInquiryNoticeSend(board.getBbsId(), board.getNttSj(), board.getNttCn());
		}

		// SMS 체크
		if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
			String smsTitle = bmVO.getBbsNm()+" 문의";
			// CS관리자 SMS 알림전송
			mjonNoticeSendUtil.csAdminSmsNoticeSend(board.getNttSj(), smsTitle);
		}

		// SLACK 체크
		if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {		
			// Slack 메시지 발송(단순본문)
			String msg = "[문자온] "+ bmVO.getBbsNm() + "- " + board.getNttSj();
			mjonCommon.sendSimpleSlackMsg(msg);
		}
		
		return modelAndView;
	}
	
	
	/**
	 * (사용자)게시물 등록을 위한 등록페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/member/cop/bbs/addBoardArticle.do")
	public String siteMemberAddBoardArticleWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, ModelMap model , RedirectAttributes redirectAttributes ) throws Exception {
		
		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);

		boolean authFlag = false;
		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
		// 게시판 쓰기 권한  체크
		for (String authority : authorities) {
			if (authority.equals(bmVO.getWriteAuth())) authFlag = true;
		}
		
		/*model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ; 
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt()) || !authFlag) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/"+siteId+"/web/main/mainPage.do";
		}*/

		// 공통코드 Set
		setBBSCommCd(model, bmVO);
		
		model.addAttribute("brdMstrVO", bmVO);
		model.addAttribute("board", boardVO);
		/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
			SiteManagerVO siteManagerVO = new SiteManagerVO();
			siteManagerVO.setSiteId(siteId);
			setSiteinfo(siteManagerVO, model , request );
			return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeRegist";
		}*/
		
		return "web/cop/bbs/EgovNoticeRegist";
	}
	
	
	/**
	 * (사용자)게시물을 등록한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/web/member/cop/bbs/insertBoardArticle.do")
	public String siteMemberInsertBoardArticleWeb(HttpServletRequest request , final MultipartHttpServletRequest multiRequest, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("bdMstr") BoardMasterVO bdMstr,
			@ModelAttribute("board") Board board, BindingResult bindingResult, SessionStatus status, ModelMap model, RedirectAttributes redirectAttributes,
			@RequestParam Map<String, Object> commandMap, WordFilterVO wordFilterVO ) throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);

		/*model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ; */
		
		boolean authFlag = false;
		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
		// 게시판 쓰기 권한  체크
		for (String authority : authorities) {
			if (authority.equals(bmVO.getWriteAuth())) authFlag = true;
		}
		
		/*if (bmVO == null || ("N").equals(bmVO.getUseAt()) || !authFlag) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/"+siteId+"/web/main/mainPage.do";
		}*/
		
		LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			// 공통코드 Set
			setBBSCommCd(model, bmVO);
			model.addAttribute("bdMstr", bmVO);
			/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
				SiteManagerVO siteManagerVO = new SiteManagerVO();
				siteManagerVO.setSiteId(siteId);
				setSiteinfo(siteManagerVO, model , request );
				return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeRegist";
			}*/
			
			return "web/cop/bbs/EgovNoticeRegist";
		}
		
		//필터체크
		//wordFilterVO.setSiteId(siteId);
		wordFilterVO = wordFilterService.selectWordFilterVO(wordFilterVO);
		if(wordFilterVO !=null){
			wordFilterVO.getFilterCn() ;
			board.getNttCn();
		}
		
		List<FileVO> result = null;
		String atchFileId = "";
		String isThumbFile = "";
		if (("BBST05").equals(bmVO.getBbsTyCode()) || ("BBST06").equals(bmVO.getBbsTyCode())) isThumbFile = "thumbFile";
		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		if (!files.isEmpty()) {
			result = fileUtil.parseFileInf(files, "BBS_", 0, "", "", isThumbFile);
			// 파일 사이즈, 개수, 확장자 체크. model에 체크 오류 메세지 set
			if(!isPosblAtchFile(result, bmVO, model, 0)) {
				// 공통코드 Set
				setBBSCommCd(model, bmVO);
				model.addAttribute("bdMstr", bmVO);
				/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
					SiteManagerVO siteManagerVO = new SiteManagerVO();
					siteManagerVO.setSiteId(siteId);
					setSiteinfo(siteManagerVO, model , request );
					return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeRegist";
				}*/
				return "web/cop/bbs/EgovNoticeRegist";
			}
			atchFileId = fileMngService.insertFileInfs(result);
		}
		
		if(loginVO == null){ //테스트
			UserVO tempUserVO = new UserVO();
			tempUserVO.setName("testName");
			tempUserVO.setMblDn("testMblDn");
			board.setNtcrNm(tempUserVO.getName());
			board.setMblDn(tempUserVO.getMblDn());
		}else{
			board.setNtcrNm(loginVO.getName());
			board.setFrstRegisterId(loginVO.getUniqId());
		}
		
		
		board.setAtchFileId(atchFileId);
		board.setBbsId(board.getBbsId());
		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);
		Board resultVO = bbsMngService.insertBoardArticle(board);
		List<EgovMap> mngIdList = bbsAttrbService.selectBBSMngIdList(bmVO); // 게시판 관리자ID 조회
		
		// 사용자 게시글 등록 시 메일 전송
		/*if (userVO != null) {
			for (EgovMap mngId : mngIdList) {
				String mailAdres = (String)mngId.get("emailAdres");
				if (mailAdres != null && !("").equals(mailAdres))
					sendBBSInsertMail((String)mngId.get("emailAdres"), board.getBbsId(), resultVO.getNttId(), bmVO.getBbsNm(), board.getNttSj());
			}
		}*/
		
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
		return "redirect:/web/cop/bbsWeb/selectBoardList.do";
	}
	
	/**
	 * (사용자)게시물 수정을 위한 수정페이지로 이동한다.
	 *
	 * @param boardVO
	 * @param vo
	 * @param model
	 * @throws Exception
	 */
	@RequestMapping("/{siteId}/web/member/cop/bbs/forUpdateBoardArticle.do")
	public String siteForUpdateBoardArticleWeb(@PathVariable("siteId") String siteId , HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, ModelMap model , RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		
		boolean authFlag = false;
		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
		// 게시판 쓰기 권한  체크
		for (String authority : authorities) {
			if (authority.equals(bmVO.getWriteAuth())) authFlag = true;
		}
		
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ; 
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt()) || !authFlag) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/"+siteId+"/web/main/mainPage.do";
		}
		
		LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		String frstRegisterId = bdVO.getFrstRegisterId(); // 관리자 유무
		bdVO.setMblDn(""); // 화면단으로 모바일키 인증 방지
		
		// 본인글 체크
		if (!frstRegisterId.equals(loginVO.getUniqId())) {
			redirectAttributes.addFlashAttribute("message", "본인글 외에는 수정할 수 없습니다.");
			redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
			redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
			redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
			redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
			redirectAttributes.addAttribute("nttId", boardVO.getNttId());
			return "redirect:/"+siteId+"/web/cop/bbsWeb/selectBoardArticle.do";
		}
		
		// 공통코드 Set
		setBBSCommCd(model, bmVO);

		model.addAttribute("board", bdVO);
		model.addAttribute("brdMstrVO", bmVO);
		/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
			SiteManagerVO siteManagerVO = new SiteManagerVO();
			siteManagerVO.setSiteId(siteId);
			setSiteinfo(siteManagerVO, model , request );
			return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeUpdt";
		}*/
		return "web/"+siteFolder+"/cop/bbs/EgovNoticeUpdt";
	}
	
	
	/**
	 * (사용자)게시물에 대한 내용을 수정한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/{siteId}/web/member/cop/bbs/updateBoardArticle.do")
	public String siteUpdateBoardArticleWeb(@PathVariable("siteId") String siteId ,HttpServletRequest request , final MultipartHttpServletRequest multiRequest, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("bdMstr") BoardMaster bdMstr,
			@ModelAttribute("board") Board board, BindingResult bindingResult, ModelMap model, SessionStatus status, RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);

		//UserVO userVO = (UserVO)multiRequest.getSession().getAttribute("userVO"); // 사용자 정보
		LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		boolean authFlag = false;
		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
		// 게시판 쓰기 권한  체크
		for (String authority : authorities) {
			if (authority.equals(bmVO.getWriteAuth())) authFlag = true;
		}
		
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt()) || !authFlag) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/"+siteId+"/web/main/mainPage.do";
		}
		
		/*if (userVO == null) { // 인증 필요
			multiRequest.getSession().setAttribute("searchVO", boardVO);
			multiRequest.getSession().setAttribute("url", "/web/cop/bbs/forUpdateBoardArticle.do");
			return "redirect:/web/cop/selfauth/authentication.do";
		}*/

		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		String frstRegisterId = bdVO.getFrstRegisterId(); // 글쓴이 아이디
		String mblDn = bdVO.getMblDn();
		bdVO.setMblDn(""); // 화면단으로 모바일키 인증 방지
		
		// 본인글 체크
		if (!bdVO.getFrstRegisterId().equals(loginVO.getUniqId())) {
			redirectAttributes.addFlashAttribute("message", "본인글 외에는 수정할 수 없습니다.");
			redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
			redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
			redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
			redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
			redirectAttributes.addAttribute("nttId", boardVO.getNttId());
			return "redirect:/"+siteId+"/web/cop/bbsWeb/selectBoardArticle.do";
		}
		
		String atchFileId = boardVO.getAtchFileId();

		beanValidator.validate(board, bindingResult);
		if (bindingResult.hasErrors()) {
			// 공통코드 Set
			setBBSCommCd(model, bmVO);
			model.addAttribute("brdMstrVO", bmVO);
			String siteFolder = "site/"+siteId ; 
			if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
				SiteManagerVO siteManagerVO = new SiteManagerVO();
				siteManagerVO.setSiteId(siteId);
				setSiteinfo(siteManagerVO, model , request );
				//return "web/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeUpdt";
				return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeUpdt";
			}
			return "web/"+siteFolder+"/cop/bbs/EgovNoticeUpdt";
		}

		String isThumbFile = "";
		if (("BBST05").equals(bmVO.getBbsTyCode()) || ("BBST06").equals(bmVO.getBbsTyCode())) isThumbFile = "thumbFile";

		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		if (!files.isEmpty()) {
			if ("".equals(atchFileId)) {
				List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", 0, atchFileId, "", isThumbFile);
				
				if(!isPosblAtchFile(result, bmVO, model, 0)) {
					// 공통코드 Set
					setBBSCommCd(model, bmVO);
					model.addAttribute("brdMstrVO", bmVO);
					String siteFolder = "site/"+siteId ; 
					/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setSiteId(siteId);
						setSiteinfo(siteManagerVO, model , request );
						return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeUpdt";
						
					}*/
					return "web/"+siteFolder+"/cop/bbs/EgovNoticeUpdt";
				}
				
				atchFileId = fileMngService.insertFileInfs(result);
				board.setAtchFileId(atchFileId);
			} else {
				FileVO fvo = new FileVO();
				fvo.setAtchFileId(atchFileId);
				int cnt = fileMngService.getMaxFileSN(fvo);
				List<FileVO> result = fileUtil.parseFileInf(files, "BBS_", cnt, atchFileId, "", isThumbFile);
				
				if(!isPosblAtchFile(result, bmVO, model, board.getAtchFileCnt())) {
					// 공통코드 Set
					setBBSCommCd(model, bmVO);
					model.addAttribute("brdMstrVO", bmVO);
					String siteFolder = "site/"+siteId ; 
					/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setSiteId(siteId);
						setSiteinfo(siteManagerVO, model , request );
						return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/cop/bbs/EgovNoticeUpdt";
					}*/
					return "web/"+siteFolder+"/cop/bbs/EgovNoticeUpdt";
				}
				
				fileMngService.updateFileInfs(result);
			}
		}

		board.setNttCn(unscript(board.getNttCn())); // XSS 방지
		board.setLastUpdusrNm(loginVO.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(multiRequest);
		board.setNtcrIp(userIp);

		bbsMngService.updateBoardArticle(board);

		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
		return "redirect:/"+siteId+"/web/cop/bbsWeb/selectBoardList.do";
	}
	
	
	/**
	 * (사용자)게시물에 대한 내용을 삭제한다.
	 *
	 * @param boardVO
	 * @param board
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/{siteId}/web/member/cop/bbs/deleteBoardArticle.do")
	public String siteDeleteBoardArticleWeb(@PathVariable("siteId") String siteId , HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("board") Board board,
			@ModelAttribute("bdMstr") BoardMaster bdMstr, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		bmVO.setBbsId(boardVO.getBbsId());
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);

		//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
		boolean authFlag = false;
		// 게시판 쓰기 권한  체크
		for (String authority : authorities) {
			if (authority.equals(bmVO.getWriteAuth())) authFlag = true;
		}
		
		if (bmVO == null || ("N").equals(bmVO.getUseAt()) || !authFlag) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/"+siteId+"/web/main/mainPage.do";
		}
		
		/*if (loginVO == null) { // 인증 필요
			request.getSession().setAttribute("searchVO", boardVO);
			request.getSession().setAttribute("url", "/web/cop/bbsWeb/selectBoardArticle.do");
			return "redirect:/web/cop/selfauth/authentication.do";
		}
		*/
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		String frstRegisterId = bdVO.getFrstRegisterId(); // 글쓴이
		String mblDn = bdVO.getMblDn();
		bdVO.setMblDn(""); // 화면단으로 모바일키 인증 방지
		
		// 본인글 체크
		if (frstRegisterId.equals("") || !frstRegisterId.equals(loginVO.getUniqId())) {
			redirectAttributes.addFlashAttribute("message", "본인글 외에는 삭제할 수 없습니다.");
			redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
			redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
			redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
			redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
			redirectAttributes.addAttribute("nttId", boardVO.getNttId());
			return "redirect:/"+siteId+"/web/cop/bbsWeb/selectBoardArticle.do";
		}
		
		board.setLastUpdusrNm(loginVO.getName());	// 변경이력에 사용
		String userIp = EgovClntInfo.getClntIP(request);
		board.setNtcrIp(userIp);

		bbsMngService.deleteBoardArticle(board);
		boardVO.setPageIndex(1); //삭제후 첫페이지로 로딩

		redirectAttributes.addAttribute("pageIndex", boardVO.getPageIndex());
		redirectAttributes.addAttribute("searchCnd", boardVO.getSearchCnd());
		redirectAttributes.addAttribute("searchWrd", boardVO.getSearchWrd());
		redirectAttributes.addAttribute("bbsId", boardVO.getBbsId());
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		return "redirect:/"+siteId+"/web/cop/bbsWeb/selectBoardList.do";
	}

	private void setSiteinfo(SiteManagerVO siteManagerVO , ModelMap model , HttpServletRequest request) throws Exception{
    	SiteManagerVO tempSiteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO) ;
		if(tempSiteManagerVO !=null){
			siteManagerVO.setIsMobile("pc") ;
			siteManagerVO.setTheme(tempSiteManagerVO.getTheme());
		}else{
			siteManagerVO.setTheme("01");
		}
    	WebUtil util = new WebUtil();
		if(util.isMobile(request)){
			siteManagerVO.setIsMobile("mobile");
		}
		model.addAttribute("siteId", siteManagerVO.getSiteId());
		//model.addAttribute("site_path" , "/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile());
		model.addAttribute("site_path" , "/site/"+siteManagerVO.getSiteId()+"/"+siteManagerVO.getIsMobile());
	}
	
	
	/**
	 * 첨부파일 개수, 사이즈, 확장자 체크
	 * 썸네일, 모델, 기개수, 종류
	 * @param fileList 파일리스트
	 * @param boardMaster
	 * @param model 
	 * @param atchFileCnt 업로드된 파일 수
	 * @param fileSe 파일 구분
	 * @return boolean
	 * @return 체크 오류 메세지 model 'flashMessage' 에 set
	 * @throws Exception 
	 */
	private boolean isPosblAtchFile_tobe(Map<String, MultipartFile> fileList, BoardMaster boardMaster, 
			ModelMap model, int atchFileCnt, String fileSe) throws Exception {
		long posblAtchFileSize = Long.parseLong(boardMaster.getPosblAtchFileSize()) * 1024 * 1024 ;
		int posblAtchFileNumber = Integer.parseInt(boardMaster.getPosblAtchFileNumber());
		String bbsTyCode = boardMaster.getBbsTyCode();
		String flashMessage = "";
		String fileSeMsg = "첨부파일: ";
		String fileExtMsg = "";
		boolean posblAtchFileFlag = true;
		boolean posblAtchFileSizeFlag = true; 
		boolean posblAtchFileExtFlag = true;
		boolean isImg = false;
		
		// 썸네일 시
		if (fileSe.equals("thumb")) {
			posblAtchFileNumber = 1;
			isImg = true;
			fileSeMsg = "썸네일: ";
		}
		
		Iterator<Entry<String, MultipartFile>> itr = fileList.entrySet().iterator();
		MultipartFile file;
		
		int fileCnt = 0;
		while (itr.hasNext()) {
		    Entry<String, MultipartFile> entry = itr.next();
		    file = entry.getValue();
			
			long fileMg = file.getSize();
			String orginFileName = file.getOriginalFilename();
		    int index = orginFileName.lastIndexOf(".");
		    String fileExt = orginFileName.substring(index + 1);
			
			if (fileMg > posblAtchFileSize) posblAtchFileSizeFlag = false;
			
			// 이미지 형식 확인
//			if (("BBST05").equals(bbsTyCode) || ("BBST06").equals(bbsTyCode) || isImg) {
			if (isImg) {
				String[] imgExts = {"gif", "jpg", "bmp", "jpeg", "png"};
				if (ArrayUtils.indexOf(imgExts, fileExt.toLowerCase()) == -1) {
					posblAtchFileExtFlag = false;
					fileExtMsg = "이미지";
				}
			}
			
			// 포토형2 pdf 예외처리 필요
//			if (("ㅁㄴㅇㄹ").equals(bbsTyCode)) {
//				String[] imgExts = {"pdf"};
//				if (ArrayUtils.indexOf(imgExts, fileExt.toLowerCase()) == -1) {
//					posblAtchFileExtFlag = false;
//					fileExtMsg = "PDF";
//				}
//			}
			
			fileCnt++;
		}
		
		if (!posblAtchFileExtFlag) {
			flashMessage += fileSeMsg + fileExtMsg + " 형식의 확장자만 업로드 가능합니다." + "\\n";
			posblAtchFileFlag = false;
		}
		if(!posblAtchFileSizeFlag) {
			flashMessage += fileSeMsg + "파일사이즈가 초과되었습니다. 최대크기 " + posblAtchFileSize + "mb" + "\\n";
			posblAtchFileFlag = false;
		}
		if ((fileCnt+atchFileCnt) > posblAtchFileNumber) {
			flashMessage += fileSeMsg + "파일 개수가 초과되었습니다. 최대개수 " + posblAtchFileNumber + "개" + "\\n";
			posblAtchFileFlag = false;
		}
		
		if (!posblAtchFileFlag) model.addAttribute("message", flashMessage);
		
		return posblAtchFileFlag;
	}
	
	
	//게시판 리스트 엑셀 다운로드
  	@RequestMapping(value="/cop/bbs/bbsExcelDownload.do")
  	public void bbsExcelDownload( BoardVO boardVO, 
  			HttpServletRequest request, 
  			HttpServletResponse response , 
  			ModelMap model) throws Exception {
  		
  		BoardMasterVO vo = new BoardMasterVO();
		vo.setBbsId(boardVO.getBbsId());
		BoardMasterVO master = bbsAttrbService.selectBBSMasterInf(vo);
		
		boardVO.setRecordCountPerPage(100000);
		boardVO.setFirstIndex(0);
  		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
	
  		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
  		SXSSFWorkbook wb = new SXSSFWorkbook(100);
  		CellStyle style = wb.createCellStyle();
  		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
   		style.setBorderLeft(CellStyle.BORDER_THIN);
   		style.setBorderRight(CellStyle.BORDER_THIN);
   		style.setBorderTop(CellStyle.BORDER_THIN);
   		Font font = wb.createFont();
   		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
  		Cell cell = null;
  		Row row = null;
  		String fileName ="게시판 리스트";
  		String sheetTitle = ""; 
  		try{
  			Map<String, Object> bbsList = bbsMngService.selectBoardArticles(boardVO, vo.getBbsAttrbCode());
  			{ //화면 리스트
  				sheetTitle = "게시판 리스트(화면)" ; //제목
  				Sheet sheet = wb.createSheet(sheetTitle);
  				row = sheet.createRow(0);
  		        for(int i=0 ; i < bbsExcelValue.length ; i++) {
  	 		       cell = row.createCell(i);
  	 		       cell.setCellStyle(style);
  		 	       cell.setCellValue(bbsExcelValue[i][1]);
  	 		    }
  			    
  		        List<BoardVO> bbsCastList =  (List<BoardVO>)bbsList.get("resultList") ;
  		        for(int i=0; i <  bbsCastList.size(); i++){
  			    	row = sheet.createRow(i+1);
  			    	for(int j=0 ; j < bbsExcelValue.length ; j++) {
  			        	cell = row.createCell(j);
  			        	cell.setCellStyle(style);
  			        	if(j==0) cell.setCellValue(i+1); //번호
  			        	if(j==1) cell.setCellValue(((BoardVO)bbsCastList.get(i)).getNttSj()); //제목
  			        	if(j==2) cell.setCellValue( ((BoardVO)bbsCastList.get(i)).getAtchFileCnt() > 0 ? "있음" : "없음"); //첨부파일유무
  			        	if(j==3) cell.setCellValue( "Y".equals( ((BoardVO)bbsCastList.get(i)).getSecretAt() ) ? "비공개" : "공개" ); //공개여부
  			        	if(j==4) cell.setCellValue(((BoardVO)bbsCastList.get(i)).getFrstRegisterNm()); //작성자
  			        	if(j==5) cell.setCellValue(((BoardVO)bbsCastList.get(i)).getInqireCo()); //조회수
  			        	if(j==6) cell.setCellValue(((BoardVO)bbsCastList.get(i)).getFrstRegisterPnttm()); //작성일
  				 	}
  		        }
  			}
  	    response.setHeader("Set-Cookie", "fileDownload=true; path=/");
  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
  		Date currentTime = new Date ();
  		String mTime = mSimpleDateFormat.format ( currentTime );
  		fileName = fileName+"("+mTime+")";
  		
  		response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
  		wb.write(response.getOutputStream());
  	    
  		}catch(Exception e) {
  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  			response.setHeader("Content-Type","text/html; charset=utf-8");
  			OutputStream out = null;
  			try {
  				out = response.getOutputStream();
  				byte[] data = new String("fail..").getBytes();
  				out.write(data, 0, data.length);
  			} catch(Exception ignore) {
  				ignore.printStackTrace();
  			} finally {
  				if(out != null) try { out.close(); } catch(Exception ignore) {}
  			}
  		}finally {
  			// 디스크 적었던 임시파일을 제거합니다.
  			wb.dispose();
  			try { wb.close(); } catch(Exception ignore) {}
  		}
  	}
  	
	//읽음 처리 (버튼 클릭)
	@RequestMapping("/cop/bbs/insertReadYn.do")
    public ModelAndView insertReadYn(@RequestParam("checkList") String[] checkList,
    		RedirectAttributes redirectAttributes , ReadVO readVO,  
    		HttpServletRequest request,
    		@RequestParam Map<String, Object> commandMap,
    		Model model) throws Exception {
		LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
    	ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	for(String id:checkList) {
 		    try{
 		    	String[] idSplit = id.split("\\|");
 		    	id = idSplit[0];
 		    	readVO.setMenuNo("2400000");
 		    	readVO.setReadId(id);
 		    	readVO.setLoginId(user.getId());
 		    	ReadVO readYn = readService.selectReadYn(readVO);
 		    	if(readYn == null) {
 		    		readService.insertReadYn(readVO);
 		    	}
 		    	modelAndView.addObject("result", "success");
 		    }catch(Exception e){
 		    	modelAndView.addObject("result", "fail");
 		    }
 	   }
    	return modelAndView;
    }
		
	
	/**
	 * (사용자)자주하는 질문.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 * TotMngListAjax (통합경영공시)
	 */
	@RequestMapping(value= {"/web/cop/bbs/FaqList.do" , 
			"/web/cop/bbs/FaqDetail.do",
			"/web/cop/bbs/FaqListAjax.do"
			} )
	public String selectFaqListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		if("/web/cop/bbs/FaqDetail.do".equals(request.getRequestURI())) { //통합검색시
			boardMasterVO.setUrl("/web/cop/bbs/FaqList.do");
			List<BoardMasterVO>  boardMenuList = bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
			model.addAttribute("boardMenuList", boardMenuList);
			
			if("".equals(boardVO.getBbsId())) { //검색에서 조회시 nttid로 마스터 조회
				BoardMasterVO bmVO = bbsAttrbService.selectBbsIdByNttId(boardVO);
				if (bmVO == null) {
					redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
					return "redirect:/web/main/mainPage.do";
				}
				
				BoardVO searchTotalVO = new BoardVO();
				searchTotalVO.setSearchNttId(boardVO.getNttId());
				searchTotalVO.setBbsId(bmVO.getBbsId());
				model.addAttribute("searchTotalVO", searchTotalVO);
				return "web/cop/bbs/FaqList";
			}	
		}
		
		boardMasterVO.setUrl(request.getRequestURI());
		//메뉴에 등록된 url에 등록된 게시판 조회
		if("/web/cop/bbs/FaqList.do".equals(request.getRequestURI())) { //최초로딩
			List<BoardMasterVO>  boardMenuList = bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
			model.addAttribute("boardMenuList", boardMenuList);
			
			if(0!=boardMenuList.size()) { //원자력 소식은 전체 매뉴 없음.
				BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
				totalBoardMasterVO.setBbsNm("전체");
				boardMenuList.add(0,totalBoardMasterVO) ;
			}
		}
		if("/web/cop/bbs/FaqListAjax.do".equals(request.getRequestURI())) { //게시판 조회
			BoardMasterVO bmVO = new BoardMasterVO();
			PaginationInfo paginationInfo = new PaginationInfo();
			//전체 게시글 불러오기
			Map<String, Object> map = new HashMap<String, Object>();
			if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
				if(boardMasterVO.getPageUnit() != 10) {
					bmVO.setPageUnit(boardMasterVO.getPageUnit());
				}
				boardVO.setPageUnit(bmVO.getPageUnit());
				boardVO.setPageSize(bmVO.getPageSize());
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				
				String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
				boardMasterVO.setUrl(temp.replace("Ajax", ""));
				map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
			}else {
				bmVO.setBbsId(boardVO.getBbsId());
				bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
				//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
				
				if(boardMasterVO.getPageUnit() != 10) {
					bmVO.setPageUnit(boardMasterVO.getPageUnit());
				}
				
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
								
				map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
			}
				
			int totCnt = Integer.parseInt((String) map.get("resultCnt"));

			paginationInfo.setTotalRecordCount(totCnt);
			List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
			for (BoardVO bvo: resultList) {
				Document doc = Jsoup.parse(bvo.getNttCn());
				String text = doc.text();
				bvo.setNttCn2(text);
				
				if(bvo.getAtchFileCnt() > 0) {
					FileVO fileVO = new FileVO();
					fileVO.setAtchFileId(bvo.getAtchFileId());
					List<FileVO> fileList = fileService.selectFileInfs(fileVO);
					bvo.setFileList(fileList);
				}
			}
			
			
			//게시판 마스터 옵션 정보
			BoardMasterVO searchVO = new BoardMasterVO();
			searchVO.setBbsId(boardVO.getBbsId());
			BoardMasterVO bbsMasterInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
			
			model.addAttribute("bbsMasterInfo", bbsMasterInfo);
			model.addAttribute("resultList", resultList);
			model.addAttribute("resultCnt", map.get("resultCnt"));
			model.addAttribute("paginationInfo", paginationInfo);
			return "web/cop/bbs/FaqListAjax";
		}else {
			model.addAttribute("bbsId", "");
		}
		
		return "web/cop/bbs/FaqList";
	}
	
	/**
	 * (사용자) 탭 게시판 통합
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 * 
	 * 
	 * URL 
	 *  /web/cop/bbs/NewsList.do (원자력소식)
	 *  /web/cop/bbs/selectLibList.do (자료실)
	 *  /web/cop/bbs/bussRealList.do (사업실명제)
	 */
	@RequestMapping(value= {"/web/cop/bbs/NewsList.do" 
							, "/web/cop/bbs/NewsListAjax.do"
							, "/web/cop/bbs/LibList.do"
							, "/web/cop/bbs/LibListAjax.do"
							, "/web/cop/bbs/BussRealList.do"
							, "/web/cop/bbs/BussRealListAjax.do"
							, "/web/cop/bbs/TotMngListAjax.do"
							})
	public String selectTabBbsListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		//메뉴에 등록된 url 조회
		boardMasterVO.setUrl(request.getRequestURI());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		if(0!=boardMenuList.size()) { //원자력 소식은 전체 매뉴 없음.
			if(!"9420000".equals(((BoardMasterVO)boardMenuList.get(0)).getMenuNo())) { 
				BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
				totalBoardMasterVO.setBbsNm("전체");
				boardMenuList.add(0,totalBoardMasterVO) ;
			}
		}
		
		if(request.getRequestURI().contains("List.do")){ //최초 로딩 매뉴이름가져오기
			MenuManageVO tempMenuManageVO = new MenuManageVO();
			tempMenuManageVO.setUrl(request.getRequestURI());
			MenuManageVO menuManageVO = menuManageService.selectMenuManageUrl(tempMenuManageVO);
			model.addAttribute("menuManageVO", menuManageVO);
		}
		
		if(request.getRequestURI().contains("ListAjax.do") //하단 리스트
			) { //상세 하단 리스트
			BoardMasterVO bmVO = new BoardMasterVO();
			PaginationInfo paginationInfo = new PaginationInfo();
			//전체 게시글 불러오기
			Map<String, Object> map = new HashMap<String, Object>();
			if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
				boardVO.setPageUnit(bmVO.getPageUnit());
				boardVO.setPageSize(bmVO.getPageSize());
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				
				String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
				boardMasterVO.setUrl(temp.replace("Ajax", ""));
				//전체 게시글 불러오기
				map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
			}else {
				bmVO.setBbsId(boardVO.getBbsId());
				bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
				//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
				
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				//메뉴별 게시글 불러오기
				map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
			}
			int totCnt = Integer.parseInt((String) map.get("resultCnt"));

			paginationInfo.setTotalRecordCount(totCnt);
			
			/*모바일 페이지 5개씩 나오게 하기*/
			PaginationInfo paginationInfoMobile = new PaginationInfo();
				paginationInfoMobile.setCurrentPageNo(paginationInfo.getCurrentPageNo());
				paginationInfoMobile.setTotalRecordCount(paginationInfo.getTotalRecordCount());
				paginationInfoMobile.setPageSize(5);
				paginationInfoMobile.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				model.addAttribute("paginationInfoMobile", paginationInfoMobile);


					
			List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
			for (BoardVO bvo: resultList) {
				Document doc = Jsoup.parse(bvo.getNttCn());
				String text = doc.text();
				bvo.setNttCn2(text);
			}
			model.addAttribute("resultList", resultList);
			model.addAttribute("resultCnt", map.get("resultCnt"));
			model.addAttribute("paginationInfo", paginationInfo);
			if(request.getRequestURI().contains("/web/cop/bbs/QnaListAjax.do")){ //묻고 답하기
				return "web/cop/bbs/QnaListAjax";
			}
			if(request.getRequestURI().contains("/web/cop/bbs/TotMngListAjax.do")){ //통합경영공시
				model.addAttribute("bmVO", bmVO);
				return "web/cop/bbs/TotMngListAjax";
			}
			
			return "web/cop/bbs/CntBbsListAjax";
		}
		model.addAttribute("boardMenuList", boardMenuList);
		model.addAttribute("detailPage", request.getRequestURI().replace("List", "Detail"));
		return "web/cop/bbs/CntBbsList";
	}
	
	

	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/QnaList.do (묻고답하기)
	 */
	@RequestMapping(value= {
			"/web/cop/bbs/QnaListAjax.do"
							})
	public String selectQnaListAjaxWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		
		LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userUniqId = user == null ? "" : EgovStringUtil.isNullToString(user.getUniqId());
		
		if("".equals(userUniqId)) {
			redirectAttributes.addFlashAttribute("message", "로그인 후 이용해 주세요.");
			return "redirect:/web/user/login/login.do";
		}
		
		boardMasterVO.setFrstRegisterId(userUniqId);
		boardVO.setFrstRegisterId(userUniqId);
		
		boardMasterVO.setUrl(request.getRequestURI());
		
		/*
		//메뉴에 등록된 url 조회
		
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		if(0!=boardMenuList.size()) { //묻고답하기
			BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
			totalBoardMasterVO.setBbsNm("전체");
			boardMenuList.add(0,totalBoardMasterVO) ;
		}
		*/
		//상세 하단 리스트
		BoardMasterVO bmVO = new BoardMasterVO();
		PaginationInfo paginationInfo = new PaginationInfo();
		
		if("".equals(boardMasterVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			boardMasterVO.setSearchSortCnd("nttId");
			boardMasterVO.setSearchSortOrd("desc");
		}
		//전체 게시글 불러오기
		Map<String, Object> map = new HashMap<String, Object>();
		//if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
		if("".equals(boardVO.getSeCmmnCdId())){ //전체 게시글 불러오기
			if(boardMasterVO.getPageUnit() != 10) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			boardVO.setPageUnit(bmVO.getPageUnit());
			boardVO.setPageSize(bmVO.getPageSize());
			
			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
			boardMasterVO.setUrl(temp.replace("Ajax", ""));
			
			//답변 조회
			CommentVO commentVO = new CommentVO();
			commentVO.setBbsId(boardVO.getBbsId());
			List<?> commentList = egovArticleCommentService.selectArticleCommentListAllList(commentVO);
			
			int commentCnt = commentList.size();
			model.addAttribute("commentCnt", commentCnt);
			model.addAttribute("commentList", commentList);
			
			//전체 게시글 불러오기
			map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
		}else {
			//bmVO.setBbsId(boardVO.getBbsId());
			bmVO.setBbsId(boardVO.getSeCmmnCdId());
			boardVO.setBbsId(boardVO.getSeCmmnCdId());
			
			bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
			//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
			
			if(boardMasterVO.getPageUnit() != 10) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			
			boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
			boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
			
			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			//답변 조회
			CommentVO commentVO = new CommentVO();
			commentVO.setBbsId(boardVO.getBbsId());
			List<CommentVO> commentList = egovArticleCommentService.selectArticleCommentListAllList(commentVO);
			
			int commentCnt = commentList.size();
			model.addAttribute("commentCnt", commentCnt);
			model.addAttribute("commentList", commentList);
			
			//메뉴별 게시글 불러오기
			map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
		}
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));

		paginationInfo.setTotalRecordCount(totCnt);
		
		List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
		for (BoardVO bvo: resultList) {
			Document doc = Jsoup.parse(bvo.getNttCn());
			String text = doc.text();
			bvo.setNttCn2(text);
		}
		model.addAttribute("resultList", resultList);
		model.addAttribute("resultCnt", totCnt);
		model.addAttribute("paginationInfo", paginationInfo);
		if(request.getRequestURI().contains("/web/cop/bbs/QnaListAjax.do")){ //묻고 답하기
			return "web/cop/bbs/QnaListAjax";
		}
		
		return "web/cop/bbs/QnaListAjax";
	}
	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/NoticeList.do (공지사항)
	 */
	@RequestMapping(value= {"web/cop/bbs/NoticeList.do"})
	public String selectNoticeListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		//메뉴에 등록된 url 조회
		boardMasterVO.setUrl(request.getRequestURI());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		//List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : boardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		//게시판 메뉴 리스트
		if(0!=boardMenuList.size()) { //공지사항
			BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
			totalBoardMasterVO.setBbsNm("전체");
			boardMenuList.add(0,totalBoardMasterVO) ;
		}		
			
		model.addAttribute("boardMenuList", boardMenuList);
		model.addAttribute("detailPage", request.getRequestURI().replace("List", "Detail"));		
		
		return "web/cop/bbs/NoticeList";
	}
	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/SuggestList.do (불편신고)
	 */
	@RequestMapping(value= {"web/cop/bbs/SuggestList.do"})
	public String selectSuggestListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userUniqId = user == null ? "" : EgovStringUtil.isNullToString(user.getUniqId());
		
		if("".equals(userUniqId)) {
			redirectAttributes.addFlashAttribute("message", "로그인 후 이용해 주세요.");
			return "redirect:/web/user/login/login.do";
		}
		
		//메뉴에 등록된 url 조회
		boardMasterVO.setUrl(request.getRequestURI());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		//List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : boardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		//게시판 메뉴 리스트
		if(0!=boardMenuList.size()) { //공지사항
			BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
			totalBoardMasterVO.setBbsNm("전체");
			boardMenuList.add(0,totalBoardMasterVO) ;
		}		
			
		model.addAttribute("boardMenuList", boardMenuList);
		model.addAttribute("detailPage", request.getRequestURI().replace("List", "Detail"));		
		
		return "web/cop/bbs/SuggestList";
	}
	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/SuggestList.do (불편신고)
	 */
	@RequestMapping(value= {
			"/web/cop/bbs/SuggestListAjax.do"
							})
	public String selectSuggestListAjaxWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		
		LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userUniqId = user == null ? "" : EgovStringUtil.isNullToString(user.getUniqId());
		
		if("".equals(userUniqId)) {
			redirectAttributes.addFlashAttribute("message", "로그인 후 이용해 주세요.");
			return "redirect:/web/user/login/login.do";
		}
		
		boardMasterVO.setFrstRegisterId(userUniqId);
		boardVO.setFrstRegisterId(userUniqId);
		
		boardMasterVO.setUrl(request.getRequestURI());
		
		/*
		//메뉴에 등록된 url 조회
		
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		if(0!=boardMenuList.size()) { //묻고답하기
			BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
			totalBoardMasterVO.setBbsNm("전체");
			boardMenuList.add(0,totalBoardMasterVO) ;
		}
		*/
		//상세 하단 리스트
		BoardMasterVO bmVO = new BoardMasterVO();
		PaginationInfo paginationInfo = new PaginationInfo();
		
		if("".equals(boardMasterVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			boardMasterVO.setSearchSortCnd("nttId");
			boardMasterVO.setSearchSortOrd("desc");
		}
		//전체 게시글 불러오기
		Map<String, Object> map = new HashMap<String, Object>();
		//if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
		if("".equals(boardVO.getSeCmmnCdId())){ //전체 게시글 불러오기
			if(boardMasterVO.getPageUnit() != 10) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			boardVO.setPageUnit(bmVO.getPageUnit());
			boardVO.setPageSize(bmVO.getPageSize());
			
			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
			boardMasterVO.setUrl(temp.replace("Ajax", ""));
			
			//답변 조회
			CommentVO commentVO = new CommentVO();
			commentVO.setBbsId(boardVO.getBbsId());
			List<?> commentList = egovArticleCommentService.selectArticleCommentListAllList(commentVO);
			
			int commentCnt = commentList.size();
			model.addAttribute("commentCnt", commentCnt);
			model.addAttribute("commentList", commentList);
			
			//전체 게시글 불러오기
			map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
		}else {
			//bmVO.setBbsId(boardVO.getBbsId());
			bmVO.setBbsId(boardVO.getSeCmmnCdId());
			boardVO.setBbsId(boardVO.getSeCmmnCdId());
			
			bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
			//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
			
			if(boardMasterVO.getPageUnit() != 10) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			
			boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
			boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
			
			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			//답변 조회
			CommentVO commentVO = new CommentVO();
			commentVO.setBbsId(boardVO.getBbsId());
			List<CommentVO> commentList = egovArticleCommentService.selectArticleCommentListAllList(commentVO);
			
			int commentCnt = commentList.size();
			model.addAttribute("commentCnt", commentCnt);
			model.addAttribute("commentList", commentList);
			
			//메뉴별 게시글 불러오기
			map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
		}
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));

		paginationInfo.setTotalRecordCount(totCnt);
		
		List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
		for (BoardVO bvo: resultList) {
			Document doc = Jsoup.parse(bvo.getNttCn());
			String text = doc.text();
			bvo.setNttCn2(text);
		}
		model.addAttribute("resultList", resultList);
		model.addAttribute("resultCnt", totCnt);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "web/cop/bbs/SuggestListAjax";
	}
	
	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/QnaList.do (묻고답하기)
	 */
	@RequestMapping(value= {
			"web/cop/bbs/QnaList.do"
			
							})
	public String selectQnaListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		String userUniqId = user == null ? "" : EgovStringUtil.isNullToString(user.getUniqId());
		
		if("".equals(userUniqId)) {
			//redirectAttributes.addFlashAttribute("message", "문자온 서비스는 로그인 후 이용 가능합니다.");
			return "redirect:/web/user/login/login.do";
		}
		
		boardMasterVO.setFrstRegisterId(userUniqId);
		boardVO.setFrstRegisterId(userUniqId);
		
		//메뉴에 등록된 url 조회
		boardMasterVO.setUrl(request.getRequestURI());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		//List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : boardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		if(0!=boardMenuList.size()) { //묻고답하기
			BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
			totalBoardMasterVO.setBbsNm("전체");
			boardMenuList.add(0,totalBoardMasterVO) ;
		}
			
		model.addAttribute("boardMenuList", boardMenuList);
		model.addAttribute("detailPage", request.getRequestURI().replace("List", "Detail"));
		
		return "web/cop/bbs/QnaList";
	}
	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/NoticeListAjax.do (공지사항 - 내용)
	 */
	@RequestMapping(value= {			
							"/web/cop/bbs/NoticeListAjax.do"
							})
	public String selectNoticeListAjaxWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO
			) throws Exception {
		
		//step1.현재 url을 저장한다.(?)
		//step2.현재 url의 게시판 리스트 정보를 가져온다.
		//step3.현재 url의 게시판 리스트 정보를 가져온다.
		
		boardMasterVO.setUrl(request.getRequestURI());
		
		//메뉴에 등록된 url 조회
		/*
		boardMasterVO.setUrl(request.getRequestURI());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		//게시판 메뉴 리스트
		if(0!=boardMenuList.size()) { //공지사항
			BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
			totalBoardMasterVO.setBbsNm("전체");
			boardMenuList.add(0,totalBoardMasterVO) ;
		}
		*/
		
		
		BoardMasterVO bmVO = new BoardMasterVO();
		PaginationInfo paginationInfo = new PaginationInfo();
		
		if("".equals(boardMasterVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			boardMasterVO.setSearchSortCnd("nttId");
			boardMasterVO.setSearchSortOrd("desc");
		}
		
		
		//전체 게시글 불러오기
		Map<String, Object> map = new HashMap<String, Object>();
		if("".equals(boardVO.getSeCmmnCdId())){ //전체 게시글 불러오기
		//if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
			if(boardMasterVO.getPageUnit() != 10) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			boardVO.setPageUnit(bmVO.getPageUnit());
			boardVO.setPageSize(bmVO.getPageSize());
			
			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
			boardMasterVO.setUrl(temp.replace("Ajax", ""));
			
			//전체 게시글 불러오기
			map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
		}else {
			
			System.out.println("boardVO.getSeCmmnCdId()");
			System.out.println(boardVO.getSeCmmnCdId());
			
			//bmVO.setBbsId(boardVO.getBbsId());
			bmVO.setBbsId(boardVO.getSeCmmnCdId());
			boardVO.setBbsId(boardVO.getSeCmmnCdId());
			
			bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
			//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
			
			if(boardMasterVO.getPageUnit() != 10) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			
			boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
			boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
			
			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
			
			//메뉴별 게시글 불러오기
			map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
		}
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));

		paginationInfo.setTotalRecordCount(totCnt);
		
		List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
		for (BoardVO bvo: resultList) {
			Document doc = Jsoup.parse(bvo.getNttCn());
			String text = doc.text();
			bvo.setNttCn2(text);
		}
		model.addAttribute("resultList", resultList);
		model.addAttribute("resultCnt", map.get("resultCnt"));
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "web/cop/bbs/NoticeListAjax";
	}
	
	/**
	 * (사용자)이벤트 게시판(포토형 탭게시판).
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 * 
	 */
	@RequestMapping(value= {
			"/web/cop/bbs/EventList.do" 
			} )
	public String selectEventListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		boardMasterVO.setUrl(request.getRequestURI());
		//메뉴에 등록된 url에 등록된 게시판 조회
		if("/web/cop/bbs/EventList.do".equals(request.getRequestURI())) { //최초로딩
			List<BoardMasterVO>  boardMenuList = bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
			model.addAttribute("boardMenuList", boardMenuList);

			if(0!=boardMenuList.size()) {
				//BoardMasterVO totalBoardMasterVO1 = new BoardMasterVO();
				//totalBoardMasterVO1.setBbsNm("전체");
				//totalBoardMasterVO1.setBbsId(boardMenuList.get(0).getBbsId());
				//boardMenuList.add(0,totalBoardMasterVO1) ;
			
				BoardMasterVO totalBoardMasterVO2 = new BoardMasterVO();
				totalBoardMasterVO2.setBbsNm("종료된 이벤트");
				totalBoardMasterVO2.setBbsId(boardMenuList.get(0).getBbsId());
				boardMenuList.add(boardMenuList.size(),totalBoardMasterVO2) ;
				
			}			
		}
		
		//model.addAttribute("bbsId", "");
		model.addAttribute("detailPage", request.getRequestURI().replace("List", "Detail"));
		
		return "web/cop/bbs/EventList";
	}
	

	/**
	 * (사용자)이벤트 게시판(포토형 탭게시판).
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 * 
	 */
	@RequestMapping(value= { 
			"/web/cop/bbs/EventListAjax.do"
			} )
	public String selectEventListAjaxWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO
			) throws Exception {
		
		
		boardMasterVO.setUrl(request.getRequestURI());

		

		BoardMasterVO bmVO = new BoardMasterVO();
		PaginationInfo paginationInfo = new PaginationInfo();
		//전체 게시글 불러오기
		Map<String, Object> map = new HashMap<String, Object>();
		
		//종료
		if("End".equals(boardVO.getBbsId())) {
			//}else if("End".equals(boardVO.getSeCmmnCdId())) {
				//boardVO.setBbsId("BBSMSTR_000000000731");
				//bmVO.setBbsId(boardVO.getBbsId());
				
				boardVO.setBbsId(boardVO.getSeCmmnCdId());
				bmVO.setBbsId(boardVO.getSeCmmnCdId());
				
				bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
				//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
				
				if(boardMasterVO.getPageUnit() != 10) {
					bmVO.setPageUnit(boardMasterVO.getPageUnit());
				}
				
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
								
				/*map = bbsMngService.selectBoardArticlesWeb(boardVO, null);*/
				map = bbsMngService.selectBoardArticlesWebEventEnd(boardVO, null);
				
			}else if("Ing".equals(boardVO.getBbsId())) {
				//bmVO.setBbsId(boardVO.getBbsId());
				boardVO.setBbsId(boardVO.getSeCmmnCdId());
				bmVO.setBbsId(boardVO.getSeCmmnCdId());
				
				bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
				//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
				
				if(boardMasterVO.getPageUnit() != 10) {
					bmVO.setPageUnit(boardMasterVO.getPageUnit());
				}
				
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
								
				map = bbsMngService.selectBoardArticlesWebEvent(boardVO, null);
				
			}else {	//전체
				//if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
				if(boardMasterVO.getPageUnit() != 10) {
					bmVO.setPageUnit(boardMasterVO.getPageUnit());
				}
				boardVO.setPageUnit(bmVO.getPageUnit());
				boardVO.setPageSize(bmVO.getPageSize());
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				
				String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
				boardMasterVO.setUrl(temp.replace("Ajax", ""));
				/*map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);*/
				map = bbsMngService.selectBoardArticlesWebUrlEventAll(boardMasterVO, null);
				
			}
			
		int totCnt = Integer.parseInt((String) map.get("resultCnt"));

		paginationInfo.setTotalRecordCount(totCnt);
		List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
		for (BoardVO bvo: resultList) {
			Document doc = Jsoup.parse(bvo.getNttCn());
			String text = doc.text();
			bvo.setNttCn2(text);
			
			if(bvo.getAtchFileCnt() > 0) {
				FileVO fileVO = new FileVO();
				fileVO.setAtchFileId(bvo.getAtchFileId());
				List<FileVO> fileList = fileService.selectFileInfs(fileVO);
				bvo.setFileList(fileList);
			}
		}
		
		if (("BBST05").equals(bmVO.getBbsTyCode())){ //사진게시판 8개씩 9개조회후 9개면 더보기
			if(boardMasterVO.getPageUnit() != 9) {
				bmVO.setPageUnit(boardMasterVO.getPageUnit());
			}
			boardVO.setRecordCountPerPage(9); //리스트 수 
			boardVO.setFirstIndex( (boardVO.getPageIndex()-1)*9); //offset
			paginationInfo.setRecordCountPerPage(boardVO.getRecordCountPerPage()); //웹 접근성 획득 후 롤백
		}
		
		if("BBST05".equals(bmVO.getBbsTyCode())){
			boardVO.setSearchSortCnd("FRST_REGIST_PNTTM");
			boardVO.setSearchSortOrd("desc");
		}
		
		//게시판 마스터 옵션 정보
		BoardMasterVO searchVO = new BoardMasterVO();
		searchVO.setBbsId(boardVO.getBbsId());
		BoardMasterVO bbsMasterInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
		
		model.addAttribute("bbsMasterInfo", bbsMasterInfo);
		model.addAttribute("resultList", resultList);
		model.addAttribute("resultCnt", totCnt);
		model.addAttribute("paginationInfo", paginationInfo);
		return "web/cop/bbs/EventListAjax";
		
		
		//model.addAttribute("detailPage", request.getRequestURI().replace("List", "Detail"));
		
		//return "web/cop/bbs/EventList";
	}
	
	/**
	 * (사용자)게시물에 대한 상세 정보를 조회한다.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {
				"/web/cop/bbs/EventDetail.do"
				} )
	public String selectBoardEventDetailWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, 
			BoardMasterVO masterVO,
			ModelMap model,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes) throws Exception {
		
		
		//XSS 태그 필터링 처리
		boardVO.setBbsId(unscript(boardVO.getBbsId()));
		boardVO.setSeCmmnCdId(unscript(boardVO.getSeCmmnCdId()));
		boardVO.setFrstRegisterId(unscript(boardVO.getFrstRegisterId()));
		boardVO.setSearchBgnDe(unscript(boardVO.getSearchBgnDe()));
		boardVO.setSearchEndDe(unscript(boardVO.getSearchEndDe()));
		boardVO.setSearchSortCnd(unscript(boardVO.getSearchSortCnd()));
		boardVO.setSearchSortOrd(unscript(boardVO.getSearchSortOrd()));
		boardVO.setSearchCnd(unscript(boardVO.getSearchCnd()));
		boardVO.setSearchWrd(unscript(boardVO.getSearchWrd()));
		
		
		BoardMasterVO bmVO = new BoardMasterVO();
		if("".equals(boardVO.getBbsId())) { //검색에서 조회시 nttid로 마스터 조회
			bmVO = bbsAttrbService.selectBbsIdByNttId(boardVO);
			if (bmVO == null) {
				redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
				return "redirect:/web/main/mainPage.do";
			}
			boardVO.setBbsId(bmVO.getBbsId());
		}else {
			bmVO.setBbsId(boardVO.getBbsId());
		}
			
		bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
		if("/web/cop/bbs/NewsDetail.do".equals(request.getRequestURI()) || "/web/contentBbsDetail.do".equals(request.getRequestURI())) { //원자력소식 수정삭제등록 없음.
			bmVO.setWebChgYn("N");
			model.addAttribute("masterVO", masterVO);
		}
		
		BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
		if (bmVO == null || ("N").equals(bmVO.getUseAt())) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.imposbl"));
			return "redirect:/web/main/mainPage.do";
		}
		
		{//묻고답하기 권한체크
			boolean passChk = false; 
			if("9530000".equals(bmVO.getMenuNo())) {
				LoginVO loginVO  =  new LoginVO();
				if(!"anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) { //최고 관리자면 바로수정
		         	loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		         	if("ROLE_ADMIN".equals(loginVO.getAuthority())){
		         		passChk = true;
		         	}else { //일반관리자
		         		bmVO.setBbsMngId(loginVO.getId());
		         		if( bbsAttrbService.selectBBSMngInfCnt(bmVO) > 0 ) { //게시판 관리자 조회
		         			passChk = true;
		        		}
		         	}
		        }else{//방문자 세션있는방문자
		        	UserVO userVO = new UserVO();
		    		if(request.getSession().getAttribute("userVO") != null) {
		    			userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
		    			if(userVO.getMblDn().equals(bdVO.getMblDn())) {
		    				passChk = true;
		    			}
		    		}	
		        }
				if(!"T".equals(bdVO.getSecretAt())){
					if(!passChk){
						if("".equals(boardVO.getPassword())) {
							redirectAttributes.addFlashAttribute("message", "패스워드를 넣어주세요");
							return "redirect:/web/cop/bbs/QnaList.do";
						}else {
							if(!damoDec(bdVO.getPassword(), request).equals(boardVO.getPassword())) {
								redirectAttributes.addFlashAttribute("message", "패스워드가 맞지 않습니다.");
								if("9530000".equals(bmVO.getMenuNo())) {
									return "redirect:/web/cop/bbs/QnaList.do";
								}else {
									return "redirect:/web/cop/bbsWeb/selectBoardList.do?bbsId="+boardVO.getBbsId();
								}
							}
						}
					}
				}
				
			}
		}
		
		// 조회수 증가 여부 지정
		boardVO.setPlusCount(true);
		bbsMngService.updateBoardArticleInqireCo(boardVO);
		
		boardVO.setMblDn(bdVO.getMblDn());
		
		// 위/아래 게시글 번호, 제목 조회
		EgovMap upDownNttid =  bbsMngService.getUpDownNttIdNSj(boardVO);
		
		//게시판 마스터 옵션 정보
		BoardMasterVO searchVO = new BoardMasterVO();
		searchVO.setBbsId(boardVO.getBbsId());
		BoardMasterVO resultBbsMsInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
		
		//답변글 리스트
		if(bdVO.getAnswerCnt() > 0) {
			List<BoardVO> answerList = bbsMngService.selectBoardAnswerList(bdVO);
			model.addAttribute("answerList", answerList);
		}
		
		System.out.println("boardVO.toString()");
		System.out.println("getNtceBgnde");
		System.out.println(bdVO.getNiceFailUrl());
		System.out.println(bdVO.getNiceSuccUrl());
		
		if ("1".equals(bdVO.getNiceFailUrl()) 			//s-date
				&& "1".equals(bdVO.getNiceSuccUrl())	//e-date
				) {
			bmVO.setBbsNm("진행전");
		}else if ("-1".equals(bdVO.getNiceFailUrl()) 			//s-date
				&& "-1".equals(bdVO.getNiceSuccUrl())	//e-date
				) {
			bmVO.setBbsNm("종료");
		}else {
			bmVO.setBbsNm("진행중");
		}
		
		
		model.addAttribute("nextNttIdNSj", upDownNttid.get("nextNttIdNSj"));
		model.addAttribute("prevNttIdNSj", upDownNttid.get("prevNttIdNSj"));
		model.addAttribute("result", bdVO);
		model.addAttribute("brdMstrVO", bmVO);
		model.addAttribute("resultBbsMsInfo", resultBbsMsInfo);
		
		CommentVO commentVO = new CommentVO();
		commentVO.setBbsId(boardVO.getBbsId());		//게시판ID
		commentVO.setNttId(boardVO.getNttId());		//게시글ID
		
		//댓글 조회
		List<?> resultList = egovArticleCommentService.selectArticleCommentListAll(commentVO);
		int totCnt = resultList.size();
		
		model.addAttribute("resultCnt", totCnt);
		model.addAttribute("resultList", resultList);
		
		if("BBST05".equals(bmVO.getBbsTyCode())){ //이벤트 포토게시판
			if(bdVO.getAtchFileCnt() > 0 ) {
				FileVO fileVO = new FileVO();
				fileVO.setAtchFileId(bdVO.getAtchFileId());
				List<FileVO> result = fileService.selectImageFileList(fileVO);
				model.addAttribute("fileList", result);
			}
			

			

			
			
			
			//masterVO.setBbsNm(bbsNm);
			
			
			return "web/cop/bbs/EgovNoticePhotoInqire";
		}
		
		if("Y".equals(masterVO.getTabBbsId())){
			model.addAttribute("PubDetail", true);
		}

		return "web/cop/bbs/EgovNoticeInqire";
	}
	
	/**
	 * 
	 * URL 
	 *  /web/cop/bbs/TermsList.do (공지사항)
	 */
	@RequestMapping(value= {"web/cop/bbs/TermsList.do"
							, "/web/cop/bbs/TermsListAjax.do"
							})
	public String selectNoticeListWeb(HttpServletRequest request, 
		@ModelAttribute("searchVO") TermsVO termsVO, ModelMap model , 
		RedirectAttributes redirectAttributes) throws Exception {
		
		
		//상세 하단 리스트
		if(request.getRequestURI().contains("ListAjax.do")) { 

			// 공통
			List<TermsVO> resultList = new ArrayList<TermsVO>();			
			
			// 이용약관, 개인정보보호방침 이전버전 List
			TermsVO termsVO2 = new TermsVO();
			termsVO2.setFirstIndex(0);
			termsVO2.setRecordCountPerPage(20);
			termsVO2.setSearchDiv(termsVO.getMenuNm());
			termsVO2.setSearchUseYn("N");			
			termsVO2.setSearchSortCnd("effectDate");
			termsVO2.setSearchSortOrd("desc");
			List<TermsVO> termsMastList = egovSiteManagerService.selectTermsMastMngBeforeList(termsVO2);
			model.addAttribute("termsMastList", termsMastList);
			
			// NEW
			// 이용약관, 개인정보보호방침 최신버전 List
			TermsVO termsVO3 = new TermsVO();
			termsVO3.setFirstIndex(0);
			termsVO3.setRecordCountPerPage(1);
			termsVO3.setSearchDiv(termsVO.getMenuNm());
			termsVO3.setSearchUseYn("Y");			
			termsVO3.setSearchSortCnd("effectDate");
			termsVO3.setSearchSortOrd("desc");
			List<TermsVO> termsMastList2 = egovSiteManagerService.selectTermsMastMngList(termsVO3);
			if (termsMastList2.size() > 0) {
				TermsVO termsVO4 = new TermsVO();
				termsVO4.setFirstIndex(0);
				termsVO4.setRecordCountPerPage(20);				
				termsVO4.setTermsMastNo(termsMastList2.get(0).getTermsMastNo());
				termsVO4.setSearchUseYn("Y");
				termsVO4.setSearchSortCnd("sort");
				termsVO4.setSearchSortOrd("ASC");		
				resultList = egovSiteManagerService.selectTermsSubMngList(termsVO4);				
			}
			
			// 불법스팸방지안내
			if (termsVO.getMenuNm().equals("04")) {
				termsVO.setSearchSortCnd("TERMS_ID");
				termsVO.setSearchSortOrd("ASC");
				resultList = egovSiteManagerService.selectTermsMenu(termsVO);
			}
			
			model.addAttribute("resultList", resultList);
			
			return "web/cop/bbs/TermsListAjax";
		}
		else {
			String effectDate_02 = "";
			String effectDate_03 = "";
			TermsVO termsVO7 = new TermsVO();
			termsVO7.setFirstIndex(0);
			termsVO7.setRecordCountPerPage(2);
			termsVO7.setSearchUseYn("Y");			
			termsVO7.setSearchSortCnd("effectDate");
			termsVO7.setSearchSortOrd("desc");
			List<TermsVO> termsMastList7 = egovSiteManagerService.selectTermsMastMngList(termsVO7);
			for(TermsVO item : termsMastList7) {
				if (item.getTermsDivCode().equals("02")) {
					effectDate_02 = "(" + item.getEffectDate() + ")";
				}
				if (item.getTermsDivCode().equals("03")) {
					effectDate_03 = "(" + item.getEffectDate() + ")";					
				}
			}
			
			model.addAttribute("effectDate_02", effectDate_02);
			model.addAttribute("effectDate_03", effectDate_03);
		}
		
		return "web/cop/bbs/TermsList";
	}
	
	

	@RequestMapping(value= {"/web/cop/bbs/TermsHistPopAjax.do"})
	public String TermsHistPop(HttpServletRequest request, 
		@ModelAttribute("searchVO") TermsVO termsVO, ModelMap model) throws Exception {
		
		List<TermsVO> resultList = new ArrayList<TermsVO>();

		termsVO.setSearchSortCnd("TERMS_ID");
		termsVO.setSearchSortOrd("ASC");
		resultList = egovSiteManagerService.selectTermsMenu(termsVO);
		
		// New
		/*
		termsVO.setSearchSortCnd("sort");
		termsVO.setSearchSortOrd("ASC");		
		resultList = egovSiteManagerService.selectTermsSubMngList(termsVO);
		*/		
		
		model.addAttribute("resultList", resultList);
		
		return "web/cop/bbs/TermsHistPopAjax";
	}	
	
	// 이용약관 메일 발송 테스트
	@RequestMapping(value = "/web/cop/bbs/TermsHistSendEmailAjax.do")
	public ModelAndView ignoreIpCntAjax(
			@ModelAttribute("searchVO") TermsVO termsVO
			, HttpServletRequest request) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";

        try {
        	// 이용약관 회원 전체발송
        	//mjonNoticeSendUtil.userAllTermsEmailSend();
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
	}	    		
	
	
	/**
	 * (사용자)사전정보공표.
	 *
	 * @param boardVO
	 * @param sessionVO
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value= {"/web/cop/bbs/PubOperList.do" 
			,"/web/cop/bbs/PubOperMainAjax.do"
			,"/web/cop/bbs/PubOperListAjax.do"
			,"/web/cop/bbs/PubOperSubListAjax.do"
			,"/web/cop/bbs/PubOperSubDetailListAjax.do"
			})
	public String selectPubOperList(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {

		//메뉴에 등록된 url 조회
		boardMasterVO.setUrl(request.getRequestURI());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		
		if("/web/cop/bbs/PubOperMainAjax.do".equals(request.getRequestURI())){ //사전정보공표 최초 로딩
			BoardMasterVO mainMasterVO = new BoardMasterVO();
			mainMasterVO.setFirstIndex(0);
			mainMasterVO.setLastIndex(20);
			mainMasterVO.setRecordCountPerPage(30);
			
			mainMasterVO.setBbsTyCode("BBST07");
			mainMasterVO.setUseAt("Y"); //사용만
			
			mainMasterVO.setSearchSortCnd("BBS_SORT");
			mainMasterVO.setSearchSortOrd("ASC");
			mainMasterVO.setSeCmmnCdId("01"); //기관운영관련정보
			Map<String, Object> map01 = bbsAttrbService.selectBBSMasterInfs(mainMasterVO);
			model.addAttribute("resultList01", map01.get("resultList"));
			
			mainMasterVO.setSeCmmnCdId("02"); //주요사업정보
			Map<String, Object> map02 = bbsAttrbService.selectBBSMasterInfs(mainMasterVO);
			model.addAttribute("resultList01", map01.get("resultList"));
			model.addAttribute("resultList02", map02.get("resultList"));
			return "web/cop/bbs/PubOperMainAjax";
		}
		
		if("/web/cop/bbs/PubOperListAjax.do".equals(request.getRequestURI())){ //사전정보공표 리스트
			BoardMasterVO mainMasterVO = new BoardMasterVO();
			mainMasterVO.setFirstIndex(0);
			mainMasterVO.setLastIndex(20);
			mainMasterVO.setRecordCountPerPage(30);
			mainMasterVO.setBbsTyCode("BBST07");
			mainMasterVO.setUseAt("Y"); //사용만
			Map<String, Object> mapMain = bbsAttrbService.selectBBSMasterInfs(mainMasterVO);
			
			
			BoardMasterVO bmVO = new BoardMasterVO();
			bmVO.setBbsId(boardVO.getBbsId());
			bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
			UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
			
			if(bmVO != null) {
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
			}
			
			PaginationInfo paginationInfo = new PaginationInfo();

			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

			//전체 게시글 불러오기
			Map<String, Object> map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
			int totCnt = Integer.parseInt((String) map.get("resultCnt"));

			paginationInfo.setTotalRecordCount(totCnt);
			List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
			for (BoardVO bvo: resultList) {
				Document doc = Jsoup.parse(bvo.getNttCn());
				String text = doc.text();
				bvo.setNttCn2(text);
			}
			
			//게시판 마스터 옵션 정보
			BoardMasterVO searchVO = new BoardMasterVO();
			searchVO.setBbsId(boardVO.getBbsId());
			BoardMasterVO bbsMasterInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
			
			List<BoardMasterVO> mapMainList = new ArrayList<BoardMasterVO>();
			mapMainList = (List<BoardMasterVO>)mapMain.get("resultList") ;
			for(BoardMasterVO tempVO : mapMainList ) {
				if(tempVO.getBbsId().equals(bbsMasterInfo.getBbsId())) {
					tempVO.setSelectedFlag(true);
				}
			}
			model.addAttribute("resultMainList", mapMain.get("resultList"));
			
			model.addAttribute("bbsMasterInfo", bbsMasterInfo);
			model.addAttribute("resultList", resultList);
			model.addAttribute("resultCnt", map.get("resultCnt"));
			model.addAttribute("paginationInfo", paginationInfo);
			return "web/cop/bbs/PubOperListAjax";
		}
		
		if("/web/cop/bbs/PubOperSubListAjax.do".equals(request.getRequestURI())){ //사전정보공표 바로가기
			BoardMasterVO mainMasterVO = new BoardMasterVO();
			mainMasterVO.setFirstIndex(0);
			mainMasterVO.setLastIndex(20);
			mainMasterVO.setRecordCountPerPage(30);
			mainMasterVO.setBbsTyCode("BBST07");
			mainMasterVO.setUseAt("Y"); //사용만
			Map<String, Object> mapMain = bbsAttrbService.selectBBSMasterInfs(mainMasterVO);
			
			
			BoardMasterVO bmVO = new BoardMasterVO();
			bmVO.setBbsId(boardVO.getBbsId());
			bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
			UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
			
			if(bmVO != null) {
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
			}
			
			PaginationInfo paginationInfo = new PaginationInfo();

			paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
			paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
			paginationInfo.setPageSize(boardVO.getPageSize());

			boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
			boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
			boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

			//전체 게시글 불러오기
			Map<String, Object> map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
			int totCnt = Integer.parseInt((String) map.get("resultCnt"));

			paginationInfo.setTotalRecordCount(totCnt);
			List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
			for (BoardVO bvo: resultList) {
				Document doc = Jsoup.parse(bvo.getNttCn());
				String text = doc.text();
				bvo.setNttCn2(text);
			}
			
			//게시판 마스터 옵션 정보
			BoardMasterVO searchVO = new BoardMasterVO();
			searchVO.setBbsId(boardVO.getBbsId());
			BoardMasterVO bbsMasterInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
			
			List<BoardMasterVO> mapMainList = new ArrayList<BoardMasterVO>();
			mapMainList = (List<BoardMasterVO>)mapMain.get("resultList") ;
			for(BoardMasterVO tempVO : mapMainList ) {
				if(tempVO.getBbsId().equals(boardMasterVO.getTabBbsId())) { //탭에서 가져온 상단 tabBbsId
					tempVO.setSelectedFlag(true);
				}
			}
			model.addAttribute("resultMainList", mapMain.get("resultList"));
			
			model.addAttribute("bbsMasterInfo", bbsMasterInfo);
			model.addAttribute("subBbsNm", bbsMasterInfo.getBbsNm());
			model.addAttribute("resultList", resultList);
			model.addAttribute("resultCnt", map.get("resultCnt"));
			model.addAttribute("paginationInfo", paginationInfo);
			//return "web/cop/bbs/PubOperListAjax";
			
			BoardVO boardTabVO =  bbsMngService.selectBbsTabIdByPubUrl(boardVO);
			model.addAttribute("boardTabVO", boardTabVO);
			return "web/cop/bbs/PubOperSubListAjax";
		}
		
		if("/web/cop/bbs/PubOperSubDetailListAjax.do".equals(request.getRequestURI())){ //사전정보공표 바로가기
			// 조회수 증가 여부 지정
			boardVO.setPlusCount(true);
			bbsMngService.updateBoardArticleInqireCo(boardVO);
			
			// 위/아래 게시글 번호, 제목 조회
			EgovMap upDownNttid =  bbsMngService.getUpDownNttIdNSj(boardVO);
			
			//게시판 마스터 옵션 정보
			BoardMasterVO searchVO = new BoardMasterVO();
			searchVO.setBbsId(boardVO.getBbsId());
			BoardMasterVO resultBbsMsInfo = bbsAttrbService.selectBBSMasterInf(searchVO);
			
			
			BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
			
			model.addAttribute("nextNttIdNSj", upDownNttid.get("nextNttIdNSj"));
			model.addAttribute("prevNttIdNSj", upDownNttid.get("prevNttIdNSj"));
			model.addAttribute("brdMstrVO", resultBbsMsInfo);
			model.addAttribute("result", bdVO);
			return "web/cop/bbs/PubOperSubDetailListAjax";
		}
		
		if("Y".equals(boardVO.getPubDetail())){
			model.addAttribute("pubDetail", true);
			return "web/cop/bbs/PubOperList";
		}
		
		if(null !=boardVO.getBbsId() && !"".equals(boardVO.getBbsId() )) {
			return "web/cop/bbs/PubOperSubList";
		}
		return "web/cop/bbs/PubOperList";
	}
	
	/**
	 * 시간을 LIST를 반환한다.
	 * @return  List
	 * @throws
	 */
	@SuppressWarnings("unused")
	private List<ComDefaultCodeVO> getTimeHH() {
		ArrayList<ComDefaultCodeVO> listHH = new ArrayList<ComDefaultCodeVO>();
		HashMap<?, ?> hmHHMM;
		for (int i = 0; i <= 24; i++) {
			String sHH = "";
			String strI = String.valueOf(i);
			if (i < 10) {
				sHH = "0" + strI;
			} else {
				sHH = strI;
			}

			ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
			codeVO.setCode(sHH);
			codeVO.setCodeNm(sHH);

			listHH.add(codeVO);
		}

		return listHH;
	}

	/**
	 * 분을 LIST를 반환한다.
	 * @return  List
	 * @throws
	 */
	@SuppressWarnings("unused")
	private List<ComDefaultCodeVO> getTimeMM() {
		ArrayList<ComDefaultCodeVO> listMM = new ArrayList<ComDefaultCodeVO>();
		HashMap<?, ?> hmHHMM;
		for (int i = 0; i <= 60; i++) {

			String sMM = "";
			String strI = String.valueOf(i);
			if (i < 10) {
				sMM = "0" + strI;
			} else {
				sMM = strI;
			}

			ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
			codeVO.setCode(sMM);
			codeVO.setCodeNm(sMM);

			listMM.add(codeVO);
		}
		return listMM;
	}

	
	/**
	 * (사용자) 컨텐츠 게시판 통합
	 *
	 * URL 
	 *  /web/cop/bbs/CntBbsListAjax (상단 검색부분 없는 리스트)
	 *  /web/cop/bbs/CntBbs01ListAjax.do(상단 검색부분 있는 리스트) 01타입
	 */
	@RequestMapping(value= {"/web/cop/bbs/CntBbsList.do" 
							, "/web/cop/bbs/CntBbsListAjax.do"
							, "/web/cop/bbs/CntBbs01ListAjax.do"
							})
	public String selectCntBbsListWeb(HttpServletRequest request, 
			@ModelAttribute("searchVO") BoardMasterVO boardMasterVO, ModelMap model , BoardVO boardVO ,
			RedirectAttributes redirectAttributes) throws Exception {
		
		//메뉴에 등록된 url 조회
		boardMasterVO.setUrl("/web/content.do?proFn?="+boardMasterVO.getMenuNm());
		List<BoardMasterVO>  boardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		List<BoardMasterVO>  viewBoardMenuList =  bbsAttrbService.selectBBSMenuByUrl(boardMasterVO);
		for(BoardMasterVO tempVO : viewBoardMenuList) {
			if("N".equals(tempVO.getViewsYn())){;
				boardMasterVO.setViewsYn("N");
				break ;
			}
		}
		
		if(0!=boardMenuList.size()) { //원자력 소식은 전체 매뉴 없음.
			if(!"9420000".equals(((BoardMasterVO)boardMenuList.get(0)).getMenuNo())) { 
				BoardMasterVO totalBoardMasterVO = new BoardMasterVO();
				totalBoardMasterVO.setBbsNm("전체");
				boardMenuList.add(0,totalBoardMasterVO) ;
			}
		}
		
		if(request.getRequestURI().contains("List.do")){ //최초 로딩 매뉴이름가져오기
			MenuManageVO tempMenuManageVO = new MenuManageVO();
			tempMenuManageVO.setUrl(request.getRequestURI());
			MenuManageVO menuManageVO = menuManageService.selectMenuManageUrl(tempMenuManageVO);
			model.addAttribute("menuManageVO", menuManageVO);
		}
		
		if(request.getRequestURI().contains("ListAjax.do") //하단 리스트
			) { //상세 하단 리스트
			BoardMasterVO bmVO = new BoardMasterVO();
			PaginationInfo paginationInfo = new PaginationInfo();
			//전체 게시글 불러오기
			Map<String, Object> map = new HashMap<String, Object>();
			if("".equals(boardVO.getBbsId())){ //전체 게시글 불러오기
				boardVO.setPageUnit(bmVO.getPageUnit());
				boardVO.setPageSize(bmVO.getPageSize());
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardMasterVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardMasterVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardMasterVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				
				String temp = boardMasterVO.getUrl(); //Url 패턴에 Ajax 구문 삭제처리
				boardMasterVO.setUrl(temp.replace("Ajax", ""));
				//전체 게시글 불러오기
				map = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
			}else {
				bmVO.setBbsId(boardVO.getBbsId());
				bmVO = bbsAttrbService.selectBBSMasterInf(bmVO);
				//UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
				
				boardVO.setPageUnit(Integer.parseInt(bmVO.getListNum()));
				boardVO.setPageSize(Integer.parseInt(bmVO.getPageNum()));
				
				paginationInfo.setCurrentPageNo(boardVO.getPageIndex());
				paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());
				paginationInfo.setPageSize(boardVO.getPageSize());

				boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
				boardVO.setLastIndex(paginationInfo.getLastRecordIndex());
				boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
				//메뉴별 게시글 불러오기
				map = bbsMngService.selectBoardArticlesWeb(boardVO, null);
			}
			int totCnt = Integer.parseInt((String) map.get("resultCnt"));

			paginationInfo.setTotalRecordCount(totCnt);
			List<BoardVO> resultList = (List<BoardVO>)map.get("resultList");
			for (BoardVO bvo: resultList) {
				Document doc = Jsoup.parse(bvo.getNttCn());
				String text = doc.text();
				bvo.setNttCn2(text);
			}
			model.addAttribute("resultList", resultList);
			model.addAttribute("resultCnt", map.get("resultCnt"));
			model.addAttribute("paginationInfo", paginationInfo);
			
			
			if(request.getRequestURI().contains("CntBbs01ListAjax")){ //01타입
				model.addAttribute("boardVO", boardVO);
				return "web/cop/bbs/CntBbs01ListAjax";
			}
			return "web/cop/bbs/CntBbsListAjax";
		}
		model.addAttribute("boardMenuList", boardMenuList);
		return "web/cop/bbs/CntBbsList";
	}
	
	
	public String getDateDay(String date, String dateType) throws Exception {
	    String day = "" ;
	    SimpleDateFormat dateFormat = new SimpleDateFormat(dateType) ;
	    Date nDate = dateFormat.parse(date) ;
	    Calendar cal = Calendar.getInstance() ;
	    cal.setTime(nDate);
	    int dayNum = cal.get(Calendar.DAY_OF_WEEK) ;
	    switch(dayNum){
	        case 1:
	            day = "일";
	            break ;
	        case 2:
	            day = "월";
	            break ;
	        case 3:
	            day = "화";
	            break ;
	        case 4:
	            day = "수";
	            break ;
	        case 5:
	            day = "목";
	            break ;
	        case 6:
	            day = "금";
	            break ;
	        case 7:
	            day = "토";
	            break ;
	    }
	    return day ;
	}
	
	public BoardVO niceCheck(HttpServletRequest request, HttpSession session, BoardVO boardVO) {
		
		CPClient niceCheck = new  CPClient();
		String sEncodeData = requestReplace(request.getParameter("EncodeData"), "encodeData");
		String sSiteCode = "BS933";				// NICE로부터 부여받은 사이트 코드
		String sSitePassword = "2CU5kY9wpppk";			// NICE로부터 부여받은 사이트 패스워드
		 
		String sCipherTime = "";			// 복호화한 시간
	    String sRequestNumber = "";			// 요청 번호
	    String sResponseNumber = "";		// 인증 고유번호
	    String sAuthType = "";				// 인증 수단
	    String sName = "";					// 성명
	    String sDupInfo = "";				// 중복가입 확인값 (DI_64 byte)
	    String sConnInfo = "";				// 연계정보 확인값 (CI_88 byte)
	    String sBirthDate = "";				// 생년월일(YYYYMMDD)
	    String sGender = "";				// 성별
	    String sNationalInfo = "";			// 내/외국인정보 (개발가이드 참조)
		String sMobileNo = "";				// 휴대폰번호
		String sMobileCo = "";				// 통신사
	    String sMessage = "";
	    String sPlainData = "";
	    
		int iReturn = niceCheck.fnDecode(sSiteCode, sSitePassword, sEncodeData);
		if( iReturn == 0 )
	    {
	        sPlainData = niceCheck.getPlainData();
	        sCipherTime = niceCheck.getCipherDateTime();
	        
	        // 데이타를 추출합니다.
	        java.util.HashMap mapresult = niceCheck.fnParse(sPlainData);
	        
	        sRequestNumber  = (String)mapresult.get("REQ_SEQ");
	        sResponseNumber = (String)mapresult.get("RES_SEQ");
	        sAuthType		= (String)mapresult.get("AUTH_TYPE");
	        sName			= (String)mapresult.get("NAME");
			//sName			= (String)mapresult.get("UTF8_NAME"); //charset utf8 사용시 주석 해제 후 사용
	        sBirthDate		= (String)mapresult.get("BIRTHDATE");
	        sGender			= (String)mapresult.get("GENDER");
	        sNationalInfo  	= (String)mapresult.get("NATIONALINFO");
	        sDupInfo		= (String)mapresult.get("DI");
	        sConnInfo		= (String)mapresult.get("CI");
	        sMobileNo		= (String)mapresult.get("MOBILE_NO");
	        sMobileCo		= (String)mapresult.get("MOBILE_CO");
	        
	        String session_sRequestNumber = (String)session.getAttribute("REQ_SEQ");
	        if(!sRequestNumber.equals(session_sRequestNumber))
	        {
	            sMessage = "세션값 불일치 오류입니다.";
	            sResponseNumber = "";
	            sAuthType = "";
	        }
	    }
	    else if( iReturn == -1)
	    {
	        sMessage = "복호화 시스템 오류입니다.";
	    }    
	    else if( iReturn == -4)
	    {
	        sMessage = "복호화 처리 오류입니다.";
	    }    
	    else if( iReturn == -5)
	    {
	        sMessage = "복호화 해쉬 오류입니다.";
	    }    
	    else if( iReturn == -6)
	    {
	        sMessage = "복호화 데이터 오류입니다.";
	    }    
	    else if( iReturn == -9)
	    {
	        sMessage = "입력 데이터 오류입니다.";
	    }    
	    else if( iReturn == -12)
	    {
	        sMessage = "사이트 패스워드 오류입니다.";
	    }    
	    else
	    {
	        sMessage = "알수 없는 에러 입니다. iReturn : " + iReturn;
	    }
		
		try {
		boardVO.setNiceMessage(sMessage);
		boardVO.setNiceNm(sName);
		boardVO.setMblDn(sDupInfo);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return boardVO;
		
	}
	
	//나이스 인증
	public String requestReplace (String paramValue, String gubun) {

        String result = "";
        
        if (paramValue != null) {
        	
        	paramValue = paramValue.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

        	paramValue = paramValue.replaceAll("\\*", "");
        	paramValue = paramValue.replaceAll("\\?", "");
        	paramValue = paramValue.replaceAll("\\[", "");
        	paramValue = paramValue.replaceAll("\\{", "");
        	paramValue = paramValue.replaceAll("\\(", "");
        	paramValue = paramValue.replaceAll("\\)", "");
        	paramValue = paramValue.replaceAll("\\^", "");
        	paramValue = paramValue.replaceAll("\\$", "");
        	paramValue = paramValue.replaceAll("'", "");
        	paramValue = paramValue.replaceAll("@", "");
        	paramValue = paramValue.replaceAll("%", "");
        	paramValue = paramValue.replaceAll(";", "");
        	paramValue = paramValue.replaceAll(":", "");
        	paramValue = paramValue.replaceAll("-", "");
        	paramValue = paramValue.replaceAll("#", "");
        	paramValue = paramValue.replaceAll("--", "");
        	paramValue = paramValue.replaceAll("-", "");
        	paramValue = paramValue.replaceAll(",", "");
        	
        	if(gubun != "encodeData"){
        		paramValue = paramValue.replaceAll("\\+", "");
        		paramValue = paramValue.replaceAll("/", "");
            paramValue = paramValue.replaceAll("=", "");
        	}
        	
        	result = paramValue;
            
        }
        return result;
	}
	
	public String damoDec(String strEnc, HttpServletRequest request) {
		//DI 복구화
		
		System.out.println("-----damoDec---request.getRequestURL().toString()-----------" + request.getRequestURL().toString()+"-----") ;
		
		String iniFilePath     = "/usr/local/tomcat/damo/scpdb_agent.ini"; //실서버
		if(request.getRequestURL().toString().contains("test.kofons.or.kr")){ //로컬
			iniFilePath = "C:\\damo\\scpdb_agent.ini";
		}else if(request.getRequestURL().toString().contains("219.240.88.15")) { //테스트
			iniFilePath = "/usr/local/tomcat_kofons/damo/scpdb_agent.ini";
		}
		System.out.println("iniFilePath --" + iniFilePath + "---"); 
		ScpDbAgent agt = new ScpDbAgent();
		String strDec = "";
		try {
			strDec = agt.ScpDecB64( iniFilePath, "KEY1", strEnc);
		}catch(Exception e) {
			
		}
		return  strDec ;
	}
	
	public String damoEnc(String strDec, HttpServletRequest request) {
		//DI 암호화
		System.out.println("-----damoEnc---request.getRequestURL().toString()-----------" + request.getRequestURL().toString()+"-----") ;
		
		String iniFilePath     = "/usr/local/tomcat/damo/scpdb_agent.ini"; //실서버
		if(request.getRequestURL().toString().contains("test.kofons.or.kr")){ //로컬
			iniFilePath = "C:\\damo\\scpdb_agent.ini";
		}else if(request.getRequestURL().toString().contains("219.240.88.15")) { //테스트
			iniFilePath = "/usr/local/tomcat_kofons/damo/scpdb_agent.ini";
		}
		System.out.println("iniFilePath --" + iniFilePath + "---");
		ScpDbAgent agt = new ScpDbAgent();
		String strEnc = "";
		try {
			strEnc =  agt.ScpEncB64( iniFilePath, "KEY1", strDec);
		}catch(Exception e) {
			
		}
		return  strEnc ;
	}
	
}
