package itn.web;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
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.util.StringUtils;
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.annotation.SessionAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.intercept.EgovReloadableFilterInvocationSecurityMetadataSource;
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.ComDefaultVO;
import itn.com.cmm.LoginVO;
import itn.com.cmm.service.CmmnDetailCode;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.StringUtil;
import itn.com.cmm.util.WebUtil;
import itn.com.uss.ion.bnr.pop.service.MainPopupManageService;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.bnr.service.BannerVO;
import itn.com.uss.ion.bnr.service.EgovBannerService;
import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService;
import itn.com.uss.ion.cnf.service.MetaTagManageService;
import itn.com.uss.ion.cyb.service.CyberAlertManageService;
import itn.com.uss.ion.cyb.service.CyberAlertManageVO;
import itn.com.uss.ion.fms.service.FmsFileVO;
import itn.com.uss.ion.pwm.service.EgovPopupManageService;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.com.uss.ion.pwm.service.PopupManageVO;
import itn.com.uss.ion.pwm.service.PopupzoneVO;
import itn.com.uss.olh.hpc.service.HackIpService;
import itn.com.uss.olh.hpc.service.HackIpVO;
import itn.com.utl.fcc.service.EgovStringUtil;
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.bbs.service.SearchTotalVO;
import itn.let.fax.addr.service.FaxAddrTransHistService;
import itn.let.fax.addr.service.FaxAddrTransHistVO;
import itn.let.lett.service.LetterService;
import itn.let.lett.service.LetterVO;
import itn.let.mjo.addr.service.AddrTransHistService;
import itn.let.mjo.addr.service.AddrTransHistVO;
import itn.let.mjo.event.service.MjonEventService;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.kisa.service.KisaService;
import itn.let.mjo.kisa.service.KisaVO;
import itn.let.mjo.mjocommon.MjonForienIpChk;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgcampain.service.MjonCandidateService;
import itn.let.mjo.msgcampain.service.MjonCandidateVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.MjonMsgDataVO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.payva.service.VacsVactService;
import itn.let.mjo.payva.service.VacsVactVO;
import itn.let.solr.sys.service.ResearchService;
import itn.let.sts.com.StatsVO;
import itn.let.sts.cst.service.EgovConectStatsService;
import itn.let.sym.ccm.cde.service.CateCode;
import itn.let.sym.log.clg.service.EgovLoginLogService;
import itn.let.sym.log.clg.service.LoginLog;
import itn.let.sym.mnu.mcm.service.EgovMenuCreateManageService;
import itn.let.sym.mnu.mpm.service.EgovMenuManageService;
import itn.let.sym.mnu.mpm.service.MenuManageJTreeVO;
import itn.let.sym.mnu.mpm.service.MenuManageVO;
import itn.let.sym.prm.service.EgovProgrmManageService;
import itn.let.sym.prm.service.ProgrmManageVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.sym.site.service.MetaTagVO;
import itn.let.sym.site.service.SiteManagerVO;
import itn.let.uss.umt.service.EgovMberManageService;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.sim.service.EgovClntInfo;



/**
 * 템플릿 메인 페이지 컨트롤러 클래스(Sample 소스)
 * @author 실행환경 개발팀 JJY
 * @since 2011.08.31
 * @version 1.0
 * @see
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2011.08.31  JJY            최초 생성
 *
 * </pre>
 */
@Controller
@SessionAttributes(types = ComDefaultVO.class)
public class MainController {

	static String RSA_WEB_KEY = "_RSA_WEB_Key_"; // 개인키 session key
    static String RSA_INSTANCE = "RSA"; // rsa transformation
    
	/** EgovProgrmManageService */
	@Resource(name = "progrmManageService")
	private EgovProgrmManageService progrmManageService;
	
	/** EgovPropertyService */
	@Resource(name = "propertiesService")
	protected EgovPropertyService propertiesService;
	
	/* MjonMsgDataService */
	@Resource(name = "MjonMsgDataService")
    private MjonMsgDataService mjonMsgDataService;
	
	/**
	 * EgovBBSManageService
	 */
	@Resource(name = "EgovBBSManageService")
    private EgovBBSManageService bbsMngService;

	/** EgovMenuManageService */
	@Resource(name = "meunManageService")
    private EgovMenuManageService menuManageService;

	@Resource(name = "egovBannerService")
    private EgovBannerService egovBannerService;
	
	/** EgovPopupManageService */
	@Resource(name = "egovPopupManageService")
	private EgovPopupManageService egovPopupManageService;
	
	/** cyberAlertManageService */
	@Resource(name = "cyberAlertManageService")
	private CyberAlertManageService cyberAlertManageService;
	
	@Resource(name="EgovLoginLogService")
	private EgovLoginLogService loginLogService;
	
	@Resource(name = "conectStatsService")
    private EgovConectStatsService conectStatsService;
	
	@Resource(name="databaseSecurityMetadataSource")
    EgovReloadableFilterInvocationSecurityMetadataSource databaseSecurityMetadataSource; 
	
	@Resource(name = "researchService")
	protected ResearchService researchService;
	 
	/** cmmUseService */
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;
	
	/** EgovMenuManageService */
	@Resource(name = "meunCreateManageService")
	private EgovMenuCreateManageService menuCreateManageService;

	@Resource(name = "egovSiteManagerService")
	EgovSiteManagerService egovSiteManagerService;
	
	@Resource(name = "EgovBBSAttributeManageService")
	private EgovBBSAttributeManageService bbsAttrbService;
	
	/** metaTagManageService 메타태그 */
	@Resource(name = "metaTagManageService")
	private MetaTagManageService metaTagManageService;
	
	@Resource(name="EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;
	
	/** KisaService */
	@Resource(name = "KisaService")
    private KisaService kisaService;
	
	/** LetterService */
	@Resource(name = "LetterService")
    private LetterService letterService;
	
	@Resource(name = "AddrTransHistService")
	private AddrTransHistService addrTransHistService;

	@Resource(name = "FaxAddrTransHistService")
	private FaxAddrTransHistService faxAddrTransHistService;
	
    //전용계좌 서비스
    @Resource(name="vacsVactService")
    private VacsVactService vacsVactService;
	
	@Resource(name = "hackIpService")
	private HackIpService hackIpService;    
	
	@Resource(name = "mjonPayService")
	private MjonPayService mjonPayService;    
	
	@Resource(name = "MjonEventService")
    private MjonEventService mjonEventService;
	
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;
	
	/** mberManageService */
	@Resource(name = "mberManageService")
	private EgovMberManageService mberManageService;
	
	@Resource(name = "mjonCandidateService")
    private MjonCandidateService mjonCandidateService;

	@Resource(name = "subMainZoneManageService")
	private SubMainZoneManageService subMainZoneManageService;
	
	/** 메인팝업 service */
	@Resource(name = "mainPopupManageService")
	private MainPopupManageService mainPopupManageService;
	
	
	@Value("#{globalSettings['Globals.email.host']}")
	private String Globals_email_host; 
	@Value("#{globalSettings['Globals.email.port']}")
	private String Globals_email_port;
	@Value("#{globalSettings['Globals.email.fromUser']}")
	private String Globals_email_fromUser;
	@Value("#{globalSettings['Globals.email.fromEmail']}")
	private String Globals_email_fromEmail;
	@Value("#{globalSettings['Globals.email.fromEmail.password']}")
	private String Globals_email_fromEmail_password;
	@Value("#{globalSettings['Globals.email.toEmail']}")
	private String Globals_email_toEmail;
	@Value("#{globalSettings['Globals.email.toEmail.BCC']}")
	private String Globals_email_toEmail_BCC;
	
	
	@RequestMapping(value = "/{siteId}/web/main/mainPage_keri.do")
	public String siteMainPage_keri(@PathVariable("siteId") String siteId , HttpServletRequest request, ModelMap model) throws Exception{
		//메인이미지
		/** EgovPropertyService.sample */
		MainzoneVO mainzoneVO = new MainzoneVO();
    	mainzoneVO.setPageUnit(propertiesService.getInt("pageUnit"));
    	mainzoneVO.setPageSize(propertiesService.getInt("pageSize"));

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mainzoneVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mainzoneVO.getPageUnit());
		paginationInfo.setPageSize(mainzoneVO.getPageSize());
		
		mainzoneVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mainzoneVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mainzoneVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		
		mainzoneVO.setSiteId(siteId);
		
        List<?> mainzoneList = egovPopupManageService.selectMainzoneList(mainzoneVO);    //상단메인 이미지     
        model.addAttribute("mainzoneList", mainzoneList);
		BoardVO boardVO = new BoardVO();
		boardVO.setPageUnit(7);
		boardVO.setPageSize(10);
		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.setBbsId("BBSMSTR_000000000153");  //라이브폴라스토리
		boardVO.setSecretAt("N"); //비밀글제외
		boardVO.setAtchFileCnt(1); //파일이 있는경우만(임의의 숫자 1)
		
		//대표이미지 가져오기
		ComDefaultCodeVO vo = new ComDefaultCodeVO();
		vo.setCodeId("ITN005"); 
		List<?> cmmCaLevel = cmmUseService.selectCmmCodeDetail(vo);
		BoardVO mainPolaVo = new BoardVO();
		if(cmmCaLevel != null){
			String bbsId = ((CmmnDetailCode)cmmCaLevel.get(0)).getCodeNm() ;
			boardVO.setNttId(Integer.parseInt(bbsId));
			boardVO.setMainPolaNttId(bbsId);
			mainPolaVo = bbsMngService.selectBoardArticle(boardVO); 
			if(mainPolaVo !=null){
				boardVO.setRecordCountPerPage(5);
				model.addAttribute("livePolaStoryListOne", mainPolaVo);  //첫번째 사진
			}
		}
		
		Map<String, Object> livePolaStoryList = bbsMngService.selectBoardArticles(boardVO, "BBSA02");
		List livePolaArrayList  = (List) livePolaStoryList.get("resultList") ;
		model.addAttribute("livePolaStoryListOther", livePolaArrayList); //나머지 사진
		/*if(livePolaArrayList.size()!=0){
			
			livePolaArrayList.remove(0) ;
			
			model.addAttribute("livePolaStoryList", livePolaStoryList.get("resultList"));
		}*/
		
		boardVO.setBbsId("BBSMSTR_000000000018");  // 공지사항 메인 컨텐츠
		Map<String, Object> map = bbsMngService.selectBoardArticles(boardVO, "BBSA02"); 
		model.addAttribute("notiList", map.get("resultList"));
		/*boardVO.setBbsId("BBSMSTR_000000000101");  //입찰공고
		Map<String, Object> map1 = bbsMngService.selectBoardArticles(boardVO, "BBSA02");
		model.addAttribute("biddingList", map1.get("resultList"));*/
		// 공지사항 메인컨텐츠 조회 끝 -----------------------------------
		
		// 자유게시판 메인 컨텐츠 조회 시작 ---------------------------------
		boardVO.setPageUnit(9);
		boardVO.setPageSize(10);
		boardVO.setBbsId("BBSMSTR_BBBBBBBBBBBB");

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

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

		model.addAttribute("bbsList", bbsMngService.selectBoardArticles(boardVO, "BBSA02").get("resultList"));

        // 설문참여 메인 컨텐츠 조회 시작 -----------------------------------
        ComDefaultVO qVO = new ComDefaultVO();
    	qVO.setPageUnit(1);
    	qVO.setPageSize(10);

    	/** pageing */
		paginationInfo.setCurrentPageNo(qVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(qVO.getPageUnit());
		paginationInfo.setPageSize(qVO.getPageSize());

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

        //배너 리스트 조회
		BannerVO bannerVO = new  BannerVO();
		bannerVO.setRecordCountPerPage(50);  //50개까지
		bannerVO.setFirstIndex(0);  
		bannerVO.setReflctAt("Y");  //반영이  Y 만
		
		ArrayList<BannerVO> bannerVOList= (ArrayList<BannerVO>) egovBannerService.selectBannerList(bannerVO) ;//배너6개 안되면 좌측 버튼이 안보임
		if(null != bannerVOList){
			for(int i=0; i<4; i++){
				if(bannerVOList.size()<6){
					bannerVOList.addAll(bannerVOList);
				}
			}
		}
		//bannerVO.setBannerList(egovBannerService.selectBannerList(bannerVO));
		bannerVO.setBannerList(bannerVOList);
		model.addAttribute("bannerList", bannerVO.getBannerList());
		
		//팝업리스트 조회
		/*if(!isMobile(request)){ //PC인경우만
			PopupManageVO popupManageVO = new PopupManageVO();
			popupManageVO.setRecordCountPerPage(10);  //10개만
			popupManageVO.setNtceAt("Y");  //사용만
			popupManageVO.setMainPageFlag("Y") ; //메인화면의 용도(시작일 종료일 사이 조회)
			List<?> popupList = egovPopupManageService.selectPopupMainList(popupManageVO);
			model.addAttribute("popupList", popupList);
		}*/
		//알림판
		/** 알림창괸리  */
		PopupzoneVO  popupzoneVo = new PopupzoneVO();
        List<?> popupzoneList = egovPopupManageService.selectPopupzoneList(popupzoneVo);      
        model.addAttribute("popupzoneList", popupzoneList);
        
		/** 팝업존관리  */
       /* popupManageVO.setRecordCountPerPage(10);  //10개만
		popupManageVO.setNtceAt("Y");  //사용만
		popupManageVO.setMainPageFlag("Y") ; //메인화면의 용도(시작일 종료일 사이 조회)
		popupManageVO.setPopupType("Z"); //팝업존만 조회
		List<?> popupzoneList = egovPopupManageService.selectPopupMainList(popupManageVO);
		model.addAttribute("popupzoneList", popupzoneList);*/
        
        
        /** 사이버경고관리  */
        CyberAlertManageVO cyberManageVO = new CyberAlertManageVO();
        cyberManageVO.setCaId("CYBER_0000000001");
        List<?> cyberAlerMap = cyberAlertManageService.selectCyberAlert(cyberManageVO);
        EgovMap emp = new EgovMap();
        if( cyberAlerMap.size() != 0 ){
			emp = (EgovMap)cyberAlerMap.get(0);
        }	
        model.addAttribute("cyberAlerMap", emp);
        
        
        model.addAttribute("siteId", siteId);
        String siteFolder = "site/"+siteId ; 
		return "web/"+siteFolder+"/main/mainPage";
	}
	
	@RequestMapping(value = "/web/main/mainPage.do")
	public String siteMainPage(HttpServletRequest request, ModelMap model, HttpSession session, 
			@RequestParam(value="message", defaultValue="0") String message, LetterVO letterVO) throws Exception{
		//메인이미지
		String referer = (String)request.getHeader("REFERER");
		
		//로그인 실패시 메세지
		if(!"0".equals(message)) {
			model.addAttribute("messageflag", "1");
			model.addAttribute("message", message);
		}
		
/*		*//** EgovPropertyService.sample *//*
		MainzoneVO mainzoneVO = new MainzoneVO();
    	mainzoneVO.setPageUnit(propertiesService.getInt("pageUnit"));
    	mainzoneVO.setPageSize(propertiesService.getInt("pageSize"));

		*//** pageing *//*
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mainzoneVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mainzoneVO.getPageUnit());
		paginationInfo.setPageSize(mainzoneVO.getPageSize());*/
		
		/*mainzoneVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mainzoneVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mainzoneVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		mainzoneVO.setUseYn("Y"); //사용하는것만
		mainzoneVO.setDeviceType("P"); //PC
        List<?> mainzoneList = egovPopupManageService.selectMainzoneList(mainzoneVO);    //상단메인 이미지
        mainzoneVO.setDeviceType("M"); //모바일
        List<?> mainzoneListM = egovPopupManageService.selectMainzoneList(mainzoneVO);    //상단메인 이미지
        
        model.addAttribute("mainzoneList", mainzoneList); //PC
        model.addAttribute("mainzoneListM", mainzoneListM); //모바일
        
		*//** 팝업존 알림창괸리  *//*
        if(!isMobile(request)){
			PopupzoneVO  popupzoneVo = new PopupzoneVO();
			popupzoneVo.setFirstIndex(0);
			popupzoneVo.setSeCd("02"); //좌측팝업
			popupzoneVo.setUseYn("Y");
			
	        List<?> popupzoneList = egovPopupManageService.selectPopupzoneList(popupzoneVo);      
	        model.addAttribute("popupzoneList", popupzoneList);
	        popupzoneVo.setSeCd("03");
	        List<?> popupzoneTopList = egovPopupManageService.selectPopupzoneList(popupzoneVo);      
	        model.addAttribute("popupzoneTopList", popupzoneTopList);
	        
        }
  		
  		 하단 배너 
		BannerVO bannerVO = new  BannerVO();
		bannerVO.setRecordCountPerPage(50);  //50개까지
		bannerVO.setFirstIndex(0);
		bannerVO.setSeCd("01");  
		bannerVO.setReflctAt("Y");
		bannerVO.setSearchSortCnd("SORTORDR");
		bannerVO.setSearchSortOrd("asc");
		ArrayList<BannerVO> bannerVOList= (ArrayList<BannerVO>) egovBannerService.selectBannerList(bannerVO) ;//배너6개 안되면 좌측 버튼이 안보임
		bannerVO.setBannerList(bannerVOList);
		model.addAttribute("bannerList", bannerVO.getBannerList()) ;
		
		 소셜 허브 하단 배너 
		bannerVO.setSeCd("02");  
		ArrayList<BannerVO> bannerVOSocList= (ArrayList<BannerVO>) egovBannerService.selectBannerList(bannerVO) ;//배너6개 안되면 좌측 버튼이 안보임
		bannerVO.setBannerList(bannerVOSocList);
		model.addAttribute("bannerVOSocList", bannerVO.getBannerList()) ;
		
		//대표이미지 가져오기
		ComDefaultCodeVO vo = new ComDefaultCodeVO();
		vo.setCodeId("ITN005"); */
		
		//kisa 사용자 경고 팝업
		LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
			KisaVO kisaVO = new KisaVO();
			kisaVO.setMberId(user.getId());
			kisaVO.setKisaPopupYn("Y");
			List<KisaVO> kisaList = kisaService.selectKisaListMberId(kisaVO);
			if(kisaList.size() > 0) {
				//kisa 코드 조회
				ComDefaultCodeVO kisacodeVO = new ComDefaultCodeVO();
				kisacodeVO.setCodeId("ITN034");
				List<?> kisacodeResult = cmmUseService.selectCmmCodeDetail(kisacodeVO);
				model.addAttribute("kisacodeResult", kisacodeResult);
				
				//위반 사항 안내 종합 (아이디별 kisalist의 각각 kisaWarnMessage를 한번에 보여주기 위해)
				String[] chk = {};
				ArrayList<String> kisaWarnMessagelist = new ArrayList<String>();
				for(KisaVO tmpVO : kisaList) {
					if(!"".equals(tmpVO.getKisaWarnMessage()) && tmpVO.getKisaWarnMessage() != null) {
						chk = tmpVO.getKisaWarnMessage().split(",");
						for(int i = 0 ; i < chk.length ; i++) {
							if(!kisaWarnMessagelist.contains(chk[i])) {
								kisaWarnMessagelist.add(chk[i]);
							}
						}
					}
				}
				model.addAttribute("chk", kisaWarnMessagelist);
				model.addAttribute("kisaListSize", kisaList.size());
				model.addAttribute("kisaList", kisaList);
			}
		}
		
		//공지사항 게시글 불러오기
		BoardMasterVO boardMasterVO = new BoardMasterVO();
		//공지사항 url로 전체게시글 불러오기
		boardMasterVO.setUrl("/web/cop/bbs/NoticeList.do");
		BoardMasterVO bmVO = new BoardMasterVO();
		
		BoardVO boardVO = new BoardVO();
		boardVO.setPageUnit(7);
		boardVO.setPageSize(10);
		
		if("".equals(boardMasterVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			boardMasterVO.setSearchSortCnd("nttId");
			boardMasterVO.setSearchSortOrd("desc");
		}
		//전체 게시글 불러오기
		Map<String, Object> map = new HashMap<String, Object>();
		
		if(boardMasterVO.getPageUnit() != 10) {
			bmVO.setPageUnit(boardMasterVO.getPageUnit());
		}
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(bmVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(bmVO.getPageUnit());
		paginationInfo.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<String, Object> noticeMap = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
		
		if(!noticeMap.get("resultCnt").equals("0")){
			@SuppressWarnings("unchecked")
			ArrayList<BoardVO> boardList= (ArrayList<BoardVO>)noticeMap.get("resultList") ; //nttcn 태그 삭제 처리
			for( BoardVO tempBoardVO : boardList){
				if("".equals(tempBoardVO.getNttCn().replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "").split("<")[0].equals(""))){
					tempBoardVO.setNttCn  ( tempBoardVO.getNttCn().replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "")) ;
				}else {
					tempBoardVO.setNttCn( tempBoardVO.getNttCn().replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "").split("<")[0] ) ;
				}
			}
			model.addAttribute("noticeList", noticeMap.get("resultList"));
		}
		
