728x90

소스 개발이 끝이 났으면 이제 실행해보자

pom.xml 이 있는 경우

상단 메뉴의 프로젝트 > 실행 > 실행명령 추가 > new run java(maven) 을 실행한다.

화면 가운데에 실행명령어와 웹브라우저 접속 경로가 나온다.

실행명령으로 서버가 시작되면 브라우저에 해당 경로를 입력한다.

오류가 있으면 정상적으로 실행이 되지 않으므로 터미널의 오류 메세지를 확인한다.

ctrl + c 로 중단할 수 있고

다시 가동시킬 때에는 터미널에
mvn spring-boot:run

입력하고 엔터를 치면 서버가 가동된다.

 

728x90
728x90

2020-10-28 00:21:03.762 TRACE 11388 --- [nio-8080-exec-7] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [2]

2020-10-28 00:21:03.764 TRACE 11388 --- [nio-8080-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([role_id1_2_1_] : [INTEGER]) - [2]

2020-10-28 00:21:03.764 TRACE 11388 --- [nio-8080-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name2_2_1_] : [VARCHAR]) - [null]

2020-10-28 00:21:03.764 TRACE 11388 --- [nio-8080-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([user_id3_4_0_] : [BIGINT]) - [2]

2020-10-28 00:21:03.764 TRACE 11388 --- [nio-8080-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([role_id2_4_0_] : [INTEGER]) - [2]

 

2020-10-28 00:21:03.870 ERROR 11388 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.IllegalArgumentException:

---------

spring security 에서 로그인 시 위와 같은 오류가 난다면

return 된 parameter 중 null인 값이 있어서 그럴 수 있다.

쿼리문을 실행시켜본 다음 null인 Column 과 Class의 parameter name이 동일한지 확인

728x90
728x90

java update 메세지가 자꾸 나와서

sts 상에서 그냥 update를 눌렀더니.... 11이상 설치하라는...

STS버전이 4.4

JAVA는 1.8

이게 뭐야... 어쩔 수 없이

JAVA를 15로 upgrade했는데... lib가 호환이 안되는 것들이 좀 있나보다.

결국 찾아낸 간단한 방법

sts 홈페이지에서 4.8 받으니 문제 해결 됨.... ㅜ.ㅜ

 

728x90
728x90

구름 IDE에서 영카트 설치하는 방법.

컨테이너에 php를 선택하면 되는데

github에 영카트 소스가 있기 때문에 github 주소를 이용하여

공개범위 : Private (Public 로 하면 git/svn 고르기가 안됨)
템플릿 : Git/SVN
   - TYPE : Git
   - REPOSITORY URL : github.com/gnuboard/youngcart5.git
   - 인증 : Anonymous (별도의 인증 필요없음)

Test버튼을 누르면 -> Success로 연결 됨.

소프트웨어 스택에서 PHP 선택

Mysql 설치에 체크하고 "컨테이너 생성"

 

생성이 되면

Young cart 소스가 이미 생성되어 있다
(연결 안했으면 앞으로 PHP 파일을 만들어 가면 된다)

 

서버를 가동해야 화면이 뜨는데

상단메뉴에서
프로젝트 - 실행 - 실행명령 추가 를 누르면

new run php 라는 탭이 생긴다.
'실행' 버튼을 눌러 서버를 가동시킨다.

가동완료되면 아래쪽에 명령탭에 시작되었다고 나온다.
server started at ...
Listening on ...
Press Ctrl-C to quit

서버를 가동시키지 않으면
프로젝트 - 실행 URL과 포트 에 실행용 URL 을 클릭했을 때( 아래 그림에서 빨간색 동그라미 버튼)

-- 서버가 실행중이지 않으면

 

-- 서버가 실행 중이면 그누보드 설치화면이 나온다.

그누보드5 설치하기 버튼을 누른다.

 

먼저 data라는 폴더하면
config.php가 위치한 곳에 data 디렉터리를 만들어 준다

mkdir data
cd data
ls 로 파일이 생성되었는지 확인

 

또는 프로젝트에서 추가버튼으로 폴더 추가, 파일 추가를 해도 된다.

 

그누보드 생성 진행

DB설정정보, 최고관리자 정보 입력

 

---

생성이 제대로 안되는 경우는 root 계정으로 시도한다.
root 계정 password 변경

alter user 'root'@'localhost' identified with mysql_native_password by '1111';

서버를 재가동한다.
new run php 탭에서 '종료'버튼 누른 후 다시 '시작' 버튼 클릭

 

728x90
728x90

Spring Security로 로그인을 구현할 때

기본 password는 BCryptPasswordEncoder 를 사용한다.

mysql의 password() 를 사용하여 password를 저장하는 경우에는 맞지 않기 때문에

MysqlPasswordEncoder를 만들어 적용한다.

--------------------

import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import org.springframework.security.crypto.password.PasswordEncoder;

public class MySqlPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence rawPassword) {
        if (rawPassword == null) {
            throw new NullPointerException();
        }
        byte[] bpara = new byte[rawPassword.length()];
        byte[] rethash;
        int i;

        for (i = 0; i < rawPassword.length(); i++)
            bpara[i] = (byte) (rawPassword.charAt(i) & 0xff);

        try {
            MessageDigest sha1er = MessageDigest.getInstance("SHA1");
            rethash = sha1er.digest(bpara); // stage1
            rethash = sha1er.digest(rethash); // stage2
        } catch (GeneralSecurityException e) {
            throw new RuntimeException(e);
        }

        StringBuffer r = new StringBuffer(41);
        r.append("*");

        for (i = 0; i < rethash.length; i++) {
            String x = Integer.toHexString(rethash[i] & 0xff).toUpperCase();
            if (x.length() < 2) r.append("0"); r.append(x);
        }
        return r.toString();
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        if (encodedPassword == null || rawPassword == null) { return false; }
        if (!encodedPassword.equals(encode(rawPassword))) { return false; }
        return true;
    }
}

