오늘은 게시판을 총 정리하면서
기능의 흐름부터 사용된 매서드 등의 역할 등을
하나하나 세세히 파볼 예정이다.
복습하는 느낌으로, 처음부터 진행할 예정인만큼
오래 걸리겠지만 세세하고 자세하게 적어보자....
controller
// 세이브 주소로 요청하는 매서드 @Getmapping("save") public String saveForm(){ return "board/save"; } // 세이브(글쓰기) 를 진행하는 메서드 @Postmapping("save") public String save(@ModelAttribute BoardSaveDTO boardSaveDTO){ Long boardId = bs.save(boardSaveDTO); return "redirect:/board/"; }
ModelAttribute 는 자동으로 객체를 생성해주는 어노테이션입니다.
위 코드를 읽어면 saveForm 의 경우 save 주소로 보내주는 역할입니다.
그럼 save는 작성된 값을 담아 서비스로 리턴해주는 역할을 가지고있는데
ModelAttribute 을 이용해 BoardSaveDTO 클래스의 boardSaveDTO라는
객체를 생성해 사용할 수 있게 해주며, HTTP로 넘어온 값을 자동으로 바인딩 해 줍니다.
즉 Long으로 선언한 boardId 안에 bs.save(boardSaveDTO)값을 담아주고 자동으로 넘어오는 값들(작성자,제목,비밀번호 등)을 해당 변수를 묶어줍니다.
service
@Override public Long save(BoardSaveDTO boardSaveDTO) { BoardEntity boardEntity = BoardEntity.toSaveEntity(boardSaveDTO); return br.save(boardEntity).getId(); }
해당 메서드는 리파지토리로 넘겨주기 전에 DTO값을 Entity 변경해줘야 하는 부분을 담당하는데,
BoardEntity 라는 클래스의 boardEntity 객체를 생성해
BoardEntity.toSaveEntity(boardSaveDTO) 를 담아
리파지토리로 보내준다.
- BoardSaveDTO
@Data @NoArgsConstructor @AllArgsConstructor public class BoardSaveDTO { private String boardWriter; private String boardPassword; private String boardTitle; private String boardContents; private LocalDateTime boardDate; }
BoardSaveDTO - 글 작성 시 필요한 값들을 필드로 선언한다..
controller
@GetMapping("/") public String findAll(Model model){ List<BoardDetailDTO> boardList = bs.findAll(); model.addAttribute("boardList",boardList); return "board/findAll"; }
전체 값을 출력해야하기 때문에 정보들을 가져온다(Get)
Model 타입의 객체를 선언해 파라미터로 받아줍니다.List<BoardDetailDTO>
를 사용해 boardList = bs.findAll(); 값을 boardList에 담아주고 addAttribute로 모델에 값을 담아줍니다.
리턴값은 당연히 findAll으로~~~
ServiceImpl
@Override public List<BoardDetailDTO> findAll() { List<BoardEntity> boardEntityList = br.findAll(); List<BoardDetailDTO> boardList = new ArrayList<>(); for (BoardEntity boardEntity : boardEntityList){ boardList.add(BoardDetailDTO.toBoardDetailDTO(boardEntity)); } return boardList; }
List<BoardDetailDTO>
이건 가져오는거니까....
br.findAll(); 을 List로 선언한 boardEntityList 에 담아주고!
List로 선언한 boardList 에 값을 담아서 리턴해야하는데....
전부 출력해야하는거니까 값을 모두 찍어야지...
for each 문을 사용해서for (BoardEntity boardEntity : boardEntityList){ boardList.add(BoardDetailDTO.toBoardDetailDTO(boardEntity)); }
으로 boardEntity에 담긴 값을 BoardDetailDTO에 담고 그 값을 또
boardList에 담아서 리턴해주면~~끝
물론 toBoardDetailDTO 를 DTO에 선언해줘야 값을 가져올수 있으니까~
BoardDetailDTO@Data @AllArgsConstructor @NoArgsConstructor public class BoardDetailDTO { private Long boardId; private String boardWriter; private String boardPassword; private String boardTitle; private String boardContents; private LocalDateTime boardTime; public static BoardDetailDTO toBoardDetailDTO(BoardEntity boardEntity){ BoardDetailDTO boardDetailDTO = new BoardDetailDTO(); boardDetailDTO.setBoardId(boardEntity.getId()); boardDetailDTO.setBoardWriter(boardEntity.getBoardWriter()); boardDetailDTO.setBoardPassword(boardEntity.getBoardPassword()); boardDetailDTO.setBoardTitle(boardEntity.getBoardTitle()); boardDetailDTO.setBoardContents(boardEntity.getBoardContents());)); if(boardEntity.getUpdateTime()==null){ boardDetailDTO.setBoardTime(boardEntity.getCreateTime()); }else { boardDetailDTO.setBoardTime(boardEntity.getUpdateTime()); } } }
길긴 한데...... 어차피 값을 다 담아줘야 하니까 악으로 깡으로 써야한다....