		// 문자 카테고리 리스트 불러오기
		List<CateCode> cateConfList = letterService.selectCateConfWithList("N");
		model.addAttribute("cateCodeList", cateConfList);
		
		// 맞춤문자 카테고리 리스트 불러오기
		List<CateCode> cateConfCustomList = letterService.selectCateConfWithList("C");
		model.addAttribute("cateConfCustomList", cateConfCustomList);
			
		/*		
		// 문자 카테고리 리스트 불러오기 & // 맞춤문자 카테고리 리스트 불러오기
		{
			//merge list data
			List<CateCode> cateConfListMerge = letterService.selectCateConfWithList4Main("N");

			// 문자 카테고리 리스트 불러오기
			List<CateCode> cateConfList = new ArrayList();
			//model.addAttribute("cateCodeList", cateConfList);
			
			// 맞춤문자 카테고리 리스트 불러오기
			List<CateCode> cateConfCustomList = new ArrayList();
			//model.addAttribute("cateConfCustomList", cateConfCustomList);
			
			for (int i=0;i<cateConfListMerge.size();i++) {
				// 문자 카테고리 리스트 불러오기
				CateCode tCC	=	cateConfListMerge.get(i);
				
				if ("N".equals(tCC.getCateType())){
					cateConfList.add(tCC);
					
				}else if ("C".equals(tCC.getCateType())){
					cateConfCustomList.add(tCC);
					
				}				
			}			

			// 문자 카테고리 리스트 불러오기			
			model.addAttribute("cateCodeList", cateConfList);
			
			// 맞춤문자 카테고리 리스트 불러오기			
			model.addAttribute("cateConfCustomList", cateConfCustomList);
			
		}
		*/
		
		
		{
			
			/**
			 * 
			 * 이벤트를 위한 결제내역 조회
			 * 결제 내역이 없으면 첫결제 이벤트 팝업 호출 할 수 있도록 함.
			 * 
			 * */
			String userId = user == null ? "" : EgovStringUtil.isNullToString(user.getId());
			int payCnt = 0;
			if(StringUtil.isNotEmpty(userId)) {
				//결제내역 카운트 조회
				payCnt = mjonPayService.selectMemerPayCount(userId);
				
			}
			model.addAttribute("payCount", payCnt);
			model.addAttribute("userId", userId);

			//현재 진행중 이벤트 조회(최저가 문자발송 이벤트 진행중인지 조회 - like 검색으로 진행중인 이벤트를 1개만 불러온다.)
			//일단 테스트로 게시글 제목으로 조회하도록 함.
			String nttSj = "[첫결제 이벤트] 첫 결제 시, 누구나 조건 없이 인생 최저가!";		//제목 검색
			BoardVO eventBoardVO = new BoardVO();
			eventBoardVO.setBbsId("BBSMSTR_000000000731");
			eventBoardVO.setNttSj(nttSj);
			BoardVO resultEvent = mjonEventService.selectEventInfoByNttSj(eventBoardVO);
			
			model.addAttribute("resultEvent", resultEvent);
			
			String blineCode = "N";
			if(StringUtil.isNotEmpty(userId)) {
				// B선 전송사 사용여부
				MberManageVO mberManageVO = new MberManageVO();
				mberManageVO.setMberId(userId);
				blineCode = mberManageService.selectBlineCodeByMberId(mberManageVO);
			}
			model.addAttribute("blineCode", blineCode);
		}
		
		//문자온 소개 태그 조회
		LetterVO letterMsgVO = new LetterVO();
		letterMsgVO.setTagDiv("2");
		List<LetterVO> mainMsgTagList = letterService.selectMainMsgTagWebList(letterMsgVO);
		model.addAttribute("mainMsgTagList", mainMsgTagList);
		
		{//상단 메인배너 롤링 이미지 불러오기
			
			List<MainzoneVO> resultMainzoneList = egovPopupManageService.selectMainzoneListRolling();
			model.addAttribute("mainzoneList", resultMainzoneList);
			
		}
		
		{//하단 서브메인배너 롤링 이미지 불러오기
			
			List<MainzoneVO> resultSubMainzoneList = subMainZoneManageService.selectSubMainzoneListRolling();
			model.addAttribute("subMainzoneList", resultSubMainzoneList);
			
		}
		
		
		{//팝업 롤링 이미지 불러오기
			
			List<MainPopupVO> resultMainPopupList = mainPopupManageService.selectMainPopupListRolling();
			model.addAttribute("mainPopupList", resultMainPopupList);
			System.out.println("===================mainPopupList");
			
		}
		