-------------------

사용방법 : UserServiceImpl 등 login 처리를 하는 class에서

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    
    @Autowired
    private MySqlPasswordEncoder mysqlPasswordEncoder;
...

//user.setPassword(passwordEncoder.encode(registration.getPassword())); user.setPassword(mysqlPasswordEncoder.encode(registration.getPassword()));

 

기존에 사용하던 BCryptPasswordEncoder 대신 MysqlPasswordEncoder 를 사용하면 됨.

728x90
728x90

블로그꾸미기 1에서 web, service, dao 등을 bbs에서 복사해서 사용했다.
그런데.. VO 파일에서 오류가 난다.

egovframework.com.cop.bbs.service.BoardVO cannot be cast to egovframework.blog.service.BoardVO

귀찮아서 그랬는데 casting이 안된다. extends BoardVO로 해도 마찬가지..

그냥 BlogController에서 호출하는 서비스를 EgovEgovArticleService 로 한다.

그리고 egov는 기본적으로 로그인 된 유저를 기본으로 하다보니...
로그인체크를 여러군데에서 한다.

 

로그인부분은 comment 를 조회할 때 로그인되어 있지 않아 저리로 보내버린다...
결국 comment 조회, 저장로직은 수정이 필요하겠다.

    /**
     * 게시물에 대한 목록을 조회한다.
     * 
     * @param boardVO
     * @param sessionVO
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/blog/selectArticleList.blog")
    public String selectArticleList(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception {
String bbsId = "BBSMSTR_000000000002";// 블로그는 1개만 운영하므로 생성된 블로그의 bbsId 사용-- 나중에 property로
        boardVO.setBbsId(bbsId);
        boardVO.setBbsNm(boardVO.getBbsNm());
boardVO.setPageUnit(propertyService.getInt("pageUnit"));
boardVO.setPageSize(propertyService.getInt("pageSize"));

PaginationInfo paginationInfo = new PaginationInfo();

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

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

Map<String, Object> map = blogArticleService.selectArticleList(boardVO);
int totCnt = Integer.parseInt((String)map.get("resultCnt"));

//공지사항 추출
List noticeList = blogArticleService.selectNoticeArticleList(boardVO);

paginationInfo.setTotalRecordCount(totCnt);

model.addAttribute("resultList", map.get("resultList"));
model.addAttribute("resultCnt", map.get("resultCnt"));
model.addAttribute("articleVO", boardVO);
model.addAttribute("bbsNm", "Custom Blog Sample");
model.addAttribute("bbsId", bbsId);
model.addAttribute("bbsTmplatCours", "/css/egovframework/com/cop/tpl/egovBaseTemplate.css");//기본 BBS template 지정 : css 경로. 추후 변경
model.addAttribute("paginationInfo", paginationInfo);
model.addAttribute("noticeList", noticeList);
return "egovframework/com/blog/BlogArticleList";
    }
    
    
    
    /**
     * 게시물에 대한 상세 정보를 조회한다.
     * 
     * @param boardVO
     * @param sessionVO
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/blog/selectArticleDetail.blog")
    public String selectArticleDetail(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception {

BoardVO vo = blogArticleService.selectArticleDetail(boardVO);

model.addAttribute("result", vo);
//----------------------------
// template 처리 (기본 BBS template 지정  포함)
//----------------------------
model.addAttribute("bbsTmplatCours", "/css/egovframework/com/cop/tpl/egovBaseTemplate.css");//기본 BBS template 지정 : css 경로. 추후 변경
////-----------------------------
if (egovArticleCommentService != null){
if (egovArticleCommentService.canUseComment(boardVO.getBbsId())) {
    model.addAttribute("useComment", "true");
}
}
////--------------------------
model.addAttribute("bbsId", "BBSMSTR_000000000002");// 블로그는 1개만 운영하므로 생성된 블로그의 bbsId 사용-- 나중에 property로
return "egovframework/com/blog/BlogArticleDetail";
    }
728x90
728x90

실제로 /blog/selectArticleList.do 를 하면 로그인 페이지로 넘어간다
(정상적으로 화면이 보였다면 다른 세션으로 로그인 해서 filter를 통과한 경우이다.)

간단히 해결하는 방법은 .do 대신 .blog를 사용하면 된다.

호출하는 url을 바꾸면 되는 것인데

    @RequestMapping("/blog/selectArticleList.blog")
    public String selectArticleList(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception

와 같이 하면 된다.

src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml 에

 

그리고 블로그 게시물이 1개 있었는데 안나왔던 이유는

controller에서 bbsID 가 없어서였다.
원래는 넘겨받는 boardVO 안에 bbsId가 있으나 이번경우는 블로그도 1개만운영하고 바로 호출하므로 직접 하드코딩한다.

 

쿼리 로그 확인시 bbsId가 있는것이 확인되고
실행해보면 게시글 1개가 있다.

SELECT a.NTT_ID, a.NTT_SJ, a.NTT_CN, a.FRST_REGISTER_ID, IFNULL(b.USER_NM, a.NTCR_NM) as FRST_REGISTER_NM, 
DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM, a.RDCNT, a.PARNTSCTT_NO, 
a.ANSWER_AT, a.ANSWER_LC, a.USE_AT, a.ATCH_FILE_ID, a.BBS_ID, a.NTCE_BGNDE, a.NTCE_ENDDE, a.SJ_BOLD_AT, 
a.NOTICE_AT, a.SECRET_AT, c.COMMENT_CO 
FROM COMTNBBS a LEFT OUTER JOIN COMVNUSERMASTER b 
ON a.FRST_REGISTER_ID = b.ESNTL_ID 
LEFT OUTER JOIN (SELECT NTT_ID, BBS_ID, COUNT(1) AS COMMENT_CO 
FROM COMTNCOMMENT WHERE USE_AT = 'Y' GROUP BY NTT_ID, BBS_ID) c 
ON a.NTT_ID = c.NTT_ID AND a.BBS_ID = c.BBS_ID 
WHERE a.BBS_ID = 'BBSMSTR_000000000002' AND a.USE_AT = 'Y' AND a.NTT_SJ 
LIKE CONCAT ('%', '','%') ORDER BY a.SORT_ORDR DESC, NTT_NO ASC LIMIT 10 OFFSET 0 
;

 

이제 jsp파일을 수정할 차례

BlogArticleList.jsp 파일에서

cop/bbs/selectArticleList.do 등  cop/bbs -> blog로, .do로 되어있는 것을 .blog로 모두 찾아 바꿔준다.

 

728x90
728x90

전자정부 프레임워크를 통해 게시판, 블로그 등을 쉬게 생성할 수 있다.

그러나 내 입맞대로 고치기 어려워 관련내용을 남긴다.

컨셉 : 관리는 기존 전자정부프레임워크를 그대로 쓰고 이용자 화면만 별도로 만든다.

먼저 관리자 로그인 한 뒤에 블로그를 생성한다.
기본개념이 블로그를 여러개 만들수 있도록 되어있다.
블로그 추가방법은 아래 링크 참조
https://nobang.tistory.com/entry/%EC%A0%84%EC%9E%90%EC%A0%95%EB%B6%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%B6%94%EA%B0%80

기존로직은 그대로(글쓰기, 글저장, 글목록, 글내용보기) 두고
글목록과 글 내용보기만 별도로 만든다.

1. Controller, Service, DAO, VO 등 서버단
참조 대상

유형 대상소스 비고
Controller egovframework.com.cop.bbs.EgovBBSAttributeManageController.java 게시판 관리를 위한 컨트롤러 클래스
Service egovframework.com.cop.bbs.service.EgovBBSAttributeManageService.java 게시판 관리를 위한 서비스 인터페이스
ServiceImpl egovframework.com.cop.bbs.service.impl.EgovBBSAttributeManageServiceImpl.java 게시판 관리를 위한 서비스 구현 클래스
DAO egovframework.com.cop.bbs.service.impl.EgovBBSAttributeManageDAO.java 게시판 관리를 위한 데이터처리 클래스
VO egovframework.com.cop.bbs.service.BoardMaster.java 게시판 관리를 위한 모델 클래스
VO egovframework.com.cop.bbs.service.BoardMasterVO.java 게시판 관리를 위한 VO 클래스

Blog만 사용할 예정이므로 blog package를 새로 만들고 그 아래에 각 파일들을 위치시킨다.

특이하게 service package에 Board, BoardVO가 위치해있다.(구조는 그대로 가져가기로 했으므로 그대로 사용)
기존서비스는 그대로 사용할 예정이므로 Board, BoardVO는 package경로만 확인한다.

이제 BBS로 되어있는 것을 Blog로 바꾸는 작업이다. 오류를 최소화 하기 위해 아랫단부터 변경한다.

- dao 도 특이하게 service.impl과 같이있다..
 

package egovframework.blog.service.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import egovframework.com.cmm.service.impl.EgovComAbstractDAO;
import egovframework.blog.service.Board;
import egovframework.blog.service.BoardVO;

@Repository("BlogArticleDAO")
public class BlogArticleDAO extends EgovComAbstractDAO {

public List<?> selectArticleList(BoardVO boardVO) {
return list("BBSArticle.selectArticleList", boardVO);
}

public int selectArticleListCnt(BoardVO boardVO) {
return (Integer)selectOne("BBSArticle.selectArticleListCnt", boardVO);
}

public int selectMaxInqireCo(BoardVO boardVO) {
return (Integer)selectOne("BBSArticle.selectMaxInqireCo", boardVO);
}

public void updateInqireCo(BoardVO boardVO) {
update("BBSArticle.updateInqireCo", boardVO);
}

public BoardVO selectArticleDetail(BoardVO boardVO) {
return (BoardVO) selectOne("BBSArticle.selectArticleDetail", boardVO);
}

public void replyArticle(Board board) {
insert("BBSArticle.replyArticle", board);
}

public List selectNoticeArticleList(BoardVO boardVO) {
return (List) list("BBSArticle.selectNoticeArticleList", boardVO);
}

public List<?> selectGuestArticleList(BoardVO vo) {
return list("BBSArticle.selectGuestArticleList", vo);
}

public int selectGuestArticleListCnt(BoardVO vo) {
return (Integer)selectOne("BBSArticle.selectGuestArticleListCnt", vo);
}

/*
 * 블로그 관련
 */
