[Spring MVC] Presentation Tier 구현

    반응형

     

    이 글은 코드로 배우는 스프링 웹 프로젝트(남가람북스, 구멍가게 코딩단)을 읽고 공부한 내용을 바탕으로 정리한 글입니다.


     

    1. Controller

    Controller 작성 전에, 원하는 기능을 호출하는 방식에 대해 table로 간단히 정리해보겠습니다. 

    Task URL Method Parameter Form URL 이동
    전체 목록 /board/list GET - - -
    등록 /board/register POST 모든 항목 O O
    조회 /board/get GET bno - -
    삭제 /board/remove POST bno O O
    수정 /board/modify POST 모든 항목 O O

    BoardControllercontroller 패키지 안에 작성하고, 위의 테이블의 기능들을 차례대로 메서드로 작성해보도록 하겠습니다.

    BoardControllerBoardService 타입의 객체와 같이 연동해야 하므로 의존성에 대한 처리를 해주어야 합니다. @AllArgsConstructor 어노테이션으로 생성자를 만들고 자동으로 BoardService 객체를 주입하도록 합니다.

    @Controller
    @Log4j
    @RequestMapping("/board/*")
    @AllArgsConstructor
    public class BoardController {
    
        private BoardService boardService;
    
    }

    그리고 @Controller 어노테이션이 인식될 수 있도록 applicationContext.xml component-scan 태그를 추가합니다.

    <context:component-scan base-package="com.hellomygreenworld.ex02.controller"/>
    

     

    2.  (예제) BoardController - 전체 목록 처리(/list)

    BoardController에서 전체 목록을 가져오는 처리를 작성해보겠습니다. 

    @Controller
    @Log4j
    @RequestMapping("/board/*")
    @AllArgsConstructor
    public class BoardController {
    
        private BoardService boardService;
        
        @GetMapping("/list")
        public void list(Model model) {
            log.info("=== list ===");
            model.addAttribute("list", boardService.getList());
        }
    
    }

    list 메서드의 리턴타입을 void으로 하고, views 디렉토리 밑에 list.jsp를 만들고 내용을 확인할 수 있게 작성해주었습니다.

    tomcat 서버를 실행시키고, /board/list URL로 접속하면 위와 같이 board의 전체 리스트가 가져와진 것을 확인할 수 있습니다.

     

    3.  (예제) BoardController - 등록(/register) 처리

    @Controller
    @Log4j
    @RequestMapping("/board/*")
    @AllArgsConstructor
    public class BoardController {
    
        private BoardService boardService;
    
    	...
        
        @PostMapping("/register")
        public String register(BoardVO boardVO, RedirectAttributes rttr) {
            log.info("=== register: " + boardVO + " ===");
            boardService.register(boardVO);
            rttr.addFlashAttribute("result", boardVO.getBno());
    
            return "redirect:/board/list";
        }
    
    }

    register() 메서드는 리턴 타입을 String으로 지정하고, RedirectAttrubutes를 파라미터로 지정하여 등록 작업이 끝나고 다시 목록 화면으로 이동할 수 있도록 합니다. RedirectAttributes 타입의 객체를 이용하는 이유는 일회성으로 데이터를 전달하도록 하기 위함입니다. addFlashAttribute()로 보관된 데이터는 단 한 번만 사용할 수 있게 보관됩니다. (내부적으로는 HttpSession 이용) 이를 이용해서 경고창이나 모달창을 보여주는 방식으로 처리할 수 있습니다. (ex. "O번 게시물이 등록되었습니다.")

     

    4.  (예제) BoardController - 조회(/get) 처리

    @Controller
    @Log4j
    @RequestMapping("/board/*")
    @AllArgsConstructor
    public class BoardController {
    
        private BoardService boardService;
    
    	...
        
        @GetMapping("/get")
        public void get(@RequestParam("bno") int bno, Model model) {
            log.info("=== get ===");
            model.addAttribute("board", boardService.get(bno));
        }
    
    }

    @RequestParam을 이용해서 bno 파라미터를 명시적으로 수집합니다. (파라미터 이름과 변수 이름을 기준으로 동작하기 때문에 생략해도 무방합니다.) 또한 화면 쪽으로 bnoboard를 전달하기 위새 Model을 파라미터로 지정합니다.

     

    5.  (예제) BoardController - 수정(/modify) 처리

    @Controller
    @Log4j
    @RequestMapping("/board/*")
    @AllArgsConstructor
    public class BoardController {
    
        private BoardService boardService;
    
    	...
        
        @PostMapping("/modify")
        public String modify(BoardVO boardVO, RedirectAttributes rttr) {
            log.info("=== modify: " + boardVO + " ===");
            if(boardService.modify(boardVO))
                rttr.addFlashAttribute("result", "success");
            return "redirect:/board/list";
        }
    
    }

    변경된 내용을 수집해서 BoardVO 파라미터로 처리하고, BoardService를 호출합니다. 수정 작업을 시작하는 화면의 경우에는 GET 방식으로 접근하지만, 실제 작업은 POST 방식으로 동작합니다(form). 따라서 여기서는 @PostMapping 어노테이션으로 처리하고 이후에 화면처리에서 modify@GetMapping 처리를 해주겠습니다.

     

    6.  (예제) BoardController - 삭제(/delete) 처리

    @Controller
    @Log4j
    @RequestMapping("/board/*")
    @AllArgsConstructor
    public class BoardController {
    
        private BoardService boardService;
    
    	...
        
        @PostMapping("/remove")
        public String remove(@RequestParam("bno") int bno, RedirectAttributes rttr) {
            log.info("=== remove === ");
            if (boardService.remove(bno)) {
                rttr.addFlashAttribute("result", "success");
            }
            return "redirect:/board/list";
        }
    }

    삭제는 따로 페이지가 필요하지 않기 때문에 POST 방식으로만 처리해줍니다. 처리 방식은 modify와 유사합니다. redirect를 이용해서 삭제 처리 후, 다시 목록 페이지로 이동합니다.

    반응형

    'Java > Spring' 카테고리의 다른 글

    [Spring Boot] API 개발  (1) 2023.01.23
    REST API란?  (0) 2023.01.23
    [Spring MVC] Business Tier 구현  (0) 2023.01.11
    [Spring MVC] Persistence Tier CRUD 구현  (0) 2023.01.11
    [Spring boot] Maria DB 설정  (0) 2023.01.06

    댓글