๋ฐฑ์๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ง์ ๊ฒ์ํCRUD๋ ๊ตฌํ์ ํด ๋ด์ผํ๋ค๊ณ ์๊ฐ์ด ๋ค์๊ณ , ๊น์ํ๋์ Spring ๊ธฐ์ด ๊ฐ์์ Spring Mvc 1 ํธ์ ๋ฃ๊ณ ์ง์ ํ๋ฒ ๊ตฌํํด ๋ณด์ ๋ผ๋ ์์ ๊ฐ์ ์ป์๋ค!!
package board.boardservice.domain;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
public class Board {
private Long id;
private String sub;
private String content;
private Date date;
private int count;
public Board(String sub, String content, Date date) {
this.sub = sub;
this.content = content;
this.date = date;
}
public void view(){
count++;
}
}
package board.boardservice.repository;
import board.boardservice.domain.Board;
import java.util.List;
public interface BoardRepository {
Board save(Board board);
Board findById(Long id);
List<Board> findByAll();
void upDate(Long id, Board board);
void deleteBoard(Long id);
void clearStore();
}
package board.boardservice.repository;
import board.boardservice.domain.Board;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import java.util.*;
@Slf4j
@Repository
public class MemoryBoardRepository implements BoardRepository{
private static final Map<Long, Board> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Board save(Board board) {
board.setId(sequence++);
store.put(board.getId(), board);
board.view();
return board;
}
@Override
public Board findById(Long id) {
return store.get(id);
}
@Override
public List<Board> findByAll() {
return new ArrayList<>(store.values());
}
@Override
public void upDate(Long id, Board board) {
Board findBoard = findById(id);
findBoard.setDate(new Date());
findBoard.setSub(board.getSub());
findBoard.setContent(board.getContent());
}
@Override
public void deleteBoard(Long id) {
if(store.containsKey(id)){
store.remove(id);
log.info("์ญ์ ์๋ฃ");
}
else{
log.info("ํด๋น ์์ด๋๋ ์์ต๋๋ค");
}
}
@Override
public void clearStore(){
store.clear();
}
}
BoardRepository
๋ฅผ implements ๋ฐ์ ์ ์ฅ์๋ฅผ Map<Long, Board>
๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์๋ค.save()
:ํด๋น ๊ฒ์๋ฌผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅfindByAll()
: ์ ์ฒด์ ๊ฒ์๊ธ ๋ฐํupDate()
: ํด๋น ์์ด๋๋ก ์ ์ฅ๋์ด์๋ ๊ฒ์๊ธ์ ์ฐพ์์ ํ๋ผ๋ฏธํฐ์ ์๋ ๊ฒ์๊ธ๋ก ์
๋ฐ์ดํธdeleteBoard()
: ํด๋น ์์ด๋๋ก ์ฐพ์ ๊ฒ์๊ธ ์ญ์ .@Repository
: MemoryBoardRepositoty๋ฅผ ์คํ๋ง ๋น์ ๋ฑ๋ก @Controller
@RequestMapping("/basic/boards")
@RequiredArgsConstructor
public class BoardController {
private final BoardRepository boardRepository;
@Controller
: ์คํ๋ง ๋น์ ์ปจํธ๋กค๋ฌ ๋ฑ๋ก@RequestMapping
: Default Url์ ๋ฑ๋ก์์ผ ์ค๋ค@RequiredArgsConstructor
: final์ด ๋ถ์ ๋ฉค๋ฒ๋ณ์๋ง ์ฌ์ฉํด์ ์ฌ์ฉ์๋ฅผ ๋ง๋ค์ด์ค @Autowired
: ์์กด๊ด๊ณ ์๋์ฃผ์
(์๋ต๊ฐ๋ฅ) @GetMapping
public String boards(Model model) {
List<Board> boardList = boardRepository.findByAll();
model.addAttribute("board", boardList);
return "basic/boards";
}
@PostConstruct
public void init() {
boardRepository.save(new Board("ใ
ใ
", "ใ
ใ
", new Date()));
boardRepository.save(new Board("ใ
ใ
", "ใ
ใ
", new Date()));
}
/basic/boards
์ด ์์ฒญ์ด ๋ค์ด์ค๋ฉด boards()
๋ฉ์๋ ์ํ ํ ์คํธ๋ง path ๋ฐํ@PostConstruct
: ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ๋ฐ์ดํฐ ์ฝ์
<tr th:each="board : ${board}">
<td th:text="${board.id}">user123</td>
<td><a th:href="@{/basic/boards/{boardId} (boardId=${board.id})}" th:text="${board.sub} ">๊ฒ์๊ธ ์ ๋ชฉ</a></td>
<td th:text="${board.count}">100</td>
<td th:text="${board.date}">2024.02.06</td>
</tr>
@GetMapping("/{boardId}")
public String board(@PathVariable Long boardId, Model model) {
Board board = boardRepository.findById(boardId);
model.addAttribute("board", board);
return "basic/board";
}
Model
์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํ ๋ ๋๋ง ์์
@GetMapping("/create")
public String createBoardForm() {
return "basic/addForm";
}
@PostMapping("/create")
public String createBoard(@ModelAttribute Board board) {
boardRepository.save(board);
board.setDate(new Date());
return "redirect:/basic/boards/" + board.getId();
}
Post
, Get
๋๋ค ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ฌ์ฉ@GetMapping
: ์ ์ํ์ ๋ฑ๋กํ๋ ํผ์ ๋ณด์ฌ์ค๋ค.@PostMapping
๋งคํ ํ @ModelAttribute
๋ก Board ๊ฐ์ฒด ์์ฑ ํ Model์ ๋ด๋๋ค.
@GetMapping("/edit/{boardId}")
public String editForm(@PathVariable Long boardId, Model model){
Board findBoard = boardRepository.findById(boardId);
model.addAttribute("board", findBoard);
return "basic/edit";
}
@PostMapping("/edit/{boardId}")
public String edit(@PathVariable Long boardId, @ModelAttribute Board board){
boardRepository.upDate(boardId, board);
return "redirect:/basic/boards/{boardId}";
}
@GetMapping("/delete/{boardId}")
public String delete(@PathVariable Long boardId){
boardRepository.deleteBoard(boardId);
return "redirect:/basic/boards";
}
@PostMapping
์ผ๋ก ์จ ๋ฐ์ดํฐ๋ฅผ Create์ ๋์ผํ๊ฒ @ModelAttribute
๋ก ์งํ @PathVariable
๋ก ์์ด๋๋ฅผ ๋ฐ์ ์ญ์ ์งํ ํ ๋ฆฌ๋ค์ด๋ ํธ