public BoardVO selectArticleCnOne(BoardVO boardVO) {
return (BoardVO) selectOne("BBSArticle.selectArticleCnOne", boardVO);
}

public List selectBlogNmList(BoardVO boardVO) {
return (List) list("BBSArticle.selectBlogNmList", boardVO);
}

public List<?> selectBlogListManager(BoardVO vo) {
return list("BBSArticle.selectBlogListManager", vo);
}

public int selectBlogListManagerCnt(BoardVO vo) {
return (Integer)selectOne("BBSArticle.selectBlogListManagerCnt", vo);
}

public List selectArticleDetailDefault(BoardVO boardVO) {
return (List) list("BBSArticle.selectArticleDetailDefault", boardVO);
}

public int selectArticleDetailDefaultCnt(BoardVO boardVO) {
return (Integer)selectOne("BBSArticle.selectArticleDetailDefaultCnt", boardVO);
}

public List selectArticleDetailCn(BoardVO boardVO) {
return (List) list("BBSArticle.selectArticleDetailCn", boardVO);
}


}

- service Interface는 select만 남겨놓는다(insert/update/delete는 제거)

package egovframework.blog.service;

import java.util.List;
import java.util.Map;

import egovframework.rte.fdl.cmmn.exception.FdlException;

public interface BlogArticleService {

Map<String, Object> selectArticleList(BoardVO boardVO);

BoardVO selectArticleDetail(BoardVO boardVO);

List selectNoticeArticleList(BoardVO boardVO);

Map<String, Object> selectGuestArticleList(BoardVO vo);

/*
 * 블로그 관련
 */
BoardVO selectArticleCnOne(BoardVO boardVO);

List selectBlogNmList(BoardVO boardVO);

Map<String, Object> selectBlogListManager(BoardVO boardVO);

List selectArticleDetailDefault(BoardVO boardVO);

int selectArticleDetailDefaultCnt(BoardVO boardVO);

List selectArticleDetailCn(BoardVO boardVO);

int selectLoginUser(BoardVO boardVO);
}