		return "web/main/mainPage";
	}
	
	
	//==================================================================================================================
	
	
	@RequestMapping(value = "/web/main/mainPageTest.do")
	public String siteMainPageTest(HttpServletRequest request, ModelMap model, HttpSession session, 
			@RequestParam(value="message", defaultValue="0") String message, LetterVO letterVO) throws Exception{
		//메인이미지
		String referer = (String)request.getHeader("REFERER");
		
		//로그인 실패시 메세지
		if(!"0".equals(message)) {
			model.addAttribute("messageflag", "1");
			model.addAttribute("message", message);
		}
		
/*		*//** EgovPropertyService.sample *//*
		MainzoneVO mainzoneVO = new MainzoneVO();
    	mainzoneVO.setPageUnit(propertiesService.getInt("pageUnit"));
    	mainzoneVO.setPageSize(propertiesService.getInt("pageSize"));

		*//** pageing *//*
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(mainzoneVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(mainzoneVO.getPageUnit());
		paginationInfo.setPageSize(mainzoneVO.getPageSize());*/
		
		/*mainzoneVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		mainzoneVO.setLastIndex(paginationInfo.getLastRecordIndex());
		mainzoneVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		mainzoneVO.setUseYn("Y"); //사용하는것만
		mainzoneVO.setDeviceType("P"); //PC
        List<?> mainzoneList = egovPopupManageService.selectMainzoneList(mainzoneVO);    //상단메인 이미지
        mainzoneVO.setDeviceType("M"); //모바일
        List<?> mainzoneListM = egovPopupManageService.selectMainzoneList(mainzoneVO);    //상단메인 이미지
        
        model.addAttribute("mainzoneList", mainzoneList); //PC
        model.addAttribute("mainzoneListM", mainzoneListM); //모바일
        
		*//** 팝업존 알림창괸리  *//*
        if(!isMobile(request)){
			PopupzoneVO  popupzoneVo = new PopupzoneVO();
			popupzoneVo.setFirstIndex(0);
			popupzoneVo.setSeCd("02"); //좌측팝업
			popupzoneVo.setUseYn("Y");
			
	        List<?> popupzoneList = egovPopupManageService.selectPopupzoneList(popupzoneVo);      
	        model.addAttribute("popupzoneList", popupzoneList);
	        popupzoneVo.setSeCd("03");
	        List<?> popupzoneTopList = egovPopupManageService.selectPopupzoneList(popupzoneVo);      
	        model.addAttribute("popupzoneTopList", popupzoneTopList);
	        
        }
  		
  		 하단 배너 
		BannerVO bannerVO = new  BannerVO();
		bannerVO.setRecordCountPerPage(50);  //50개까지
		bannerVO.setFirstIndex(0);
		bannerVO.setSeCd("01");  
		bannerVO.setReflctAt("Y");
		bannerVO.setSearchSortCnd("SORTORDR");
		bannerVO.setSearchSortOrd("asc");
		ArrayList<BannerVO> bannerVOList= (ArrayList<BannerVO>) egovBannerService.selectBannerList(bannerVO) ;//배너6개 안되면 좌측 버튼이 안보임
		bannerVO.setBannerList(bannerVOList);
		model.addAttribute("bannerList", bannerVO.getBannerList()) ;
		
		 소셜 허브 하단 배너 
		bannerVO.setSeCd("02");  
		ArrayList<BannerVO> bannerVOSocList= (ArrayList<BannerVO>) egovBannerService.selectBannerList(bannerVO) ;//배너6개 안되면 좌측 버튼이 안보임
		bannerVO.setBannerList(bannerVOSocList);
		model.addAttribute("bannerVOSocList", bannerVO.getBannerList()) ;
		
		//대표이미지 가져오기
		ComDefaultCodeVO vo = new ComDefaultCodeVO();
		vo.setCodeId("ITN005"); */
		
		//kisa 사용자 경고 팝업
		LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
		if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
			KisaVO kisaVO = new KisaVO();
			kisaVO.setMberId(user.getId());
			kisaVO.setKisaPopupYn("Y");
			List<KisaVO> kisaList = kisaService.selectKisaListMberId(kisaVO);
			if(kisaList.size() > 0) {
				//kisa 코드 조회
				ComDefaultCodeVO kisacodeVO = new ComDefaultCodeVO();
				kisacodeVO.setCodeId("ITN034");
				List<?> kisacodeResult = cmmUseService.selectCmmCodeDetail(kisacodeVO);
				model.addAttribute("kisacodeResult", kisacodeResult);
				
				//위반 사항 안내 종합 (아이디별 kisalist의 각각 kisaWarnMessage를 한번에 보여주기 위해)
				String[] chk = {};
				ArrayList<String> kisaWarnMessagelist = new ArrayList<String>();
				for(KisaVO tmpVO : kisaList) {
					if(!"".equals(tmpVO.getKisaWarnMessage()) && tmpVO.getKisaWarnMessage() != null) {
						chk = tmpVO.getKisaWarnMessage().split(",");
						for(int i = 0 ; i < chk.length ; i++) {
							if(!kisaWarnMessagelist.contains(chk[i])) {
								kisaWarnMessagelist.add(chk[i]);
							}
						}
					}
				}
				model.addAttribute("chk", kisaWarnMessagelist);
				model.addAttribute("kisaListSize", kisaList.size());
				model.addAttribute("kisaList", kisaList);
			}
		}
		
		//공지사항 게시글 불러오기
		BoardMasterVO boardMasterVO = new BoardMasterVO();
		//공지사항 url로 전체게시글 불러오기
		boardMasterVO.setUrl("/web/cop/bbs/NoticeList.do");
		BoardMasterVO bmVO = new BoardMasterVO();
		
		BoardVO boardVO = new BoardVO();
		boardVO.setPageUnit(7);
		boardVO.setPageSize(10);
		
		if("".equals(boardMasterVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			boardMasterVO.setSearchSortCnd("nttId");
			boardMasterVO.setSearchSortOrd("desc");
		}
		//전체 게시글 불러오기
		Map<String, Object> map = new HashMap<String, Object>();
		
		if(boardMasterVO.getPageUnit() != 10) {
			bmVO.setPageUnit(boardMasterVO.getPageUnit());
		}
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(bmVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(bmVO.getPageUnit());
		paginationInfo.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<String, Object> noticeMap = bbsMngService.selectBoardArticlesWebUrl(boardMasterVO, null);
		
		if(!noticeMap.get("resultCnt").equals("0")){
			@SuppressWarnings("unchecked")
			ArrayList<BoardVO> boardList= (ArrayList<BoardVO>)noticeMap.get("resultList") ; //nttcn 태그 삭제 처리
			for( BoardVO tempBoardVO : boardList){
				if("".equals(tempBoardVO.getNttCn().replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "").split("<")[0].equals(""))){
					tempBoardVO.setNttCn  ( tempBoardVO.getNttCn().replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "")) ;
				}else {
					tempBoardVO.setNttCn( tempBoardVO.getNttCn().replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "").split("<")[0] ) ;
				}
			}
			model.addAttribute("noticeList", noticeMap.get("resultList"));
		}
		
		// 문자 카테고리 리스트 불러오기
		List<CateCode> cateConfList = letterService.selectCateConfWithList("N");
		model.addAttribute("cateCodeList", cateConfList);
		
		// 맞춤문자 카테고리 리스트 불러오기
		List<CateCode> cateConfCustomList = letterService.selectCateConfWithList("C");
		model.addAttribute("cateConfCustomList", cateConfCustomList);
			
		/*		
		// 문자 카테고리 리스트 불러오기 & // 맞춤문자 카테고리 리스트 불러오기
		{
			//merge list data
			List<CateCode> cateConfListMerge = letterService.selectCateConfWithList4Main("N");

			// 문자 카테고리 리스트 불러오기
			List<CateCode> cateConfList = new ArrayList();
			//model.addAttribute("cateCodeList", cateConfList);
			
			// 맞춤문자 카테고리 리스트 불러오기
			List<CateCode> cateConfCustomList = new ArrayList();
			//model.addAttribute("cateConfCustomList", cateConfCustomList);
			
			for (int i=0;i<cateConfListMerge.size();i++) {
				// 문자 카테고리 리스트 불러오기
				CateCode tCC	=	cateConfListMerge.get(i);
				
				if ("N".equals(tCC.getCateType())){
					cateConfList.add(tCC);
					
				}else if ("C".equals(tCC.getCateType())){
					cateConfCustomList.add(tCC);
					
				}				
			}			

			// 문자 카테고리 리스트 불러오기			
			model.addAttribute("cateCodeList", cateConfList);
			
			// 맞춤문자 카테고리 리스트 불러오기			
			model.addAttribute("cateConfCustomList", cateConfCustomList);
			
		}
		*/
		
		
		{
			
			/**
			 * 
			 * 이벤트를 위한 결제내역 조회
			 * 결제 내역이 없으면 첫결제 이벤트 팝업 호출 할 수 있도록 함.
			 * 
			 * */
			String userId = user == null ? "" : EgovStringUtil.isNullToString(user.getId());
			int payCnt = 0;
			if(StringUtil.isNotEmpty(userId)) {
				//결제내역 카운트 조회
				payCnt = mjonPayService.selectMemerPayCount(userId);
				
			}
			model.addAttribute("payCount", payCnt);
			model.addAttribute("userId", userId);

			//현재 진행중 이벤트 조회(최저가 문자발송 이벤트 진행중인지 조회 - like 검색으로 진행중인 이벤트를 1개만 불러온다.)
			//일단 테스트로 게시글 제목으로 조회하도록 함.
			String nttSj = "[첫결제 이벤트] 첫 결제 시, 누구나 조건 없이 인생 최저가!";		//제목 검색
			BoardVO eventBoardVO = new BoardVO();
			eventBoardVO.setBbsId("BBSMSTR_000000000731");
			eventBoardVO.setNttSj(nttSj);
			BoardVO resultEvent = mjonEventService.selectEventInfoByNttSj(eventBoardVO);
			
			model.addAttribute("resultEvent", resultEvent);
			
			String blineCode = "N";
			if(StringUtil.isNotEmpty(userId)) {
				// B선 전송사 사용여부
				MberManageVO mberManageVO = new MberManageVO();
				mberManageVO.setMberId(userId);
				blineCode = mberManageService.selectBlineCodeByMberId(mberManageVO);
			}
			model.addAttribute("blineCode", blineCode);
		}
		
		//문자온 소개 태그 조회
		LetterVO letterMsgVO = new LetterVO();
		letterMsgVO.setTagDiv("2");
		List<LetterVO> mainMsgTagList = letterService.selectMainMsgTagWebList(letterMsgVO);
		model.addAttribute("mainMsgTagList", mainMsgTagList);
		
		
		{//상단 메인배너 롤링 이미지 불러오기
			
			List<MainzoneVO> resultMainzoneList = egovPopupManageService.selectMainzoneListRolling();
			model.addAttribute("mainzoneList", resultMainzoneList);
			
		}
		
		return "web/main/mainPageTest";
	}
	
	
	
	
	
	//====================================================================================================================
	
	
	
	
	
	/**
     * KISA 수정 Ajax
     * @param kisaVO
     * @param model
     * @return modelAndView
     * @throws Exception
     * /kisaWeb/kisaWeb/updateKisaWarnMessageAjax.do
     */
	@RequestMapping(value = {"/web/kisa/updateKisaWarnMessageAjax.do"})
	public ModelAndView updateKisaAjax(@ModelAttribute("kisaVO") KisaVO kisaVO
			, RedirectAttributes redirectAttributes
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		kisaVO.setKisaPopupYn("Y");
		List<KisaVO> kisaList = kisaService.selectKisaListMberId(kisaVO);
		for(KisaVO tmpVO : kisaList) {
			tmpVO.setKisaSignNm(kisaVO.getKisaSignNm());
			tmpVO.setKisaSignPhoneNo(kisaVO.getKisaSignPhoneNo());
			if("1".equals(tmpVO.getKisaReceptState())){
				tmpVO.setKisaReceptState("2");
			}
			else if("3".equals(tmpVO.getKisaReceptState())){
				tmpVO.setKisaReceptState("4");
			}
			else if("5".equals(tmpVO.getKisaReceptState())){
				tmpVO.setKisaReceptState("6");
			}
			kisaService.updateKisaWarnMessage(tmpVO);
		}
		
		modelAndView.addObject("result", "success");
		return modelAndView;
	}
	
	/**
     * 사용자 상단 매뉴
     */
    @RequestMapping(value="/web/com/webCommonHeader.do")
    public String siteWebCommonHeader(
    		@RequestParam Map<String, Object> commandMap, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, HttpSession session,
    		ModelMap model, HttpServletRequest request)
            throws Exception {
    	
    	//점검중 페이지 체크
		SiteManagerVO siteManagerVO_ = new SiteManagerVO();
		siteManagerVO_ = egovSiteManagerService.selectSiteManagerVO(siteManagerVO_);
		
		//1. 사이트 점검중 페이지 노출
		//2. siteManager 테이블의 SYS_MAINTENANCE, SYS_MAINTENANCE_IP 를 통해 구분
		//3. 점검중페이지 노출 방식 
		//			미사용 : 점검 중 페이지 미노출
		//			IP로제어 : 등록 IP를 제외하고 모든 페이지에서 '점검중' 레이어 노출
		//			PATH로제어 : '/web/main/mainPage.do' 메인페이지에 접근했을때만 점검중페이지로 이동
		String userIP = this.getClientIP(request);
		Boolean result = this.inspPageIp(request, userIP, siteManagerVO_);
		if(!result) {
			model.addAttribute("inspYn", "Y");
		}
    	
    	
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		
		List<String> menuTwoExist = new ArrayList<>();	//2뎁스의 하위 매뉴가 있는것 조회
		HashSet<String> underMenuEmpty = new HashSet<String>();  //2뎁스의 하위매뉴 없는것 조회
		for(MenuManageJTreeVO menuManage : menuResultList){
			if(menuManage.getDepth().equals("3")){
				menuTwoExist.add(menuManage.getUpperMenuId()) ;
			}
			
			if(menuManage.getDepth().equals("2")){
				underMenuEmpty.add(menuManage.getMenuNo());
			}
		}
		
		HashSet<String> underMenuExist = new HashSet<String>(menuTwoExist); //하위매뉴가 있는것 
		underMenuEmpty.removeAll(underMenuExist); //하위매뉴가 없는것
		
		MenuManageJTreeVO menuManageTopVO = new MenuManageJTreeVO();
		menuManageTopVO.setUpperMenuId("#");
		menuManageTopVO.setMenuNo("0");
		
		model.addAttribute("menuResultList", menuResultList);
		model.addAttribute("underMenuExist", underMenuExist);
		model.addAttribute("underMenuEmpty", underMenuEmpty);
		
		//이전 URL
		model.addAttribute("beforeUrl",request.getRequestURI());
		
    	//팝업존
    	/* 팝업 가져오기 */
  		if(!isMobile(request)){ //PC인경우만
  			PopupManageVO popupManageVO = new PopupManageVO();
  			popupManageVO.setRecordCountPerPage(10);  //10개만
  			popupManageVO.setNtceAt("Y");  //사용만
  			popupManageVO.setMainPageFlag("Y") ; //메인화면의 용도(시작일 종료일 사이 조회)
  			List<?> popupList = egovPopupManageService.selectPopupMainList(popupManageVO);
  			model.addAttribute("popupList", popupList);
  			
  			PopupzoneVO  popupzoneVo = new PopupzoneVO();
  			popupzoneVo.setFirstIndex(0);
  			popupzoneVo.setRecordCountPerPage(20);
  			popupzoneVo.setSeCd("02");
  			popupzoneVo.setUseYn("Y");
  			popupzoneVo.setSearchSortCnd("SORT");
  			popupzoneVo.setSearchSortOrd("ASC");
  	        List<?> popupzoneList = egovPopupManageService.selectPopupzoneList(popupzoneVo);      
  	        model.addAttribute("popupzoneList", popupzoneList);
  		}
  		
  		if(request.getRequestURL().indexOf("web/user/login/login.do")  > -1){
  			model.addAttribute("loginPage", true);
    	}else {
    		initRsa(request);
    	}
  		
    	MjonMsgVO mjonMsgVO = new MjonMsgVO();
    	mjonMsgVO.setUserId(userId);
    	
  		//현재 보유 잔액/포인트 정보 불러오기
  		Double userMoney = 0.0;
  		String userPoint = "0";
  		String money = "0";
  		//admin 계정 에러안나게 처리(임시) userMoney = Double.parseDouble(money);여기 에러남
  		/*if(!userId.equals("") && !"ROLE_ADMIN".equals(loginVO.getAuthority())) {
  			
  			money = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
  			userMoney = Double.parseDouble(money);
  			userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
  			
  		}*/
  		
  		if(!userId.equals("")) {
  			
  			money = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
  			
  			if(money != null) {
  				userMoney = Double.parseDouble(money);
  			}
  			userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
  			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  			
  			//AddrTransHistVO addrTransHistVO = new AddrTransHistVO();
  			//addrTransHistVO.setRecvMberId(userId);
  			//List<?> addrTransWaitList = addrTransHistService.selectAddrTransWaitList(addrTransHistVO);
  			//model.addAttribute("addrTransWaitListSize", addrTransWaitList.size());
  		}
  		
  		BigDecimal parseMoney = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
  		
  		model.addAttribute("userMoney", parseMoney);
  		model.addAttribute("userPoint", userPoint);
 
  		//비로그인 시 KMC 팝업 준비 - 로그인 시 IP 등록되어있는지 체크 후 IP없으면 본인인증을 위함
  		/*Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
  		if(!isAuthenticated && !(request.getRequestURL().toString().contains("checkTerms.do") ||  request.getRequestURL().toString().contains("findUserId.do"))) {
  			KmcCertChecker kmcCertCheck = new KmcCertChecker();
  			
  			AuthCertVO certVO = kmcCertCheck.authCertCheck("http://www.munjaon.co.kr/web/cop/kmc/authRequestAjax.do");
  			
  			model.addAttribute("tr_cert", certVO.getTr_cert());
  			model.addAttribute("tr_url", certVO.getTr_url());
  			model.addAttribute("tr_add", certVO.getTr_add());
  		}*/
		//로그인 시 IP 체크를 위해 클라이언트 IP 넘겨주기
  		
  	    //사용자의 ip 정보를 불러오는 것으로 변경!!!!!!!!!!!!!!!!!!!!_220412
  	    //공인 IP 구하기
  		String userIp = EgovClntInfo.getClntIP2(request);
//		java.util.Scanner s = new java.util.Scanner(new java.net.URL("https://api.ipify.org").openStream(), "UTF-8").useDelimiter("\\A");
//		userIp = s.next();
  	    
  		model.addAttribute("userIp", userIp);
  		
  		//세션타임 설정(관리자)
		SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
		/*session.setMaxInactiveInterval(60* Integer.parseInt(siteManagerVO.getSessionTimeCdText()));*/ //10분
		session.setMaxInactiveInterval(60* Integer.parseInt(siteManagerVO.getSessionTimeUserCdTxt())); //10분
		/*model.addAttribute("sessionTime", siteManagerVO.getSessionTimeCdText());*/
		model.addAttribute("sessionTimeUser", siteManagerVO.getSessionTimeUserCdTxt());
		
		//세션 타이머 종료 시간 받아서 넘겨주기
		//model.addAttribute("timer", session.getAttribute("timer"));
		
		//문자검색 인기검색어 4개 불러오기
		MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO();
		List<?> resultSearchWordList = mjonMsgDataService.selectMsgSearchWordExpList(mjonMsgDataVO); 
		
		model.addAttribute("resultSearchWordList", resultSearchWordList);

		//전용계좌 정보 리스트 불러오기
		List<?> myBankList = new ArrayList<>();
		if(StringUtil.isNotEmpty(userId)) {
			
			//대상 리스트 가져오기    	    	
			VacsVactVO vacsVactVO = new VacsVactVO();
			vacsVactVO.setMberId(loginVO.getId());
			myBankList = vacsVactService.selectMyBankAcctList(vacsVactVO);	//내가 할당받은 전용계좌 리스트 받아오기
			
		}
		
		model.addAttribute("myBankList", myBankList);
		
		String prePaymentYn = "";
		if(loginVO != null) {
			
			String auth = loginVO.getAuthority();
			
			//사용자 권한인 경우만 실행
			if(!auth.equals("ROLE_ADMIN")) {
				
				//후불회원 여부 조회
				UserManageVO userManageVO = new UserManageVO();
				
				if(!userId.equals("")) {
					userManageVO.setMberId(userId);
					userManageVO = userManageService.selectAdminSmsNoticeYn(userManageVO);
				}
				
				if(userManageVO.getPrePaymentYn() != null) {
					prePaymentYn = userManageVO.getPrePaymentYn();
				}
				
			}
			
		}
		model.addAttribute("prePaymentYn", prePaymentYn);
		
		
		/*
		 * 선거문자 메뉴 선별적 노출을 위하여 후보자 정보조회
		 * 비회원, 후부자 정보가 없는 회원은 선거문자가 안보이도록 처리
		 * 2024.02.08 우영두 추가
		 * 
		 * */
		String userCandidateYn = "N";
		
		if(loginVO != null) {
			
			//선거 후보자 정보 조회
			MjonCandidateVO mjonCandidateVO = mjonCandidateService.selectCandidateDataInfo(userId);
			
			if(mjonCandidateVO != null) {
				
				userCandidateYn = "Y";
				
			}
			
		}
		
		model.addAttribute("userCandidateYn", userCandidateYn);
		
		if(loginVO != null) {
			MberManageVO mberManageVO = new MberManageVO();
			mberManageVO.setMberId(loginVO.getId());
			
			model.addAttribute("mberManageVO", userManageService.selectUserInfo(mberManageVO));
		}
		
		/*
		 * 회원별 단가, 기본 단가, 이벤트 정보 조회
		 * 2025.07.25 이지우 추가
		 * */
			MberManageVO mberHeaderInfoVO = new MberManageVO();
			if(loginVO != null) {
				mberHeaderInfoVO = mberManageService.selectMberHeaderInfo(loginVO.getId());
			}
			model.addAttribute("mberHeaderInfoVO", mberHeaderInfoVO);
			
		return "web/com/webCommonHeader";
    }
    
    
    /**
     * 사용자 상단 매뉴
     */
    @RequestMapping(value="/{siteId}/web/com/webThemeCommonHeader.do")
    public String webThemeCommonHeader(@PathVariable("siteId") String siteId ,
    		@RequestParam Map<String, Object> commandMap, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model, HttpServletRequest request)
            throws Exception {
    	
    	//로그인 권한정보 불러오기
    	LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	
    	model.addAttribute("userInfo", user);
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		//List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtree(menuManageVO) ;
    	menuManageVO.setSiteId(siteId);
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		
		List<String> menuTwoExist = new ArrayList<>();	//2뎁스의 하위 매뉴가 있는것 조회
		HashSet<String> underMenuEmpty = new HashSet<String>();  //2뎁스의 하위매뉴 없는것 조회
		for(MenuManageJTreeVO menuManage : menuResultList){
			if(menuManage.getDepth().equals("3")){
				menuTwoExist.add(menuManage.getUpperMenuId()) ;
			}
			
			if(menuManage.getDepth().equals("2")){
				underMenuEmpty.add(menuManage.getMenuNo());
			}
		}
		
		HashSet<String> underMenuExist = new HashSet<String>(menuTwoExist); //하위매뉴가 있는것 
		underMenuEmpty.removeAll(underMenuExist); //하위매뉴가 없는것
		
		MenuManageJTreeVO menuManageTopVO = new MenuManageJTreeVO();
		menuManageTopVO.setUpperMenuId("#");
		menuManageTopVO.setMenuNo("0");
		
		model.addAttribute("menuResultList", menuResultList);
		model.addAttribute("underMenuExist", underMenuExist);
		model.addAttribute("underMenuEmpty", underMenuEmpty);
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ; 
		
		
		if("linc".equals(siteId)){ //linc 사업단
			//json 형태 만들기 
			JSONObject jsonObject = new JSONObject();
			
			JSONObject oneDepth = null;
			JSONArray oneArray = new JSONArray();
			JSONObject twoDepth = null;
			JSONArray twoArray =  null;
			JSONObject threeDepth = new JSONObject();
			JSONArray threeArray = new JSONArray();
			int onePoint = 1;
			int twoPoint = 1;
			for(MenuManageJTreeVO menuManageOne : menuResultList){
				if(menuManageOne.getDepth().equals("1")){
					oneDepth = new JSONObject();
					twoArray = new JSONArray();
					oneDepth.put("children", "1-1");
					oneDepth.put("name", menuManageOne.getMenuNm());
					for(MenuManageJTreeVO menuManageTwo : menuResultList){
						if(menuManageTwo.getDepth().equals("2")){
							if(menuManageOne.getMenuNo().equals(menuManageTwo.getUpperMenuId())){
								twoDepth = new JSONObject(); 
								twoDepth.put("children", ""+onePoint+"-"+twoPoint);
								twoPoint = twoPoint+1;
								twoDepth.put("name", menuManageTwo.getMenuNm());
								twoDepth.put("link", menuManageTwo.getUrl());
								twoArray.add(twoDepth) ;
							}
						}
					}
					oneArray.add(oneDepth) ;
					oneDepth.put("children", twoArray);
					onePoint = onePoint+1;
					twoPoint =1;
				}
			}
			
			jsonObject.put("children", oneArray);
			model.addAttribute("menuJson", jsonObject);
		}
		
		if(siteId.equals("linc") || siteId.equals("klc")){
			return "web/"+siteFolder+"/com/webCommonHeader";
		}else{
			SiteManagerVO siteManagerVO = new SiteManagerVO();
			siteManagerVO.setSiteId(siteId);
			
			setSiteinfo(siteManagerVO, model , request );
			//return "web/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile()+"/com/webCommonHeader";
			return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/com/webCommonHeader";
		}
    }
    
    
    @RequestMapping(value="/web/com/webCommonHeader_back.do")
    public String webCommonHeader_back(
    		@RequestParam Map<String, Object> commandMap,
    		ModelMap model)
            throws Exception {
    	
      	return "web/com/webCommonHeader";
    }
    
    
    /**
     * 사용자 footer
     */
    @RequestMapping(value="/web/com/webCommonFooter.do")
    public String siteWebCommonFooter(
    		@RequestParam Map<String, Object> commandMap, HttpServletRequest request, HttpSession session,
    		ModelMap model)
            throws Exception {
    	
    	LoginLog loginLog = new LoginLog();
    	if(request.getRequestURI().contains("/web/main/mainPage.do")){  //사용자 메인
    		loginLog.setProgrmFileNm("mainPage");
    		loginLog.setMenuNm("사용자메인");
    	}else if(request.getRequestURI().contains("/web/survey/surveyList")){ //설문조사
    		loginLog.setProgrmFileNm("surveyList");
    		loginLog.setMenuNm("설문조사");
    	}else if(request.getRequestURI().contains("/web/content.do")){  //컨텐츠 
    		if(commandMap.get("proFn")!=null){
    			MenuManageVO tempMenuManageVO = new MenuManageVO();
    			tempMenuManageVO.setSearchCondition("proFn");
    			tempMenuManageVO.setAuthorCode((String)commandMap.get("proFn"));
    			MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO) ;
    			loginLog.setProgrmFileNm((String)commandMap.get("proFn"));
    			if(resultVO!=null){
    				loginLog.setMenuNm(resultVO.getMenuNm());
    			}
    		}
    	}else if(commandMap.get("bbsId") != null){  //나머지 모든 게시판
    		MenuManageVO tempMenuManageVO = new MenuManageVO();
    		tempMenuManageVO.setSearchKeyword((String)commandMap.get("bbsId"));
    		tempMenuManageVO.setSearchCondition("bbsId");
    		MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO) ;
			loginLog.setProgrmFileNm((String)commandMap.get("bbsId"));
			if(resultVO!=null){
				loginLog.setMenuNm(resultVO.getMenuNm());
			}
    	}else{
    		loginLog.setProgrmFileNm(null);
    	}

    	//사용자 방문수 insert
        {
        	if(null == loginLogService.selectLoginUserLog(loginLog)){  //오늘날짜의 IP조회
        		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyyMMdd", Locale.KOREA );
            	Date currentTime = new Date ();
            	String mTime = mSimpleDateFormat.format ( currentTime );
        		HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
				/* String ip = req.getHeader("X-FORWARDED-FOR"); */
                String ip = EgovClntInfo.getClntIP(req);
                if (ip == null){ ip = req.getRemoteAddr();}
                
                loginLog.setLoginIp(ip);
            	loginLog.setCreatDt(mTime);
        		loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O
                loginLog.setErrOccrrAt("N");
                loginLog.setErrorCode("");
                loginLog.setUserAt("U");
                
                if(!"anonymousUser".equals(EgovUserDetailsHelper.getAuthenticatedUser() )) {
                	LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
                	loginLog.setLoginId(loginVO.getId()); 
                }else {
                	loginLog.setLoginId(""); 
                }
                
                if(isMobile(request)){
                	loginLog.setDeviceType("M");
                }else{
                	loginLog.setDeviceType("P");
                }
                
                if(null != request.getQueryString() && !"".equals(request.getQueryString())){
                	loginLog.setUrl(request.getRequestURI()+"?"+request.getQueryString()); 
                }else {
               		loginLog.setUrl(request.getRequestURI());
                }
                
                // JSPark 2023.03.27 => 아이피 길이체크(Data too long for column 오류 방지)
                /*
                if (ip != null) {
                	if (ip.length() <= 23) {
                		loginLogService.logInsertLoginLog(loginLog);
                	}
                }
                */
                
                    try {
		                //IP 컬럼 길이를 늘려서 비교 조건 제거함 2023-04-05
                    	//URL 길이를 체크하여 제한 값에 도달 했는지 확인 후 분기 처리함
	                	if (loginLog.getUrl().length()>200){	//길이문제로 오류가 발생하는 경우도 처리하도록 수정
	                		
	                    	LoginLog loginLog_tmp = new LoginLog();
	                    	loginLog_tmp.setLogId(loginLog.getLogId());
	                    	loginLog_tmp.setLoginId(loginLog.getLoginId());
	                    	loginLog_tmp.setLoginIp(loginLog.getLoginIp());
	                    	loginLog_tmp.setUserAt(loginLog.getUserAt());
	                    	
	                    	loginLog_tmp.setDeviceType(loginLog.getDeviceType());
	                    	loginLog_tmp.setErrorCode(loginLog.getErrorCode());
	                    	loginLog_tmp.setErrOccrrAt(loginLog.getErrOccrrAt());
	                    	loginLog_tmp.setUrl(loginLog.getUrl().substring(0,200));
	                    	
	                        //IP 컬럼 길이를 늘려서 비교 조건 제거함 2023-04-05
	                    	int i_ret	=	loginLogService.logInsertLoginLog(loginLog_tmp);
	                    	
	                    	
	                    	if (i_ret<=0)	{
	                    		loginLog_tmp.setErrorCode("0000000000");	                    		
	                    		loginLogService.logInsertLoginLog4Ajax(loginLog_tmp);
	                    	}
	                		
	                	}else {	//200 이하인 경우
	                        //IP 컬럼 길이를 늘려서 비교 조건 제거함 2023-04-05
	                    	int i_ret	=	loginLogService.logInsertLoginLog(loginLog);
                 	
	                    	
	                    	if (i_ret<=0)	{
	                    		loginLog.setErrorCode("0000000000");
	                    		loginLogService.logInsertLoginLog4Ajax(loginLog);
	                    	}
	                	}
	                	
                    }catch(Exception ex) {                    	
                    	ex.printStackTrace();
                    	
                    }
        	}
        	
        	// JSPark 2023.02.24 => 사용하는곳이 없어 주석처리
        	//오늘 접속 / 최종접속 
        	/*
        	LoginLog footerLog = new LoginLog();
        	footerLog = loginLogService.selectLogCnt(footerLog);
        	model.addAttribute("footerLog", footerLog);
        	*/
        	
        }
        
    	//세션타임 설정해줌(사용자)
    	SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
		session.setMaxInactiveInterval(60* Integer.parseInt(siteManagerVO.getSessionTimeUserCdTxt())); //10분
		//model.addAttribute("sessionTime", siteManagerVO.getSessionTimeCdText());
		
        
        model.addAttribute("loginLog", loginLog);
        return "web/com/webCommonFooter";
    }
    
    /**
     * 사용자 만족도 관리/매뉴 담당자 가져오기
     */
    @RequestMapping(value="/web/com/webSatisCommonFooter.do")
    public String siteWebSatisCommonFooter(@RequestParam Map<String, Object> commandMap, HttpServletRequest request, ModelMap model, Model model2)
            throws Exception {
    	
    	MenuManageVO tempMenuManageVO = new MenuManageVO();
    	
    	String url = request.getRequestURI();
    	String AuthorCode = "ROLE_ANONYMOUS"; //해당 푸터는 데코레이트에서 */web/*만 타므로 무조건 사용자 메뉴이다. 
    	if(request.getRequestURI().contains("/web/content.do")) {
	    	tempMenuManageVO.setSearchCondition("proFn");
	    	tempMenuManageVO.setAuthorCode(AuthorCode);
	    	tempMenuManageVO.setSearchKeyword((String)commandMap.get("proFn"));
	    	url += "?proFn=" + commandMap.get("proFn");
    	}else if(commandMap.get("bbsId") != null) {
    		tempMenuManageVO.setSearchKeyword((String)commandMap.get("bbsId"));
    		tempMenuManageVO.setSearchCondition("bbsId");
    		tempMenuManageVO.setAuthorCode(AuthorCode);
    		url += "?" + commandMap.get("bbsId");
    	}else {
			String tempUrl = request.getRequestURI() ;
			ComDefaultVO searchVO = new ComDefaultVO();
			searchVO.setSearchKeyword(tempUrl);
			ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
			if(null != progrmManageVO){
		    	tempMenuManageVO.setSearchCondition("Y");
				tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());	
			}
    	}
    	MenuManageVO resultVO = menuManageService.selectMenuManage_Satis(tempMenuManageVO) ;
    	model.addAttribute("resultVO", resultVO);
        model.addAttribute("url", url);
        return "web/com/webSatisCommonFooter";
    }
    
    
    /**
     * 사용자 footer
     */
    @RequestMapping(value="/{siteId}/web/com/webThemeCommonFooter.do")
    public String webThemeCommonFooter(@PathVariable("siteId") String siteId ,
    		@RequestParam Map<String, Object> commandMap, HttpServletRequest request, ModelMap model)
            throws Exception {
    	
    	LoginLog loginLog = new LoginLog();
    	if(request.getRequestURI().contains("/web/main/mainPage.do")){  //사용자 메인
    		loginLog.setProgrmFileNm("mainPage");
    		loginLog.setMenuNm("사용자메인");
    	}else if(request.getRequestURI().contains("/web/survey/surveyList")){ //설문조사
    		loginLog.setProgrmFileNm("surveyList");
    		loginLog.setMenuNm("설문조사");
    	}else if(request.getRequestURI().contains("/web/content.do")){  //컨텐츠 
    		if(commandMap.get("proFn")!=null){
    			MenuManageVO tempMenuManageVO = new MenuManageVO();
    			tempMenuManageVO.setSearchCondition("proFn");
    			tempMenuManageVO.setAuthorCode((String)commandMap.get("proFn"));
    			MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO) ;
    			loginLog.setProgrmFileNm((String)commandMap.get("proFn"));
    			if(resultVO!=null){
    				loginLog.setMenuNm(resultVO.getMenuNm());
    			}
    		}
    	}else if(commandMap.get("bbsId") != null){  //나머지 모든 게시판
    		
    		MenuManageVO tempMenuManageVO = new MenuManageVO();
    		tempMenuManageVO.setSearchKeyword((String)commandMap.get("bbsId"));
    		tempMenuManageVO.setSearchCondition("bbsId");
/*    		ComDefaultVO searchVO = new ComDefaultVO();
    		searchVO.setSearchCondition("bbsId");
    		searchVO.setSearchKeyword((String)commandMap.get("bbsId"));
*/			MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO) ;
			loginLog.setProgrmFileNm((String)commandMap.get("bbsId"));
			if(resultVO!=null){
				loginLog.setMenuNm(resultVO.getMenuNm());
			}
    	}else{
    		loginLog.setProgrmFileNm(null);
    	}

    	//사용자 방문수 insert
        {
        	if(loginLog.getProgrmFileNm()!= null){ //미리보기 경우가 아닌경우
        		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyyMMdd", Locale.KOREA );
            	Date currentTime = new Date ();
            	String mTime = mSimpleDateFormat.format ( currentTime );
        		HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
				/* String ip = req.getHeader("X-FORWARDED-FOR"); */
        		String ip = EgovClntInfo.getClntIP(req);
                if (ip == null){ ip = req.getRemoteAddr();}
                
                loginLog.setLoginIp(ip);
            	loginLog.setCreatDt(mTime);
            		loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O
                    loginLog.setErrOccrrAt("N");
                    loginLog.setErrorCode("");
                    loginLog.setUserAt("U");
                    loginLog.setLoginId(""); //connnect_id
                    if(isMobile(request)){
                    	loginLog.setDeviceType("M");
                    }else{
                    	loginLog.setDeviceType("P");
                    }
                    loginLogService.logInsertLoginLog(loginLog);
        	}
        	
        }
        model.addAttribute("loginLog", loginLog);
        model.addAttribute("siteId", siteId);
        String siteFolder = "site/"+siteId ;
        
        if(siteId.equals("linc") || siteId.equals("klc")){
        	return "web/"+siteFolder+"/com/webCommonFooter";
		}else{
			SiteManagerVO siteManagerVO = new SiteManagerVO();
			siteManagerVO.setSiteId(siteId);
			setSiteinfo(siteManagerVO, model , request );
			//return "web/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile()+"/com/webCommonFooter";
			return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/com/webCommonFooter";
		}
    }
    
    
    
    /*모바일접속 유무*/
	private boolean isMobile(HttpServletRequest request) {
        String userAgent = request.getHeader("user-agent");
        boolean mobile1 = userAgent.matches(".*(iPhone|iPod|Android|Windows CE|BlackBerry|Symbian|Windows Phone|webOS|Opera Mini|Opera Mobi|POLARIS|IEMobile|lgtelecom|nokia|SonyEricsson).*");
        boolean mobile2 = userAgent.matches(".*(LG|SAMSUNG|Samsung).*");
        if(mobile1 || mobile2) {
            return true;
        }
        return false;
    }

	/*최초 사이트 체크와 동시에 session 설정, 점검중 페이지 적용 */
	@RequestMapping(value="/com/firstSiteCheck.do")
    public String firstSiteCheck(HttpServletRequest request, @RequestParam Map<String, Object> commandMap, 
    		@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, 
    		ModelMap model)
            throws Exception {

		// 차단IP 체크 START
		{
			int ignoreIpCnt = 0;
			String ipAddress = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
		    if (ipAddress == null) {
		    	ipAddress = request.getRemoteAddr();
		    }
			
	        try {
	        	HackIpVO hackIpVO = new HackIpVO(); 
			    hackIpVO.setIgnoreIp(ipAddress);
	        	ignoreIpCnt = hackIpService.selectIgnoreIpCnt(hackIpVO);
	        	if (ignoreIpCnt > 0) {
	        		model.addAttribute("ipAddress", ipAddress);
	        		return "/block/Block";        		
	        	}
			}
			catch(Exception e) {
	
			}
		}
		// END		
		
		//점검중 페이지 체크
		SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
//		if("Y".equals(siteManagerVO.getInspFlag() )){ //점검중
//			return "web/com/insp";
//		}
		
		
		//1. 사이트 점검중 페이지 노출
		//2. siteManager 테이블의 SYS_MAINTENANCE, SYS_MAINTENANCE_IP 를 통해 구분
		//3. 점검중페이지 노출 방식 
		//			미사용 : 점검 중 페이지 미노출
		//			IP로제어 : 등록 IP를 제외하고 모든 페이지에서 '점검중' 레이어 노출
		//			PATH로제어 : '/web/main/mainPage.do' 메인페이지에 접근했을때만 점검중페이지로 이동
		String userIP = this.getClientIP(request);
		Boolean result = this.inspPagePath(request, userIP, siteManagerVO);
		if(!result) {
			return "web/com/insp";
		}
		
		
		//자신의 위치 정보
    	List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); //자신의 위치
    	MenuManageVO resultVO = new MenuManageVO();
    	MenuManageVO tempMenuManageVO = new MenuManageVO();
    	tempMenuManageVO.setSearchCondition("Y");
    	setViewMenu(request ,  commandMap ,  tempMenuManageVO , resultVO , menuManageVO );
    	menuCurrentResultList =  menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO) ;
    	Collections.reverse(menuCurrentResultList); //타이틀 역순을 위해
    	model.addAttribute("menuCurrentResultList", menuCurrentResultList);		
		
		model.addAttribute("siteManagerVO", siteManagerVO);
		
		//파라미터를 포함한 URL로 등록된 메타태그 정보가 있는지 조회
		String URL = request.getRequestURI();
		String queryString = request.getQueryString();
		if(queryString != null && !"".equals(queryString)) {
			URL += "?" + java.net.URLDecoder.decode(request.getQueryString(), "UTF-8");
		}
		MetaTagVO metaTagVo = egovSiteManagerService.selectMetaTagDetailByUrl(URL) ;
		if(metaTagVo != null) {
			model.addAttribute("metaTagVo", metaTagVo);
		}
		return "web/com/webLayout";
    }
	
	/*사이트 체크 유무*/
	@RequestMapping(value="/{siteId}/web/siteCheck.do")
	private String siteCheck(@PathVariable("siteId") String siteId , SiteManagerVO siteManagerVO , 
			HttpServletRequest request , RedirectAttributes redirectAttributes) {
       
		int totCnt = 0 ;
		siteManagerVO.setSiteId(siteId);
		try {
			totCnt = egovSiteManagerService.selectSiteManagerListTotCnt(siteManagerVO);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
        if(totCnt == 0){
        	return "web/com/alert_site";
        	
        	/*redirectAttributes.addFlashAttribute("message", "등록된 사이트가 없습니다.");
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/blank");
			return redirectUrlMaker.getRedirectUrl();*/
        }else{
        	return "blank";
        }
        //return "web/main/mainPage";
    }
	
    /**
     * 사용자 페이지의 테마 네비 상단 매뉴
     */
    @RequestMapping(value="/web/com/themeNaviWrap.do")
    public String themeWebCommonNaviWrap(
    		@RequestParam Map<String, Object> commandMap, HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
		
    	//자신의 위치 정보
    	List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); //자신의 위치
    	List<MenuManageJTreeVO> menuLeftResultList =   new ArrayList<MenuManageJTreeVO>();  //자신이 속한 위치
    	List<MenuManageJTreeVO> menuUnderResultList =   new ArrayList<MenuManageJTreeVO>();  //한단계 하위 위치
    	MenuManageVO resultVO = new MenuManageVO();
    	MenuManageVO tempMenuManageVO = new MenuManageVO();
    	tempMenuManageVO.setSearchCondition("Y");
    	
    	setViewMenu(request ,  commandMap ,  tempMenuManageVO , resultVO , menuManageVO );
    	
    	menuCurrentResultList =  menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO) ;
    	//최상단 매뉴 가져오기 : 상단 그림 변화
    	
    	//관리자에서 파일가져오기
    	PopupzoneVO  popupzoneVo = new PopupzoneVO(); 
        popupzoneVo.setFirstIndex(0);
		popupzoneVo.setRecordCountPerPage(10); //10개까지
		popupzoneVo.setSeCd("06"); //뉴스레터
		popupzoneVo.setUseYn("Y");
		
        List<?> popupzoneList_06 = egovPopupManageService.selectPopupzoneList(popupzoneVo);        
    	String topMenuId = "01" ;
    	String subMenuFile = "" ;
    	
    	int subMenuFileSize = popupzoneList_06.size() ;
    	
    	if(menuCurrentResultList.size()!=0){
    		topMenuId = ((MenuManageJTreeVO)menuCurrentResultList.get(0)).getMenuNo() ;
    		if("9100000".equals(topMenuId)){
    			topMenuId = "01" ;
    			if(subMenuFileSize > 0 ){
    				subMenuFile = (String)((EgovMap)popupzoneList_06.get(0)).get("popupzoneImageFile") ;
    			}
    		}else if("9200000".equals(topMenuId)){
    			topMenuId = "02" ;
    			if(subMenuFileSize > 1 ){
    				subMenuFile = (String)((EgovMap)popupzoneList_06.get(1)).get("popupzoneImageFile") ;
    			}
    		}else if("9300000".equals(topMenuId)){
    			topMenuId = "03" ;
    			if(subMenuFileSize > 2 ){
    				subMenuFile = (String)((EgovMap)popupzoneList_06.get(2)).get("popupzoneImageFile") ;
    			}
    		}else if("9400000".equals(topMenuId)){
    			topMenuId = "04" ;
    			if(subMenuFileSize > 3 ){
    				subMenuFile = (String)((EgovMap)popupzoneList_06.get(3)).get("popupzoneImageFile") ;
    			}
    		}else if("9500000".equals(topMenuId)){
    			topMenuId = "05" ;
    			if(subMenuFileSize > 4 ){
    				subMenuFile = (String)((EgovMap)popupzoneList_06.get(4)).get("popupzoneImageFile") ;
    			}
    		}else{
    			topMenuId = "01" ;
    			if(subMenuFileSize > 0 ){
    				subMenuFile = (String)((EgovMap)popupzoneList_06.get(0)).get("popupzoneImageFile") ;
    			}
    		}
    	}
    	model.addAttribute("topMenuId", topMenuId); 
    	model.addAttribute("subMenuFile", subMenuFile);
    	menuLeftResultList =  menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO) ;
    	menuUnderResultList =  menuCreateManageService.selectMenuUnderListJtreeWeb(menuManageVO) ;
    	
    	
    	List<MenuManageJTreeVO> showOneDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showTwoDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showThreeDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showFourDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    			
    	for(MenuManageJTreeVO tempLeftMenu : menuLeftResultList){
    		if(tempLeftMenu.getDepth().equals("2")){
    			for(MenuManageJTreeVO tempCurrentTwoMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentTwoMenu.getMenuNo())){
    					showTwoDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("3")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showThreeDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("4")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showFourDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    	}
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		for(MenuManageJTreeVO tempResultVo : menuResultList){  //1 뎁스
			if(tempResultVo.getDepth().equals("1")){
				showOneDepthMenu.add(tempResultVo);
			}
		}
		
		//매뉴구조도 텍스트
		String menuText = "";
		menuText +=  "<li class='home'>&nbsp;</li>" ;
		if(request.getRequestURI().contains("/eng")){ //영문사이트
			int i = 0;
			for(MenuManageJTreeVO menuTextVo : menuCurrentResultList){
				if(i !=0){
					menuText += "<li>&nbsp;&gt; "+menuTextVo.getMenuNm()+"</li>" ;
				}
				i= i+1;
			}
		}else{
			for(MenuManageJTreeVO menuTextVo : menuCurrentResultList){
				menuText += "<li>&nbsp;&gt; "+menuTextVo.getMenuNm()+"</li>" ;
			}
		}
		
		model.addAttribute("menuText", menuText);
		
		model.addAttribute("showOneDepthMenu", showOneDepthMenu); 
    	model.addAttribute("showTwoDepthMenu", showTwoDepthMenu);
    	model.addAttribute("showThreeDepthMenu", showThreeDepthMenu);
    	model.addAttribute("showFourDepthMenu", showFourDepthMenu);
    	model.addAttribute("menuUnderResultList", menuUnderResultList);  //하단매뉴
    	
    	model.addAttribute("menuCurrentResultList", menuCurrentResultList);
    	model.addAttribute("menuLeftResultList", menuLeftResultList);
		model.addAttribute("menuResultList", menuResultList);
		
		
		if(request.getRequestURI().contains("/eng/")){
			return "web/com/engWebCommonNaviWrap";
		}
      	return "web/com/webCommonNaviWrap";
    }
    
    
    /**
     * 사용자 페이지의 네비 상단 매뉴
     */
    @RequestMapping(value="/web/com/naviWrapAjax.do")
    public String webCommonNaviWrapAjax(
    		@RequestParam Map<String, Object> commandMap, HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
		
    	//자신의 위치 정보
    	List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); //자신의 위치
    	List<MenuManageJTreeVO> menuLeftResultList =   new ArrayList<MenuManageJTreeVO>();  //자신이 속한 위치
    	MenuManageVO resultVO = new MenuManageVO();
    	if(null!=(String)commandMap.get("proFn")){ //컨텐츠 타입이면 매뉴아이디 조회
    		MenuManageVO tempMenuManageVO = new MenuManageVO();
    		tempMenuManageVO.setSearchCondition("proFn");
    		tempMenuManageVO.setSearchKeyword((String)commandMap.get("proFn"));
    		resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
    		menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
        	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType());
        	menuManageVO.setMenuNo(resultVO.getMenuNo()+"");
        	menuManageVO.setMenuNo("9151200"); //테스트 
        	menuCurrentResultList =  menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO) ;
        	menuLeftResultList =  menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO) ;
    	}
    	
    	List<MenuManageJTreeVO> showOneDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showTwoDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showThreeDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showFourDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    			
    	for(MenuManageJTreeVO tempLeftMenu : menuLeftResultList){
    		if(tempLeftMenu.getDepth().equals("2")){
    			for(MenuManageJTreeVO tempCurrentTwoMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentTwoMenu.getMenuNo())){
    					showTwoDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("3")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showThreeDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("4")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showFourDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    	}
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		for(MenuManageJTreeVO tempResultVo : menuResultList){  //1 뎁스
			if(tempResultVo.getDepth().equals("1")){
				showOneDepthMenu.add(tempResultVo);
			}
		}
		
		//매뉴구조도 텍스트
		String menuText = "";
		menuText +=  "<li class='home'>&nbsp;</li>" ;
		for(MenuManageJTreeVO menuTextVo : menuCurrentResultList){
			menuText += "<li>&nbsp;&gt; "+menuTextVo.getMenuNm()+"</li>" ;
			
		}
		model.addAttribute("menuText", menuText);
		
		model.addAttribute("showOneDepthMenu", showOneDepthMenu);
    	model.addAttribute("showTwoDepthMenu", showTwoDepthMenu);
    	model.addAttribute("showThreeDepthMenu", showThreeDepthMenu);
    	model.addAttribute("showFourDepthMenu", showFourDepthMenu);
    	
    	model.addAttribute("menuCurrentResultList", menuCurrentResultList);
    	model.addAttribute("menuLeftResultList", menuLeftResultList);
		model.addAttribute("menuResultList", menuResultList);
      	return "web/com/webCommonNaviWrap";
    }
    
    private void setViewMenu(HttpServletRequest request, 
    		Map<String, Object> commandMap , 
    		MenuManageVO tempMenuManageVO,
    		MenuManageVO resultVO,
    		MenuManageJTreeVO menuManageVO) throws Exception {
    	if(request.getRequestURI().contains("/web/survey_back")){//설문조사(각 사이트 마다 이름이 달라) survey > survey_back 으로 사용한
   			tempMenuManageVO.setSearchKeyword("surveyList");
    	}else if(request.getRequestURI().contains("schdlr")){ //스케줄러 경우(일,월,년 url이 달라
    		tempMenuManageVO.setSearchKeyword("schdlrManage");
    	}else if(null!=(String)commandMap.get("proFn") || null!=(String)commandMap.get("bbsId") || null!=(String)commandMap.get("nttId")){ //컨텐츠 타입, 게시판 타입의 경우
    		if(null!=(String)commandMap.get("proFn")){ //컨텐츠
    			tempMenuManageVO.setSearchKeyword((String)commandMap.get("proFn"));
    		}else if(null!=(String)commandMap.get("bbsId")) { //게시판
    			ComDefaultVO searchVO = new ComDefaultVO();
    			String url = progrmManageService.getBbsUrlByNttId((String)commandMap.get("bbsId"));
    			//String url = "/web/cop/bbsWeb/selectBoardList.do?bbsId="+ (String)commandMap.get("bbsId");
    			
    			if(null == url) { //사전정보공표
    				if(null != (String)commandMap.get("pubDetail")) {
    					url = "/web/cop/bbs/PubOperList.do";	
    				}
    				
    				if(null != (String)commandMap.get("tabBbsId")) {
    					url = "/web/cop/bbs/PubOperList.do";	
    				}
    				
    			}
    				
    			searchVO.setSearchKeyword(url);
    			ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
    			if(null != progrmManageVO){
    				tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());	
    			}
    		}else { // nttId 통합검색시
    			
    			BoardVO tempBoardVO = new  BoardVO();
    			tempBoardVO.setNttId(Integer.parseInt((String)commandMap.get("nttId")));
    			BoardMasterVO bmVO = bbsAttrbService.selectBbsIdByNttId(tempBoardVO);
    			ComDefaultVO searchVO = new ComDefaultVO();
    			String url = progrmManageService.getBbsUrlByNttId( bmVO== null ? "" : bmVO.getBbsId());
    			
    			searchVO.setSearchKeyword(url);
    			ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
    			if(null != progrmManageVO){
    				tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());	
    			}
    			
    		}
    	}else{ //ajax 로 검색시
    		//일반 프로그램시
    		if(commandMap.get("url") != null){
    			String menuUrl = request.getRequestURI() ;
    			if(menuUrl.equals("/web/cop/org/selectOrgDetail.do")){
    				menuUrl = "/web/cop/org/selectOrgList.do" ;
    			}
    			ComDefaultVO searchVO = new ComDefaultVO();
    			searchVO.setSearchKeyword(menuUrl);
    			ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
    			if(null != progrmManageVO){
    				tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());	
    			}
    		}else { //조직도 상세
    			String menuUrl = request.getRequestURI() ;
    			if(menuUrl.equals("/web/cop/org/selectOrgDetail.do")){
    				menuUrl = "/web/cop/org/selectOrgList.do" ;
    				ComDefaultVO searchVO = new ComDefaultVO();
        			searchVO.setSearchKeyword(menuUrl);
        			ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
        			if(null != progrmManageVO){
        				tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());	
        			}
    			}
    		}
    	}
    	
    	if(!"dir".equals(tempMenuManageVO.getSearchKeyword())){
    		resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
    	}
    	
		menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	if(resultVO != null){
    		menuManageVO.setMenuNo(resultVO.getMenuNo()+"");
    	}
    }
    
    /**
     * 사용자 페이지의 네비 상단 매뉴
     */
    @RequestMapping(value="/web/com/naviWrap.do")
    public String siteWebCommonNaviWrap(@RequestParam Map<String, Object> commandMap, 
    		HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
		
    	//자신의 위치 정보
    	List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); //자신의 위치
    	List<MenuManageJTreeVO> menuLeftResultList =   new ArrayList<MenuManageJTreeVO>();  //자신이 속한 위치
    	List<MenuManageJTreeVO> menuUnderResultList =   new ArrayList<MenuManageJTreeVO>();  //한단계 하위 위치
    	MenuManageVO resultVO = new MenuManageVO();
    	MenuManageVO tempMenuManageVO = new MenuManageVO();
    	tempMenuManageVO.setSearchCondition("Y");
    	
    	setViewMenu(request ,  commandMap ,  tempMenuManageVO , resultVO , menuManageVO );
    	
    	menuCurrentResultList =  menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO) ;
    	//최상단 매뉴 가져오기 : 상단 그림 변화
    	menuLeftResultList =  menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO) ;
    	menuUnderResultList =  menuCreateManageService.selectMenuUnderListJtreeWeb(menuManageVO) ;
    	
    	
    	List<MenuManageJTreeVO> showOneDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showTwoDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showThreeDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showFourDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    			
    	for(MenuManageJTreeVO tempLeftMenu : menuLeftResultList){
    		if(tempLeftMenu.getDepth().equals("2")){
    			for(MenuManageJTreeVO tempCurrentTwoMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentTwoMenu.getMenuNo())){
    					showTwoDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("3")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showThreeDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("4")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showFourDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    	}
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		for(MenuManageJTreeVO tempResultVo : menuResultList){  //1 뎁스
			if(tempResultVo.getDepth().equals("1")){
				showOneDepthMenu.add(tempResultVo);
			}
		}
		
		//매뉴구조도 텍스트
		String menuText = "";
		menuText +=  "<li class='home'>&nbsp;</li>" ;
		if(request.getRequestURI().contains("/eng")){ //영문사이트
			int i = 0;
			for(MenuManageJTreeVO menuTextVo : menuCurrentResultList){
				if(i !=0){
					menuText += "<li>&nbsp;&gt; "+menuTextVo.getMenuNm()+"</li>" ;
				}
				i= i+1;
			}
		}else{
			for(MenuManageJTreeVO menuTextVo : menuCurrentResultList){
				menuText += "<li>&nbsp;&gt; "+menuTextVo.getMenuNm()+"</li>" ;
			}
		}
		
		
		//메뉴별 비주얼 이미지가져오기
    	PopupzoneVO  popupzoneVo = new PopupzoneVO(); 
        popupzoneVo.setFirstIndex(0);
		popupzoneVo.setRecordCountPerPage(10); //10개까지
		popupzoneVo.setSeCd("01"); //메뉴별 비주얼
		popupzoneVo.setUseYn("Y");
		popupzoneVo.setSearchSortCnd("SORT");
        List<?> popupzoneList_01 = egovPopupManageService.selectPopupzoneList(popupzoneVo);        
    	String topMenuId = "01" ;
    	String subMenuFile = "" ;
    	String pozNmText = "" ;
    	
    	int subMenuFileSize = popupzoneList_01.size() ;
    	
    	if(menuCurrentResultList.size()!=0){
    		//1뎁스 매뉴에서 현제 매뉴의 몇번째인지를 가져온다.
    		int tempCurrentSub = 0;
    		for(MenuManageJTreeVO tempMenuManageJTreeVO : showOneDepthMenu){
    			if(((MenuManageJTreeVO)menuCurrentResultList.get(0)).getMenuNo().equals(tempMenuManageJTreeVO.getMenuNo())){
    				break;
    			}else {
    				tempCurrentSub = tempCurrentSub+1;
    			}
    		}
    		
    		//메인비주얼 맞는 순서를 가져온다.
    		if(subMenuFileSize > 0 ){
    			if(tempCurrentSub > 5 ) { //안보이는 매뉴
    				tempCurrentSub = 0;
    			}
    			try {
    				subMenuFile = (String)((EgovMap)popupzoneList_01.get(tempCurrentSub)).get("popupzoneImageFile") ;
    				pozNmText = (String)((EgovMap)popupzoneList_01.get(tempCurrentSub)).get("pozNm") ;
    			}catch(Exception e) { //이미지 등록 안되 있으면 에러 나서 에러의 경우 
    				subMenuFile = "FILE_000000000000000" ; //임의의 파일
    			}
    			
    			topMenuId = (tempCurrentSub+1)+"";
    		}
    	}
    	
    	//샘플테마사용시 고정 이미지 가져오기
		SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO) ;
		if( !"".equals(siteManagerVO.getTheme()) && null != siteManagerVO.getTheme()){
			model.addAttribute("siteManagerVO", siteManagerVO);
		}
		
    	model.addAttribute("topMenuId", topMenuId); 
    	model.addAttribute("subMenuFile", subMenuFile);
    	model.addAttribute("pozNmText", pozNmText);
    	
		model.addAttribute("menuText", menuText);
		
		model.addAttribute("showOneDepthMenu", showOneDepthMenu); 
    	model.addAttribute("showTwoDepthMenu", showTwoDepthMenu);
    	model.addAttribute("showThreeDepthMenu", showThreeDepthMenu);
    	model.addAttribute("showFourDepthMenu", showFourDepthMenu);
    	model.addAttribute("menuUnderResultList", menuUnderResultList);  //하단매뉴
    	
    	model.addAttribute("menuCurrentResultList", menuCurrentResultList);
    	model.addAttribute("menuLeftResultList", menuLeftResultList);
		model.addAttribute("menuResultList", menuResultList);
		
		if(request.getRequestURI().contains("/eng/")){
			return "web/com/engWebCommonNaviWrap";
		}
      	return "web/com/webCommonNaviWrap";
      	
    }
    
    /**
     * 사용자 좌측 매뉴
     */
    @RequestMapping(value="/web/com/leftMenu.do")
    public String webCommonLeftMenu(
    		@RequestParam Map<String, Object> commandMap, HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
		
    	MenuManageVO resultVO = new MenuManageVO();
    	MenuManageVO tempMenuManageVO = new MenuManageVO();
    	tempMenuManageVO.setSearchCondition("Y");
    	setViewMenu(request ,  commandMap ,  tempMenuManageVO , resultVO , menuManageVO );
		List<MenuManageJTreeVO> menuLeftResultList =  menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO) ;
		model.addAttribute("menuLeftResultList", menuLeftResultList);
		if(request.getRequestURI().contains("/eng/")){
			model.addAttribute("eng", "eng");
		}
      	return "web/com/webCommonLeftMenu";
    }
    
    
    @RequestMapping(value="/{siteId}/web/com/getDivTop.do")
    public String getDivTop(@PathVariable("siteId") String siteId , HttpServletRequest request, 
    		@RequestParam Map<String, Object> commandMap, ModelMap model)
            throws Exception {
    	/*if(!("linc".equals(siteId) || "klc".equals(siteId)) ){
			SiteManagerVO siteManagerVO = new SiteManagerVO();
			siteManagerVO.setSiteId(siteId);
			siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO) ;
			String theme = "01";
			String siteFolder = "site/"+siteId ; 
			if( !"".equals(siteManagerVO.getTheme()) && null != siteManagerVO.getTheme()){
				theme = siteManagerVO.getTheme() ;
				siteFolder = "site/theme_"+theme ;
			}
			
			String isMobile = "PC";
			WebUtil util = new WebUtil();
			if(util.isMobile(request)){
				isMobile = "MOBILE";
			}
			return "web/site/theme_"+theme+"/"+isMobile+"/main/mainPage";
		}*/
    	return "blank";
    	
    }
    
    @RequestMapping("/{siteId}/web/searchTotal.do")
	public String searchTotal(@PathVariable("siteId") String siteId , HttpServletRequest request, @ModelAttribute("searchVO") BoardVO boardVO, 
			@ModelAttribute("searchTotalVO") SearchTotalVO searchTotalVO, ModelMap model
			,RedirectAttributes redirectAttributes) throws Exception {

		BoardMasterVO bmVO = new BoardMasterVO();
		
		searchTotalVO.setPageUnit(propertiesService.getInt("pageUnit"));
		searchTotalVO.setPageSize(propertiesService.getInt("pageSize"));

		PaginationInfo paginationInfo = new PaginationInfo();

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

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

		//List<String, Object> map = bbsMngService.selectBoardTotalSearch(boardVO);
		List<SearchTotalVO> resultList = new ArrayList<SearchTotalVO>();
		resultList = bbsMngService.selectBoardTotalSearch(searchTotalVO); 
		int totCnt = bbsMngService.selectBoardTotalSearchCnt(searchTotalVO); 

		//paginationInfo.setTotalRecordCount(resultList[0]);

		model.addAttribute("resultList", resultList);
		model.addAttribute("totCnt", totCnt);
		paginationInfo.setTotalRecordCount(totCnt);
		model.addAttribute("paginationInfo", paginationInfo);
		model.addAttribute("siteId", siteId);
		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/EgovNoticeList";
			return "web/site/"+siteId+"/"+siteManagerVO.getIsMobile()+"/main/searchTotal";
		}*/
		return "web/"+siteFolder+"/main/searchTotal";
	}
    
    //로그인 세션 연장
    @RequestMapping("/web/com/userSessionExpendAjax.do")
	public ModelAndView userSessionExpendAjax(SiteManagerVO siteManagerVO, HttpSession session
			) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
    	//세션타임 설정(관리자)
		//SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
		session.setMaxInactiveInterval(60* Integer.parseInt(siteManagerVO.getSessionTimeUserCdTxt())); //10분
    	
    	//현재 로그인 시간에서 20분 후 시간 받아오기(로그아웃될 시간)
		//MJUtil mjUtil = new MJUtil();
		//String timer = mjUtil.getAfterTimerDate(20);

		//세션에 로그아웃될 시간 저장해 주기
		//session.setAttribute("timer", timer);
		
		//modelAndView.addObject("timer", timer);
    	
		
		return modelAndView;
	}
    
    
    @RequestMapping(value="/com/getThemeLayout.do")
    public String getThemeLayout(HttpServletRequest request, 
    		@RequestParam Map<String, Object> commandMap, ModelMap model)
            throws Exception {
    	
    	if(commandMap.get("url")!=null){
    		String siteId  = ((String)commandMap.get("url")).split("/")[3] ;
    		
    		SiteManagerVO siteManagerVO = new SiteManagerVO();
    		siteManagerVO.setSiteId(siteId);
    		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO) ;
    		String theme = "01";
    		/*if( !"".equals(siteManagerVO.getTheme()) && null != siteManagerVO.getTheme()){
    			theme = siteManagerVO.getTheme() ;
    			String isMobile = "pc";
    			WebUtil util = new WebUtil();
    			if(util.isMobile(request)){
    				isMobile = "mobile";
    			}
    			//return "web/site/theme_"+theme+"/"+isMobile+"/layout";
    			return "web/site/"+siteId+"/"+isMobile+"/layout";
    		}*/
    		
    		String isMobile = "pc";
			WebUtil util = new WebUtil();
			if(util.isMobile(request)){
				isMobile = "mobile";
			}
			return "web/site/"+siteId+"/"+isMobile+"/layout";
    	}
    	return "blank";
    }
    
    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());
			siteManagerVO.setSiteNm(tempSiteManagerVO.getSiteNm());
		}else{
			siteManagerVO.setTheme("01");
			siteManagerVO.setSiteNm("타이틀");
		}
    	WebUtil util = new WebUtil();
		if(util.isMobile(request)){
			siteManagerVO.setIsMobile("mobile");
		}
		model.addAttribute("siteId", siteManagerVO.getSiteId());
		model.addAttribute("siteNm", siteManagerVO.getSiteNm());
		//model.addAttribute("site_path" , "/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile());
		model.addAttribute("site_path" , "/site/"+siteManagerVO.getSiteId()+"/"+siteManagerVO.getIsMobile());
	}
    
   /* @RequestMapping(value="/{siteId}/web/siteMap.do")
    public String siteMap(@PathVariable("siteId") String siteId, @RequestParam Map<String, Object> commandMap, 
    		HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
		
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ;
		
		model.addAttribute("site_path", "/"+siteFolder);
      	return "web/"+siteFolder+"/member/sitemap";
      	
    }*/
    
    // 사이트맵 개발
    @RequestMapping(value="/{siteId}/web/siteMap.do")
    public String siteMap(@PathVariable("siteId") String siteId, @RequestParam Map<String, Object> commandMap, 
    		HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		//List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtree(menuManageVO) ;
    	menuManageVO.setSiteId(siteId);
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		
		List<String> menuTwoExist = new ArrayList<>();	//2뎁스의 하위 매뉴가 있는것 조회
		HashSet<String> underMenuEmpty = new HashSet<String>();  //2뎁스의 하위매뉴 없는것 조회
		for(MenuManageJTreeVO menuManage : menuResultList){
			if(menuManage.getDepth().equals("3")){
				menuTwoExist.add(menuManage.getUpperMenuId()) ;
			}
			
			if(menuManage.getDepth().equals("2")){
				underMenuEmpty.add(menuManage.getMenuNo());
			}
		}
		
		HashSet<String> underMenuExist = new HashSet<String>(menuTwoExist); //하위매뉴가 있는것 
		underMenuEmpty.removeAll(underMenuExist); //하위매뉴가 없는것
		
		MenuManageJTreeVO menuManageTopVO = new MenuManageJTreeVO();
		menuManageTopVO.setUpperMenuId("#");
		menuManageTopVO.setMenuNo("0");
		
		model.addAttribute("menuResultList", menuResultList);
		model.addAttribute("underMenuExist", underMenuExist);
		model.addAttribute("underMenuEmpty", underMenuEmpty);
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ; 
		model.addAttribute("site_path", "/"+siteFolder);
			
		//샘플테마사용시 고정 이미지 가져오기
		SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO.setSiteId(siteId);
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO) ;
		if( !"".equals(siteManagerVO.getTheme()) && null != siteManagerVO.getTheme()){
			model.addAttribute("siteManagerVO", siteManagerVO);
		}
      	return "web/"+siteFolder+"/member/sitemap";
    }
    
    
    /**
     * 사용자 페이지의 네비 상단 매뉴
     */
    @RequestMapping(value="/{siteId}/web/com/naviWrapAjax.do")
    public String ajaxSiteWebCommonNaviWrap(@PathVariable("siteId") String siteId , @RequestParam Map<String, Object> commandMap, 
    		HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
    		ModelMap model)
            throws Exception {
		
    	//자신의 위치 정보
    	List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); //자신의 위치
    	List<MenuManageJTreeVO> menuLeftResultList =   new ArrayList<MenuManageJTreeVO>();  //자신이 속한 위치
    	List<MenuManageJTreeVO> menuUnderResultList =   new ArrayList<MenuManageJTreeVO>();  //한단계 하위 위치
    	MenuManageVO resultVO = new MenuManageVO();
    	MenuManageVO tempMenuManageVO = new MenuManageVO();
    	tempMenuManageVO.setSearchCondition("Y");
    	
    	setViewMenu(request ,  commandMap ,  tempMenuManageVO , resultVO , menuManageVO );
    	
    	menuCurrentResultList =  menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO) ;
    	//최상단 매뉴 가져오기 : 상단 그림 변화
    	menuLeftResultList =  menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO) ;
    	menuUnderResultList =  menuCreateManageService.selectMenuUnderListJtreeWeb(menuManageVO) ;
    	
    	
    	List<MenuManageJTreeVO> showOneDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showTwoDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showThreeDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    	List<MenuManageJTreeVO> showFourDepthMenu = new ArrayList<MenuManageJTreeVO>(); 
    			
    	for(MenuManageJTreeVO tempLeftMenu : menuLeftResultList){
    		if(tempLeftMenu.getDepth().equals("2")){
    			for(MenuManageJTreeVO tempCurrentTwoMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentTwoMenu.getMenuNo())){
    					showTwoDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("3")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showThreeDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    		if(tempLeftMenu.getDepth().equals("4")){
    			for(MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList){
    				if(tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())){
    					showFourDepthMenu.add(tempLeftMenu);
    				}
    			}
    		}
    		
    	}
    	
    	menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
    	menuManageVO.setMenuUserType(menuManageVO.getMenuUserType()); 
		List<MenuManageJTreeVO> menuResultList =  menuCreateManageService.selectMenuListJtreeWeb(menuManageVO) ;
		for(MenuManageJTreeVO tempResultVo : menuResultList){  //1 뎁스
			if(tempResultVo.getDepth().equals("1")){
				showOneDepthMenu.add(tempResultVo);
			}
		}
		
		model.addAttribute("showOneDepthMenu", showOneDepthMenu); 
    	model.addAttribute("showTwoDepthMenu", showTwoDepthMenu);
    	model.addAttribute("showThreeDepthMenu", showThreeDepthMenu);
    	model.addAttribute("showFourDepthMenu", showFourDepthMenu);
    	model.addAttribute("menuUnderResultList", menuUnderResultList);  //하단매뉴
    	
    	model.addAttribute("menuCurrentResultList", menuCurrentResultList);
    	model.addAttribute("menuLeftResultList", menuLeftResultList);
		model.addAttribute("menuResultList", menuResultList);
		
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/"+siteId ;
		model.addAttribute("site_path", "/"+siteFolder);
		
      	return "web/"+siteFolder+"/com/webCommonNaviWrapAjax";
    }
    
 
    
    /* 메일전송 첨부파일등록/수정 view*/
    @RequestMapping(value="/itn/mail/itnSendMailForm.do")
    public String intSendMailForm(@RequestParam Map<?, ?> commandMap, @ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
            HttpServletRequest request, HttpServletResponse response, 
            RedirectAttributes redirectAttributes  , Model model , HttpSession session)
            throws Exception  {
    	
    	List<FmsFileVO> fmsFileList = new ArrayList<FmsFileVO>();
	    model.addAttribute("fmsFileList", fmsFileList); //fms파일정보
	    List<FmsFileVO> fileList = new ArrayList<>();
	    model.addAttribute("fileList", fileList);
    	return "uss/ion/fms/ItnSendMailForm";
    } 
    
    /* 메일전송  process */
    @RequestMapping(value="/itn/mail/itnSendMailPro.do")
    public ModelAndView insertFmsFileOrg(@RequestParam Map<?, ?> commandMap, @ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO, final MultipartHttpServletRequest multiRequest,
    	HttpServletRequest request,	HttpServletResponse response, Model model) throws Exception  {
    	
    	ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
    	String recipient = Globals_email_toEmail; //받는 사람의 메일주소를 입력해주세요.   
    	Properties props = System.getProperties();  // SMTP 서버 정보 설정 
    	props.put("mail.smtp.host", Globals_email_host);  
    	props.put("mail.smtp.port", Globals_email_port);  
    	props.put("mail.smtp.auth", "true");  
    	props.put("mail.smtp.ssl.enable", "true");  
    	props.put("mail.smtp.ssl.trust", Globals_email_host);  

    	Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { //Session 생성  
	    	protected javax.mail.PasswordAuthentication getPasswordAuthentication() {  
	    		return new javax.mail.PasswordAuthentication(Globals_email_fromUser, Globals_email_fromEmail_password);  
	    	}  
    	});
    	
    	//테스트용 
    	String revRecipient = (String)commandMap.get("emailAddrRev") ;
    	
    	try {
	    	Message message = new MimeMessage(session); //MimeMessage 생성 
	    	message.setFrom(new InternetAddress(Globals_email_fromEmail)); //발신자 셋팅 , 보내는 사람의 이메일주소를 한번 더 입력합니다. 이때는 이메일 풀 주소를 다 작성해주세요.  
	    	message.setRecipient(Message.RecipientType.TO, new InternetAddress(revRecipient)); //수신자셋팅
	    	message.addRecipient(Message.RecipientType.BCC, new InternetAddress(Globals_email_toEmail_BCC)); //숨은참조자
	    	message.setSubject((String)commandMap.get("subject")); //제목셋팅 
	    	
	    	// 메일 내용을 설정을 위한 클래스를 설정합니다.
	    	message.setContent(new MimeMultipart());
	    	// 메일 내용을 위한 Multipart클래스를 받아온다. (위 new MimeMultipart()로 넣은 클래스입니다.)
	    	Multipart multipart = (Multipart) message.getContent();
	    	// html 형식으로 본문을 작성해서 바운더리에 넣습니다.
	    	
	    	
	    	StringBuffer contentBf = new StringBuffer();
	    	contentBf.append("<작성자 메일주소 >: " + (String)commandMap.get("emailAddr")) ;
	    	contentBf.append("\r\n") ;
	    	contentBf.append("\r\n") ;
	    	contentBf.append("\r\n") ;
	    	contentBf.append("<내용> ") ;
	    	contentBf.append("\r\n") ;
	    	contentBf.append((String)commandMap.get("content")) ;
	    	multipart.addBodyPart(getContents(contentBf.toString()));
	    	
	    	/*파일등록 */
	    	List<FileVO> result = null;
	    	String uploadFolder = "";
	    	final Map<String, MultipartFile> files = multiRequest.getFileMap();
	    	FileVO vo = null;
	    	String realFileLoc = "" ;
	    	if (!files.isEmpty()){
	    		result = fileUtil.parseFileInf(files, "MAIL_", 0, "", uploadFolder, "");
	    		
				Iterator<FileVO> iter = result.iterator();
				while (iter.hasNext()) {
					vo = iter.next();
					realFileLoc = vo.getFileStreCours()+vo.getStreFileNm() ;
					//addMulitAttachment(multipart , "C:"+realFileLoc , vo.getOrignlFileNm());
					addMulitAttachment(multipart , realFileLoc , vo.getOrignlFileNm());
				}
				if (vo == null) {
				} else {
				}
	    	}
	    	Transport.send(message);
    	}catch(Exception e) {
        	
        }
    	return modelAndView;
    }
    
    // 파일을 로컬로 부터 읽어와서 BodyPart 클래스로 만든다. (바운더리 변환)
    private BodyPart getFileAttachment(String realFile, String filename) throws MessagingException {
	    // BodyPart 생성
	    BodyPart mbp = new MimeBodyPart();
	    // 파일 읽어서 BodyPart에 설정(바운더리 변환)
	    File file = new File(realFile);
	    DataSource source = new FileDataSource(file);
	    mbp.setDataHandler(new DataHandler(source));
	    mbp.setDisposition(Part.ATTACHMENT);
	    //mbp.setFileName(filename);
	    try {
	    	mbp.setFileName(MimeUtility.encodeText(filename, "euc-kr","B"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //한글깨짐방지
	    
	    return mbp;
    }
    
    // 다수의 파일 첨부 파일을 로컬로 부터 읽어와서 BodyPart 클래스로 만든다. (바운더리 변환)
    private void  addMulitAttachment(Multipart multipart, String realFileLoc, String filename) throws MessagingException {
    	try {
	    	DataSource source = new FileDataSource(realFileLoc);
		    BodyPart messageBodyPart = new MimeBodyPart();        
		    messageBodyPart.setDataHandler(new DataHandler(source));
			messageBodyPart.setFileName(MimeUtility.encodeText(filename)  ); //한글깨짐방지
		    multipart.addBodyPart(messageBodyPart);
    	}catch (UnsupportedEncodingException e) {
 			e.printStackTrace();
 		}
    }
    
    // 메일의 본문 내용 설정
    private BodyPart getContents(String html) throws MessagingException {
	    BodyPart mbp = new MimeBodyPart();
	    mbp.setText(html); // setText를 이용할 경우 일반 텍스트 내용으로 설정된다.
	    // html 형식으로 설정(줄개행 > br로)
	    //mbp.setContent(html.replaceAll("(\r\n|\n)", "<br />"), "text/html; charset=utf-8"); //줄바꿈이 필요해서
	    return mbp;
    }
    
    /**
     * 복호화
     * 
     * @param privateKey
     * @param securedValue
     * @return
     * @throws Exception
     */
    private String decryptRsa(PrivateKey privateKey, String securedValue) throws Exception {
        Cipher cipher = Cipher.getInstance(MainController.RSA_INSTANCE);
        byte[] encryptedBytes = hexToByteArray(securedValue);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        String decryptedValue = new String(decryptedBytes, "utf-8"); // 문자 인코딩 주의.
        return decryptedValue;
    }
    
	/**
     * 16진 문자열을 byte 배열로 변환한다.
     * 
     * @param hex
     * @return
     */
    public static byte[] hexToByteArray(String hex) {
        if (hex == null || hex.length() % 2 != 0) { return new byte[] {}; }
 
        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < hex.length(); i += 2) {
            byte value = (byte) Integer.parseInt(hex.substring(i, i + 2), 16);
            bytes[(int) Math.floor(i / 2)] = value;
        }
        return bytes;
    }
	
	/**
	 * rsa 공개키, 개인키 생성
	 * 
	 * @param request
	 */
	public void initRsa(HttpServletRequest request) {
	    HttpSession session = request.getSession();

	    KeyPairGenerator generator;
	    try {
	        generator = KeyPairGenerator.getInstance(MainController.RSA_INSTANCE);
	        generator.initialize(1024);

	        KeyPair keyPair = generator.genKeyPair();
	        KeyFactory keyFactory = KeyFactory.getInstance(MainController.RSA_INSTANCE);
	        PublicKey publicKey = keyPair.getPublic();
	        PrivateKey privateKey = keyPair.getPrivate();

	        session.setAttribute(MainController.RSA_WEB_KEY, privateKey); // session에 RSA 개인키를 세션에 저장

	        RSAPublicKeySpec publicSpec = (RSAPublicKeySpec) keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);
	        String publicKeyModulus = publicSpec.getModulus().toString(16);
	        String publicKeyExponent = publicSpec.getPublicExponent().toString(16);

	        request.setAttribute("RSAModulus", publicKeyModulus); // rsa modulus 를 request 에 추가
	        request.setAttribute("RSAExponent", publicKeyExponent); // rsa exponent 를 request 에 추가
	    } catch (Exception e) {
	        // TODO Auto-generated catch block
	        e.printStackTrace();
	        
	        System.out.println("======================================================");
			System.out.println("=                RSA generator is fail               =");
			System.out.println("=                   MainController                   =");
			System.out.println("======================================================");
	    }
	}
	
	/*최초 사이트 체크와 동시에 session 설정, 점검중 페이지 적용 */
	@RequestMapping(value="/web/com/insp.do")
    public String insp(HttpServletRequest request, ModelMap model)
            throws Exception {
		
		return "/web/com/insp";
	}
	
	
	// 타인에게 전송받은 주소록 수신대기 목록 조회하기  
	@RequestMapping(value="/web/main/addrRecvListAjax.do")
	public ModelAndView addrRecvListAjax(final MultipartHttpServletRequest multiRequest
			, RedirectAttributes redirectAttributes
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		List<?> addrRecvList = null;
		
		try {
			String userId = "";
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
				userId = user.getId();
			}
			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  			
  			AddrTransHistVO addrTransHistVO = new AddrTransHistVO();
  			addrTransHistVO.setRecordCountPerPage(10000);  //10000개까지
  			addrTransHistVO.setFirstIndex(0);  
			addrTransHistVO.setRecvMberId(userId);
			addrRecvList = addrTransHistService.selectAddrTransWaitList(addrTransHistVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
		modelAndView.addObject("addrRecvList", addrRecvList);
		modelAndView.addObject("addrRecvListSize", addrRecvList.size());
			
		return modelAndView;
	}		

	// 타인에게 전송받은 주소록 수신대기 목록 저장하기
	@RequestMapping(value="/web/main/addrRecvSaveAjax.do")
	public ModelAndView addrRecvSaveAjax(final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("addrTransHistVO") AddrTransHistVO addrTransHistVO
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
		try {
			String userId = "";
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
				userId = user.getId();
			}
			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  	
			addrTransHistVO.setRecordCountPerPage(10000);  //10000개까지
			addrTransHistVO.setFirstIndex(0);  			
			addrTransHistVO.setRecvMberId(userId);
			addrTransHistService.updateAddrRecvListAll(addrTransHistVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}	
	
	
	// 주소록 수신 거절
	@RequestMapping(value="/web/main/addrRecvRejectAjax.do")
	public ModelAndView addrRecvRejectAjax(final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("addrTransHistVO") AddrTransHistVO addrTransHistVO
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
		try {
			String userId = "";
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
				userId = user.getId();
			}
			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  	
			addrTransHistVO.setRecordCountPerPage(10000);  //10000개까지
			addrTransHistVO.setFirstIndex(0);  			
			addrTransHistVO.setRecvMberId(userId);
			addrTransHistService.updateAddrRecvListAll(addrTransHistVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}	
	
	
	// 타인에게 전송받은 주소록 수신대기 목록 조회하기  
	@RequestMapping(value="/web/main/fax/faxAddrRecvListAjax.do")
	public ModelAndView faxAddrRecvListAjax(final MultipartHttpServletRequest multiRequest
			, RedirectAttributes redirectAttributes
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		List<?> addrRecvList = null;
		
		try {
			String userId = "";
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
				userId = user.getId();
			}
			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  			
  			FaxAddrTransHistVO addrTransHistVO = new FaxAddrTransHistVO();
  			addrTransHistVO.setRecordCountPerPage(10000);  //10000개까지
  			addrTransHistVO.setFirstIndex(0);  
			addrTransHistVO.setRecvMberId(userId);
			addrRecvList = faxAddrTransHistService.selectFaxAddrTransWaitList(addrTransHistVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
		modelAndView.addObject("faxAddrRecvList", addrRecvList);
		modelAndView.addObject("faxAddrRecvListSize", addrRecvList.size());
			
		return modelAndView;
	}		

	// 타인에게 전송받은 주소록 수신대기 목록 저장하기
	@RequestMapping(value="/web/main/fax/faxAddrRecvSaveAjax.do")
	public ModelAndView faxAddrRecvSaveAjax(final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("addrTransHistVO") FaxAddrTransHistVO addrTransHistVO
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
		try {
			String userId = "";
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
				userId = user.getId();
			}
			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  	
			addrTransHistVO.setRecordCountPerPage(10000);  //10000개까지
			addrTransHistVO.setFirstIndex(0);  			
			addrTransHistVO.setRecvMberId(userId);
			faxAddrTransHistService.updateFaxAddrRecvListAll(addrTransHistVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}	
	
	
	// 주소록 수신 거절
	@RequestMapping(value="/web/main/fax/faxAddrRecvRejectAjax.do")
	public ModelAndView faxAddrRecvRejectAjax(final MultipartHttpServletRequest multiRequest
			, @ModelAttribute("addrTransHistVO") FaxAddrTransHistVO addrTransHistVO
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
		try {
			String userId = "";
			LoginVO user = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
			if(EgovUserDetailsHelper.isAuthenticated() && user!=null) {
				userId = user.getId();
			}
			
  			// 타인에게 전송받은 주소록 수신대기 목록 조회하기  	
			addrTransHistVO.setRecordCountPerPage(10000);  //10000개까지
			addrTransHistVO.setFirstIndex(0);  			
			addrTransHistVO.setRecvMberId(userId);
			faxAddrTransHistService.updateFaxAddrRecvListAll(addrTransHistVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);        		
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}	
	
	
	// 해외아이피 체크 
	@RequestMapping(value="/web/main/selectForienIpCheckAjax.do")
	public void selectForienIpCheckAjax(HttpServletRequest request) {
		
		try {
			
			String ipAddress = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
		    if (ipAddress == null) {
		    	ipAddress = request.getRemoteAddr();
		    	System.out.println("+++++++++++++ ipAddress ::: "+ipAddress);
		    }
		    
			boolean resultSts = MjonForienIpChk.getForienCountryValue(ipAddress);
			
			System.out.println("++++++++++++++++ 국내 아이피 여부(국내 : true, 해외 : false) ::: "+resultSts);
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	// 후불제여부(후불 : true, 선불 : false)
	@RequestMapping(value="/web/main/selectUserAfterPayAjax.do")
	public ModelAndView selectUserAfterPayAjax(@ModelAttribute UserManageVO userManageVO
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		boolean isAfterPay = false;		// 후불여부
		String msg = "";
		
		//로그인 권한정보 불러오기
    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
    	
		try {
			int isAfterPayCnt = userManageService.selectUserAfterPayInfo(userId);
    		if (isAfterPayCnt > 0) {
    			isAfterPay = true;
    		}		
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("isAfterPay", isAfterPay);
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}			
	
	// 대시보드 통계 업데이트
	@RequestMapping(value="/web/main/dashBoardStatAjax.do")
	public ModelAndView dashBoardStatAjax(@ModelAttribute StatsVO statsVO
			, HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
    	
		try {
			// 오늘날짜
			Date nowDate = new Date();
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
			String strNowDate = simpleDateFormat.format(nowDate); 
			
			if (null == statsVO.getStatDate() || statsVO.getStatDate().equals("")) {
				statsVO.setStatDate(strNowDate);
			}

			// 대시보드 인서트 Logic
			conectStatsService.insertDashBoardStatLogic(statsVO);
	
			// 대시보드 업데이트 Logic
			conectStatsService.updateDashBoardStatLogic(statsVO);

		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
			
		return modelAndView;
	}
	
	private String getClientIP(HttpServletRequest request) {
    	String ip = "";
    	
    	try {
            ip = request.getHeader("X-Forwarded-For") == null ? request.getHeader("X-Forwarded-For") : request.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
            //logger.info("> X-FORWARDED-FOR : " + ip);
            //System.out.println("> X-FORWARDED-FOR : " + ip);

            if (ip == null) {
                ip = request.getHeader("Proxy-Client-IP");
                //System.out.println("> Proxy-Client-IP : " + ip);
            }
            if (ip == null) {
                ip = request.getHeader("WL-Proxy-Client-IP");
                //System.out.println(">  WL-Proxy-Client-IP : " + ip);
            }
            if (ip == null) {
                ip = request.getHeader("HTTP_CLIENT_IP");
                //System.out.println("> HTTP_CLIENT_IP : " + ip);
            }
            if (ip == null) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
                //System.out.println("> HTTP_X_FORWARDED_FOR : " + ip);
            }
            if (ip == null) {
                ip = request.getRemoteAddr();
                //System.out.println("> getRemoteAddr : "+ip);
            }
            //System.out.println("> Result : IP Address : "+ip);    		
    	}catch(Exception ex)
    	{
    		ex.printStackTrace();
    	}

        return ip;
    }
	
	private Boolean inspPagePath(HttpServletRequest request, String userIP, SiteManagerVO siteManagerVO) {
//		if("IP".equals(siteManagerVO.getSysMaintenance())) {
//			if(!StringUtils.isEmpty(siteManagerVO.getSysMaintenanceIp())) {
//				if(!Arrays.stream(siteManagerVO.getSysMaintenanceIp().split(",")).anyMatch(userIP::equals)) {
//					/* 점검중 */
//					return false;
//				}
//			} else {
//				/* 점검중 */
//				return false;
//			}
//		}
		if("PATH".equals(siteManagerVO.getSysMaintenance())) {
			if("/web/main/mainPage.do".equals(request.getRequestURI())) {
				/* 점검중 */
				return false;
			}
		}
		return true;
	}
	
	private Boolean inspPageIp(HttpServletRequest request, String userIP, SiteManagerVO siteManagerVO) {
		if("IP".equals(siteManagerVO.getSysMaintenance())) {
			if(!StringUtils.isEmpty(siteManagerVO.getSysMaintenanceIp())) {
				if(!Arrays.stream(siteManagerVO.getSysMaintenanceIp().split(",")).anyMatch(userIP::equals)) {
					/* 점검중 */
					return false;
				}
			} else {
				/* 점검중 */
				return false;
			}
		}
//		if("PATH".equals(siteManagerVO.getSysMaintenance())) {
//			if("/web/main/mainPage.do".equals(request.getRequestURI())) {
//				/* 점검중 */
//				return false;
//			}
//		}
		return true;
	}
}
    