이 글은 코드로 배우는 스프링 웹 프로젝트(남가람북스, 구멍가게 코딩단)을 읽고 공부한 내용을 바탕으로 정리한 글입니다.
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 |
BoardController
를 controller
패키지 안에 작성하고, 위의 테이블의 기능들을 차례대로 메서드로 작성해보도록 하겠습니다.
BoardController
는 BoardService
타입의 객체와 같이 연동해야 하므로 의존성에 대한 처리를 해주어야 합니다. @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
파라미터를 명시적으로 수집합니다. (파라미터 이름과 변수 이름을 기준으로 동작하기 때문에 생략해도 무방합니다.) 또한 화면 쪽으로 bno
의 board
를 전달하기 위새 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 |
댓글