- service Impl

package egovframework.blog.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import egovframework.blog.service.BlogArticleService;
import egovframework.blog.service.Board;
import egovframework.com.cmm.service.EgovFileMngService;
import egovframework.blog.service.BoardVO;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.property.EgovPropertyService;

@Service("BlogArticleService")
public class BlogArticleServiceImpl extends EgovAbstractServiceImpl implements BlogArticleService {

@Resource(name = "BlogArticleDAO")
    private BlogArticleDAO blogArticleDao;

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

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

    @Resource(name = "egovNttIdGnrService")
    private EgovIdGnrService nttIdgenService;

@Override
public Map<String, Object> selectArticleList(BoardVO boardVO) {
List<?> list = blogArticleDao.selectArticleList(boardVO);


int cnt = blogArticleDao.selectArticleListCnt(boardVO);

Map<String, Object> map = new HashMap<String, Object>();

map.put("resultList", list);
map.put("resultCnt", Integer.toString(cnt));

return map;
}

@Override
public BoardVO selectArticleDetail(BoardVO boardVO) {
    int iniqireCo = blogArticleDao.selectMaxInqireCo(boardVO);

    boardVO.setInqireCo(iniqireCo);
    blogArticleDao.updateInqireCo(boardVO);

return blogArticleDao.selectArticleDetail(boardVO);
}

@Override
public BoardVO selectArticleCnOne(BoardVO boardVO) {
return blogArticleDao.selectArticleCnOne(boardVO);
}

@Override
public List selectArticleDetailDefault(BoardVO boardVO) {
return blogArticleDao.selectArticleDetailDefault(boardVO);
}

@Override
public int selectArticleDetailDefaultCnt(BoardVO boardVO){
return blogArticleDao.selectArticleDetailDefaultCnt(boardVO);
}

@Override
public List selectArticleDetailCn(BoardVO boardVO) {
return blogArticleDao.selectArticleDetailCn(boardVO);
}


@Override
public List selectNoticeArticleList(BoardVO boardVO) {
return blogArticleDao.selectNoticeArticleList(boardVO);
}

@Override
public List selectBlogNmList(BoardVO boardVO) {
return blogArticleDao.selectBlogNmList(boardVO);
}

@Override
public Map<String, Object> selectGuestArticleList(BoardVO vo) {
List<?> list = blogArticleDao.selectGuestArticleList(vo);


int cnt = blogArticleDao.selectGuestArticleListCnt(vo);

Map<String, Object> map = new HashMap<String, Object>();

map.put("resultList", list);
map.put("resultCnt", Integer.toString(cnt));

return map;
}

//@Override
//public void insertArticle(Board board) throws FdlException {
// insert/update는 관리자 화면에서

//}

//@Override
//public void updateArticle(Board board) {
// insert/update는 관리자 화면에서

//}

//@Override
//public void deleteArticle(Board board) throws Exception {
// insert/update는 관리자 화면에서

//}

//@Override
//public Map<String, Object> selectBlogListManager(BoardVO boardVO) {
// insert/update는 관리자 화면에서

//return null;
//}

@Override
public int selectLoginUser(BoardVO boardVO) {
// TODO Auto-generated method stub
return 0;
}



}

