ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Spring] 게시판 만들기 #번외. 프로젝트 진행에 따른 구조 변경
    Spring/게시판 만들기 2020. 6. 26. 22:23

    [Camel][Spring] 게시판 만들기 #번외. 프로젝트 진행에 따른 구조 변경

     

    본 게시판 만들기 프로젝트는 더블에스 Devlog Spring-MVC 를 참조하여 작성했음을 알려드립니다. 또한 개인적인 학습을 목적으로한 포스팅이기 때문에 완벽하지 않을 수 있음을 알려드립니다. 문제점이나 궁금한점은 댓글로 남겨주시면 감사하겠습니다. 프로젝트 생성에 앞서 이번 게시판 만들기 프로젝트는 이클립스를 사용하여 구현하였습니다. 

     

    검색 기능을 구현하기에 앞서 여태까지 구현해왔던 페이지들의 기능을 기준으로 구분해보도록 하겠습니다. 

     

    1. Controller 구분

    게시글 관련 컨트롤러를 페이징 처리를 구현하지 않은 페이지와 페이징 처리를 구현한 페이지로 나누어서 새로운 기능을 추가할 때마다 기존 컨트롤러에 새로운 메소드를 추가하지 않고 새로운 컨트롤러를 추가하는 방식으로 개발하려고 합니다. 

     

    앞서 이전 포스팅에서 구현했던 게시물 CRUD 기능만을 가진 게시판은 아래처럼 ArticleController와 ArticlePagingController로 구분지어 작성하겠습니다. 

     

    package com.cameldev.mypage.controller;
    
    import javax.inject.Inject;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    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.bind.annotation.RequestParam;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import com.cameldev.mypage.commons.paging.Criteria;
    import com.cameldev.mypage.commons.paging.PageMaker;
    import com.cameldev.mypage.domain.ArticleVO;
    import com.cameldev.mypage.service.ArticleService;
    
    @Controller
    @RequestMapping("/article")
    public class ArticleController {
    
        private static final Logger logger = LoggerFactory.getLogger(ArticleController.class);
    
        private final ArticleService articleService;
    
        @Inject
        public ArticleController(ArticleService articleService) {
            this.articleService = articleService;
        }
        
     // 등록 페이지 이동
        @RequestMapping(value = "/write", method = RequestMethod.GET)
        public String writeGET() {
    
            logger.info("write GET...");
    
            return "/article/write";
        }
        
     // 등록 처리
        @RequestMapping(value = "/write", method = RequestMethod.POST)
        public String writePOST(ArticleVO articleVO,
                                RedirectAttributes redirectAttributes) throws Exception {
    
            logger.info("write POST...");
            logger.info(articleVO.toString());
            articleService.create(articleVO);;
            redirectAttributes.addFlashAttribute("msg", "regSuccess");
    
            return "redirect:/article/list";
        }
        
     // 목록 페이지 이동
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public String list(Model model) throws Exception {
    
            logger.info("list ...");
            model.addAttribute("articles", articleService.listAll());
    
            return "/article/list";
        }
        
        @RequestMapping(value = "/listCriteria", method = RequestMethod.GET)
        public String listCriteria(Model model, Criteria criteria) throws Exception {
            logger.info("listCriteria ...");
            model.addAttribute("articles", articleService.listCriteria(criteria));
            return "/article/list_criteria";
        }
        
     // 조회 페이지 이동
        @RequestMapping(value = "/read", method = RequestMethod.GET)
        public String read(@RequestParam("article_no") int article_no,
                           Model model) throws Exception {
    
            logger.info("read ...");
            model.addAttribute("article", articleService.read(article_no));
    
            return "/article/read";
        }
        
     // 수정 페이지 이동
        @RequestMapping(value = "/modify", method = RequestMethod.GET)
        public String modifyGET(@RequestParam("article_no") int article_no,
                                Model model) throws Exception {
    
            logger.info("modifyGet ...");
            model.addAttribute("article", articleService.read(article_no));
    
            return "/article/modify";
        }
        
     // 수정 처리
        @RequestMapping(value = "/modify", method = RequestMethod.POST)
        public String modifyPOST(ArticleVO articleVO,
                                 RedirectAttributes redirectAttributes) throws Exception {
    
            logger.info("modifyPOST ...");
            articleService.update(articleVO);
            redirectAttributes.addFlashAttribute("msg", "modSuccess");
    
            return "redirect:/article/list";
        }
        
     // 삭제 처리
        @RequestMapping(value = "/remove", method = RequestMethod.POST)
        public String remove(@RequestParam("article_no") int article_no,
                             RedirectAttributes redirectAttributes) throws Exception {
    
            logger.info("remove ...");
            articleService.delete(article_no);
            redirectAttributes.addFlashAttribute("msg", "delSuccess");
    
            return "redirect:/article/list";
        }
    
    }    
    package com.cameldev.mypage.controller;
    
    import javax.inject.Inject;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    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.bind.annotation.RequestParam;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import com.cameldev.mypage.commons.paging.Criteria;
    import com.cameldev.mypage.commons.paging.PageMaker;
    import com.cameldev.mypage.domain.ArticleVO;
    import com.cameldev.mypage.service.ArticleService;
    
    @Controller
    @RequestMapping("/article/paging")
    public class ArticlePagingController {
    
        private static final Logger logger = LoggerFactory.getLogger(ArticlePagingController.class);
    
        private final ArticleService articleService;
    
        @Inject
        public ArticlePagingController(ArticleService articleService) {
            this.articleService = articleService;
        }
        
        @RequestMapping(value = "/write", method = RequestMethod.GET)
        public String writeGET() {
    
            logger.info("paging writeGET() called...");
    
            return "article/paging/write";
        }
    
        @RequestMapping(value = "/write", method = RequestMethod.POST)
        public String writePOST(ArticleVO articleVO,
                                RedirectAttributes redirectAttributes) throws Exception {
    
            logger.info("paging writePOST() called...");
    
            articleService.create(articleVO);
            redirectAttributes.addFlashAttribute("msg", "regSuccess");
    
            return "redirect:/article/paging/list";
        }
    
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public String list(Model model, Criteria criteria) throws Exception {
    
            logger.info("paging list() called ...");
    
            PageMaker pageMaker = new PageMaker();
            pageMaker.setCriteria(criteria);
            pageMaker.setTotalCount(articleService.countArticles(criteria));
    
            model.addAttribute("articles", articleService.listCriteria(criteria));
            model.addAttribute("pageMaker", pageMaker);
    
            return "article/paging/list";
        }
    
        @RequestMapping(value = "/read", method = RequestMethod.GET)
        public String read(@RequestParam("article_no") int article_no,
                           @ModelAttribute("criteria") Criteria criteria,
                           Model model) throws Exception {
    
            logger.info("paging read() called ...");
            model.addAttribute("article", articleService.read(article_no));
    
            return "article/paging/read";
        }
    
        @RequestMapping(value = "/modify", method = RequestMethod.GET)
        public String modifyGET(@RequestParam("article_no") int article_no,
                                @ModelAttribute("criteria") Criteria criteria,
                                Model model) throws Exception {
    
            logger.info("paging modifyGet() called ...");
            model.addAttribute("article", articleService.read(article_no));
    
            return "article/paging/modify";
        }
    
        @RequestMapping(value = "/modify", method = RequestMethod.POST)
        public String modifyPOST(ArticleVO articleVO,
                                       Criteria criteria,
                                       RedirectAttributes redirectAttributes) throws Exception {
    
            logger.info("paging modifyPOST() called ...");
            articleService.update(articleVO);
            redirectAttributes.addAttribute("page", criteria.getPage());
            redirectAttributes.addAttribute("perPageNum", criteria.getPerPageNum());
            redirectAttributes.addFlashAttribute("msg", "modSuccess");
    
            return "redirect:/article/paging/list";
        }
    
        @RequestMapping(value = "/remove", method = RequestMethod.POST)
        public String remove(@RequestParam("article_no") int article_no,
                                   Criteria criteria,
                                   RedirectAttributes redirectAttributes) throws Exception {
    
            logger.info("paging remove() called ...");
            articleService.delete(article_no);
            redirectAttributes.addAttribute("page", criteria.getPage());
            redirectAttributes.addAttribute("perPageNum", criteria.getPerPageNum());
            redirectAttributes.addFlashAttribute("msg", "delSuccess");
    
            return "redirect:/article/paging/list";
        }
    }    

     

    컨트롤러를 구분했다면 다음으로는 기존 WEB-INF/views/article 디렉터리에 있던 list_paging.jsp, modify_paging.jsp, read_paging.jsp, write.jsp 파일을 복사한 뒤 WEB-INF/views/article/paging 디렉터리에 붙여넣은 후 list.jsp, modify.jsp, read.jsp, write.jsp 로 파일이름을 변경해주겠습니다. (저는 다음 포스팅에서 구현할 기능인 게시물 검색 기능을 위해서 search 디렉토리에도 복사해서 넣어주었습니다.)

    JSP파일들을 붙여넣어 준 뒤, 붙여넣은 파일들의 내용 중 아래처럼 include 경로와 관련된 내용부분을 수정해 주겠습니다. 

     

    WEB-INF/views/article/paging/list.jsp - Main Content부분

     

     

    WEB-INF/views/article/paging/modify.jsp - Main Content부분, script 부분

     

     

    WEB-INF/views/article/paging/read.jsp - script 부분

     

     

     

    WEB-INF/views/article/paging/write.jsp - Main Content부분

     

     

    마지막으로 left_column.jsp 파일을 수정하여 사이드 바의 구조를 변경합니다.

     

     

    선택사항으로 저는 모든 jsp 페이지의 <body>태그의 class 속성에 layout-boxed를 추가해주었습니다. 

     

    이제 프로젝트를 빌드해보면 아래와 같은 페이지를 확인할 수 있습니다. 

     

    다음포스팅 

    2020/06/27 - [Spring/게시판 만들기] - [Camel][Spring] 게시판 만들기 #6. 게시물 검색 기능 구현

     

    [Camel][Spring] 게시판 만들기 #6. 게시물 검색 기능 구현

    [Camel][Spring] 게시판 만들기 #6. 게시물 검색 기능 구현 본 게시판 만들기 프로젝트는 더블에스 Devlog Spring-MVC 를 참조하여 작성했음을 알려드립니다. 또한 개인적인 학습을 목적으로한 포스

    cameldev.tistory.com

     

    글을 읽으시면서 잘못된 부분이나 궁금하신 사항은 댓글 달아주시면 빠른 시일내에 수정 및 답변하도록 하겠습니다. 

    댓글

Camel`s Tistory.