Spring | 10 프레젠테이션(웹) 계층의 CRUD 구현

파과·2022년 9월 21일

Controller

컨트롤러는 한 클래스 내에서 여러 메서드를 작성하고 URL을 분기하는 구조로 작성할 수 있다.

작성 전 반드시 원하는 기능을 호출하는 방식에 대해 테이블로 정리한 후 코드를 작성하는 것이 좋다.

TaskURLMethodParameterFromURL이동
전체 목록/board/listGET
등록 처리/board/registerPOST모든 항목입력화면 필요이동
조회/board/get/GETbno=123
삭제 처리/board/removePOSTbno입력화면 필요이동
수정 처리/board/modifyPOST모든 항목입력화면 필요이동

BoardController

@Controller로 스프링의 빈으로 인식할 수 있게 한다.
@RequestMapping으로 /board로 시작하는 모든 처리를 BoardController가 하도록 한다.
해당 패키지는 servlet-context에 기본으로 설정되어 있으므로 별도의 설정이 필요하지 않다.

package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
public class BoardController {

}

목록 처리

package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {

	private BoardService service;
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}
}

BoardController는 BoardService에 대해서 의존적이므로 @AllArgsConstructor를 이용해 생성자를 만들고 자동으로 주입하도록 한다(만약 생성자를 만들지 않을 경우는 @Setter(onMethod_ = { @Autowired })를 이용해 처리한다).

등록 처리

등록 작업이 끝난 후 다시 목록 화면으로 이동할 때 새롭게 등록된 게시물 번호를 같이 전달하기 위해 RedirectAttributes를 이용한다.

package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {

	private BoardService service;
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}
	
	@PostMapping("/register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("register: " + board);
		
		service.register(board);
		rttr.addFlashAttribute("result", board.getBno());
		return "redirect:/board/list";
	}
}

조회 처리

get() 메서드에는 bno값을 좀 더 명시적으로 처리하는 @RequestParam을 이용해 지정한다(파라미터 이름과 변수 이름을 기준으로 동작하기 때문에 생략해도 무방하다). 또한 화면 쪽으로 해당 번호의 게시물을 전달해야 하므로 Model을 파라미터로 지정한다.

수정 처리

수정작업 시작 화면은 get방식으로 접근하지만 실제 수정 작업은 POST방식으로 동작한다.

삭제 처리

삭제는 반드시 POST방식으로만 처리한다.

package org.zerock.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.zerock.domain.BoardVO;
import org.zerock.service.BoardService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Controller
@Log4j
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {

	private BoardService service;
	
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
	}
	
	@PostMapping("/register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("register: " + board);
		
		service.register(board);
		rttr.addFlashAttribute("result", board.getBno());
		return "redirect:/board/list";
	}
	
	@GetMapping("/get")
	public void get(@RequestParam("bno") Long bno, Model model) {
		log.info("/get");
		model.addAttribute("board", service.get(bno));
	}
	
	@PostMapping("/modify")
	public String modify(BoardVO board, RedirectAttributes rttr) {
		log.info("modify:" + board);
		if(service.modify(board)) {
			rttr.addFlashAttribute("result", "success");
		}
		return "redirect:/board/list";
	}
	
	@PostMapping("/remove")
	public String remove(@RequestParam("bno") Long bno, RedirectAttributes rttr) {
		log.info("remove..."+bno);
		if(service.remove(bno)) {
			rttr.addFlashAttribute("result", "success");
		}
		return "redirect:/board/list";
	}
}

0개의 댓글