- Controller 에서 request받을 경로와 return받을 경로, 사용할 service 경로 등을 수정

package egovframework.blog.web;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springmodules.validation.commons.DefaultBeanValidator;

import egovframework.com.cmm.EgovMessageSource;
import egovframework.com.cmm.EgovWebUtil;
import egovframework.com.cmm.LoginVO;
import egovframework.com.cmm.service.EgovFileMngService;
import egovframework.com.cmm.service.EgovFileMngUtil;
import egovframework.com.cmm.service.FileVO;
import egovframework.com.cmm.util.EgovUserDetailsHelper;
import egovframework.com.cmm.util.EgovXssChecker;

//import egovframework.blog.service.Blog;//관리는 제외 : 블로그게시판 관리를 위한 모델 클래스
//import egovframework.blog.service.BlogVO;//관리는 제외 : 커뮤니티 관리를 위한 VO 클래스
import egovframework.blog.service.Board;//게시물에 대한 데이터 처리 모델
//import egovframework.blog.service.BoardMaster;//관리는 제외 : 게시판 속성정보를 담기위한 엔티티 클래스
//import egovframework.blog.service.BoardMasterVO;//관리는 제외 : 게시판 속성 정보를 관리하기 위한 VO  클래스
import egovframework.blog.service.BoardVO;//게시물 관리를 위한 VO 클래스
import egovframework.blog.service.BlogArticleService;
//import egovframework.blog.service.EgovBBSMasterService; // 관리자는 제외
//import egovframework.blog.service.EgovBBSSatisfactionService;// 만족도 제외

import egovframework.com.cop.cmt.service.CommentVO;
import egovframework.com.cop.cmt.service.EgovArticleCommentService;
import egovframework.com.cop.cmy.service.CommunityVO;
import egovframework.com.cop.tpl.service.EgovTemplateManageService;
import egovframework.com.cop.tpl.service.TemplateInfVO;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.string.EgovStringUtil;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;

/**
 * 게시물 관리를 위한 컨트롤러 클래스
 * @author 공통서비스개발팀 이삼섭
 * @since 2009.06.01
 * @version 1.0
 * @see
 *
 * 
 * << 개정이력(Modification Information) >>
 *   
 *   수정일      수정자           수정내용
 *  -------       --------    ---------------------------
 *   2009.3.19  이삼섭          최초 생성
 *   2009.06.29	한성곤			2단계 기능 추가 (댓글관리, 만족도조사)
 *   2011.07.01 안민정		 	댓글, 스크랩, 만족도 조사 기능의 종속성 제거
 *   2011.8.26	정진오			IncludedInfo annotation 추가
 *   2011.09.07 서준식           유효 게시판 게시일 지나도 게시물이 조회되던 오류 수정
 *   2016.06.13 김연호			표준프레임워크 3.6 개선
 * 

 */

@Controller
public class BlogController {

private static final Logger LOGGER = LoggerFactory.getLogger(BlogController.class);

@Resource(name = "BlogArticleService")
    private BlogArticleService blogArticleService;
//
//    @Resource(name = "EgovBBSMasterService")
//    private EgovBBSMasterService egovBBSMasterService;
//
//    @Resource(name = "EgovFileMngService")
//    private EgovFileMngService fileMngService;
//
//    @Resource(name = "EgovFileMngUtil")
//    private EgovFileMngUtil fileUtil;
//
    @Resource(name = "propertiesService")
    protected EgovPropertyService propertyService;
//    
    @Resource(name="egovMessageSource")
    EgovMessageSource egovMessageSource;
//    
    @Resource(name = "EgovArticleCommentService")
    protected EgovArticleCommentService egovArticleCommentService;
//
//    @Resource(name = "EgovBBSSatisfactionService")
//    private EgovBBSSatisfactionService bbsSatisfactionService;
//
@Resource(name = "EgovTemplateManageService")
private EgovTemplateManageService egovTemplateManageService;
//    
//    @Autowired
//    private DefaultBeanValidator beanValidator;

    //protected Logger log = Logger.getLogger(this.getClass());
    
    /**
     * XSS 방지 처리.
     * 
     * @param data
     * @return
     */
    protected String unscript(String data) {
        if (data == null || data.trim().equals("")) {
            return "";
        }
        
        String ret = data;
        
        ret = ret.replaceAll("<(S|s)(C|c)(R|r)(I|i)(P|p)(T|t)", "<script");
        ret = ret.replaceAll("</(S|s)(C|c)(R|r)(I|i)(P|p)(T|t)", "</script");
        
        ret = ret.replaceAll("<(O|o)(B|b)(J|j)(E|e)(C|c)(T|t)", "<object");
        ret = ret.replaceAll("</(O|o)(B|b)(J|j)(E|e)(C|c)(T|t)", "</object");
        
        ret = ret.replaceAll("<(A|a)(P|p)(P|p)(L|l)(E|e)(T|t)", "<applet");
        ret = ret.replaceAll("</(A|a)(P|p)(P|p)(L|l)(E|e)(T|t)", "</applet");
        
        ret = ret.replaceAll("<(E|e)(M|m)(B|b)(E|e)(D|d)", "<embed");
        ret = ret.replaceAll("</(E|e)(M|m)(B|b)(E|e)(D|d)", "<embed");
        
        ret = ret.replaceAll("<(F|f)(O|o)(R|r)(M|m)", "<form");
        ret = ret.replaceAll("</(F|f)(O|o)(R|r)(M|m)", "<form");

        return ret;
    }

    /**
     * 게시물에 대한 목록을 조회한다.
     * 
     * @param boardVO
     * @param sessionVO
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/blog/selectArticleList.do")
    public String selectArticleList(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception {
LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();

Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); //KISA 보안취약점 조치 (2018-12-10, 이정은)

        if(!isAuthenticated) {
            return "egovframework/com/uat/uia/EgovLoginUsr";
        }

        boardVO.setBbsId(boardVO.getBbsId());
        boardVO.setBbsNm(boardVO.getBbsNm());
boardVO.setPageUnit(propertyService.getInt("pageUnit"));
boardVO.setPageSize(propertyService.getInt("pageSize"));

PaginationInfo paginationInfo = new PaginationInfo();

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

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

Map<String, Object> map = blogArticleService.selectArticleList(boardVO);
int totCnt = Integer.parseInt((String)map.get("resultCnt"));

//공지사항 추출
List noticeList = blogArticleService.selectNoticeArticleList(boardVO);

paginationInfo.setTotalRecordCount(totCnt);

if(user != null) {
     model.addAttribute("sessionUniqId", user.getUniqId());
    }

model.addAttribute("resultList", map.get("resultList"));
model.addAttribute("resultCnt", map.get("resultCnt"));
model.addAttribute("articleVO", boardVO);
model.addAttribute("bbsNm", "Custom Blog Sample");
model.addAttribute("bbsId", "BBSMSTR_000000000002");// 블로그는 1개만 운영하므로 생성된 블로그의 bbsId 사용-- 나중에 property로
model.addAttribute("bbsTmplatCours", "/css/egovframework/com/cop/tpl/egovBaseTemplate.css");//기본 BBS template 지정 : css 경로. 추후 변경
model.addAttribute("paginationInfo", paginationInfo);
model.addAttribute("noticeList", noticeList);
return "egovframework/com/blog/BlogArticleList";
    }
    
    
    
    /**
     * 게시물에 대한 상세 정보를 조회한다.
     * 
     * @param boardVO
     * @param sessionVO
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/blog/selectArticleDetail.do")
    public String selectArticleDetail(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception {
LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();


boardVO.setLastUpdusrId(user.getUniqId());
BoardVO vo = blogArticleService.selectArticleDetail(boardVO);

model.addAttribute("result", vo);
model.addAttribute("sessionUniqId", user.getUniqId());

//비밀글은 작성자만 볼수 있음 
if(!EgovStringUtil.isEmpty(vo.getSecretAt()) && vo.getSecretAt().equals("Y") && !user.getUniqId().equals(vo.getFrstRegisterId()))
return"forward:/blog/selectArticleList.do";

//----------------------------
// template 처리 (기본 BBS template 지정  포함)
//----------------------------
model.addAttribute("bbsTmplatCours", "/css/egovframework/com/cop/tpl/egovBaseTemplate.css");//기본 BBS template 지정 : css 경로. 추후 변경

////-----------------------------
if (egovArticleCommentService != null){
if (egovArticleCommentService.canUseComment(boardVO.getBbsId())) {
    model.addAttribute("useComment", "true");
}
}
////--------------------------

model.addAttribute("bbsId", "BBSMSTR_000000000002");// 블로그는 1개만 운영하므로 생성된 블로그의 bbsId 사용-- 나중에 property로

return "egovframework/com/blog/BlogArticleDetail";
    }


    

    
    /*********************
     * 블로그관련
     * ********************/
    
    
    /**
     * 블로그 게시물에 대한 상세 타이틀을 조회한다.
     * 
     * @param boardVO
     * @param sessionVO
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/blog/selectArticleBlogDetail.do")
    public ModelAndView selectArticleBlogDetail(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception {
LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();


BoardVO vo = new BoardVO();

boardVO.setPageUnit(propertyService.getInt("pageUnit"));
boardVO.setPageSize(propertyService.getInt("pageSize"));

PaginationInfo paginationInfo = new PaginationInfo();

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

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

List blogSubJectList = blogArticleService.selectArticleDetailDefault(boardVO);
vo = blogArticleService.selectArticleCnOne(boardVO);

int totCnt = blogArticleService.selectArticleDetailDefaultCnt(boardVO);
paginationInfo.setTotalRecordCount(totCnt);

ModelAndView mav = new ModelAndView("jsonView");
mav.addObject("blogSubJectList", blogSubJectList);
mav.addObject("paginationInfo", paginationInfo);

if(vo.getNttCn() != null){
mav.addObject("blogCnOne", vo);
}

//비밀글은 작성자만 볼수 있음 
if(!EgovStringUtil.isEmpty(vo.getSecretAt()) && vo.getSecretAt().equals("Y") && !user.getUniqId().equals(vo.getFrstRegisterId()))
mav.setViewName("forward:/blog/selectArticleList.do");
return mav;
    }
    
    /**
     * 블로그 게시물에 대한 상세 내용을 조회한다.
     * 
     * @param boardVO
     * @param sessionVO
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/blog/selectArticleBlogDetailCn.do")
    public ModelAndView selectArticleBlogDetailCn(@ModelAttribute("searchVO") BoardVO boardVO, @ModelAttribute("commentVO") CommentVO commentVO, ModelMap model) throws Exception {
LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();

boardVO.setLastUpdusrId(user.getUniqId());

Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); //KISA 보안취약점 조치 (2018-12-10, 이정은)

        if(!isAuthenticated) {
         throw new IllegalAccessException("Login Required!");
        }

BoardVO vo = blogArticleService.selectArticleDetail(boardVO);

//----------------------------
// 댓글 처리
//----------------------------
CommentVO articleCommentVO = new CommentVO();
commentVO.setWrterNm(user.getName());

PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(commentVO.getSubPageIndex());
paginationInfo.setRecordCountPerPage(commentVO.getSubPageUnit());
paginationInfo.setPageSize(commentVO.getSubPageSize());

commentVO.setSubFirstIndex(paginationInfo.getFirstRecordIndex());
commentVO.setSubLastIndex(paginationInfo.getLastRecordIndex());
commentVO.setSubRecordCountPerPage(paginationInfo.getRecordCountPerPage());

Map<String, Object> map = egovArticleCommentService.selectArticleCommentList(commentVO);
int totCnt = Integer.parseInt((String)map.get("resultCnt"));

paginationInfo.setTotalRecordCount(totCnt);

    //댓글 처리 END
//----------------------------

List blogCnList = blogArticleService.selectArticleDetailCn(boardVO);
ModelAndView mav = new ModelAndView("jsonView");

// 수정 처리된 후 댓글 등록 화면으로 처리되기 위한 구현
if (commentVO.isModified()) {
    commentVO.setCommentNo("");
    commentVO.setCommentCn("");
}

// 수정을 위한 처리
if (!commentVO.getCommentNo().equals("")) {
mav.setViewName ("forward:/cop/cmt/updateArticleCommentView.do");
}

mav.addObject("blogCnList", blogCnList);
mav.addObject("resultUnder", vo);
mav.addObject("paginationInfo", paginationInfo);
mav.addObject("resultList", map.get("resultList"));
mav.addObject("resultCnt", map.get("resultCnt"));
mav.addObject("articleCommentVO", articleCommentVO); // validator 용도

commentVO.setCommentCn(""); // 등록 후 댓글 내용 처리

//비밀글은 작성자만 볼수 있음 
if(!EgovStringUtil.isEmpty(vo.getSecretAt()) && vo.getSecretAt().equals("Y") && !user.getUniqId().equals(vo.getFrstRegisterId()))
mav.setViewName("forward:/blog/selectArticleList.do");
return mav;

    }
    


  
        
    
}

 

2. JSP 등 클라이언트단

com.cop.bbs에 있는 com.blog관련파일을 blog폴더로 복사하여 사용

3. properties

resources의 message를 blog폴도 아래에도 생성.
com.cop.bbs property 말고 com.cop.blog property를 복사한다

그리고는 경로를 새로 생성한 경로로 호출해본다.

--localhost:8080/egovframework-all-in-one/blog/selectArticleList.do

일단 화면은 나온다.

이제 뭐가 문제인지 따져보자 ㅎ

Controller 안에 method마다 있는 login 관련로직은 모두 제거한다.
모든 사용자가 볼 수 있으므로

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

Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
        if(!isAuthenticated) {
            return "egovframework/com/uat/uia/EgovLoginUsr";
        }
728x90
728x90

전자정부 프레임워크의 게시판 등 템플릿으로 설정해 둔 뒤
설정한 템플릿으로 적용이 가능하다.

협업 > 템플릿관리

css 파일 경로 : main > webapp > css >  에 있어야 하는데
기본으로 있는 템플릿 목록의 egovbbsTemplate.css 는 없네?

jsp 파일 경로로 WEB-INF/jsp/egovframework/com/cop/tpl/EgovClbBaseTmpl.jsp .

 

참고할만한 Tmpl파일을 복사하여 수정한 뒤 등록.

등록결과

728x90
728x90

새로운 블로그를 만들어 보자

http://localhost:8080/egovframework-all-in-one/ 에서
업무사용자 선택
로그인 : TEST1
PW : 공통12

로그인 한 뒤에 협업 > 블로그 관리
처음이라 블로그가 없음.
등록버튼을 누른다.

등록하기
블로그명 : 샘플블로그
블로그 소개내용 : 처음 만든 블로그

등록 결과
등록한 블로그명과 설명이 나옴

게시글을 등록하려고 등록버튼을 누르면
게시판(카테고리)를 먼저 등록해야한다는 알림이 나옴

카테고리 등록
실제로는 게시판이지만. 블로그에서는 카테고리라고 한다.
게시판명 : 블로그게시판1
게시판 소개내용 : 블로그 게시판으로 사용
게시판 유형 : 블로그형게시판
.. 항목들을 채운 뒤 등록버튼을 누른다.

카테고리 추가 완료를 하면
생성한블로그가 표시되면서 게시글이 없다는 알림이 뜸
이제 등록버튼으로 게시글 등록을 한다.

게시글 등록
제목 : 블로그 게시글 1
내용 : 첫번째 게시글
입력 후 등록버튼을 누르면

블로그 완성

 

개인블로그 관리
여러 블로그 또는 게시판을 관리

해당 게시판(블로그게시판1)을 클릭하면 상세내용이 나옴

728x90
BLOG main image
"그게 뭐 어쨌다는 거냐?" 늘 누가 나에게 나에대한 말을할 때면 이말을 기억해라. by nobang

카테고리

nobang이야기 (1951)
Life With Gopro (7)
Life With Mini (79)
Diary (971)
너 그거 아니(do you know) (179)
난 그래 (159)
Study (290)
Cloud (26)
Go lang (30)
Front-end (27)
Device (3)
MAC (1)
Spring framework (49)
Java (13)
English (39)
SOA (0)
Idioms (7)
모르는거 (5)
WriteEnglish (10)
Android (56)
속지말자 (10)
Project (34)
Poem (15)
Song (0)
Photo (113)
낙서장 (45)
일정 (0)
C.A.P.i (2)
PodCast (0)
nobang (27)
고한친구들 (4)
recieve (0)
History (0)
android_app (2)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :