실습(댓글)
- [Web_Spring] 16 이어서
1. src/main/java/com.example.board/controller/BoardController.java
package com.example.board.controller;
import com.example.board.domain.vo.BoardVO;
import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.PageDTO;
import com.example.board.service.BoardService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.springframework.web.servlet.view.RedirectView;
import javax.servlet.http.HttpServletRequest;
/*
* TASK URL METHOD PARAMETER FORM URL이동
*
* 전체목록 /board/list GET 없음 없음
* 등록 /board/register POST 모든 항목 필요 /board/list
* 조회 /board/read GET boardNumber 없음
* 삭제 /board/remove POST boardNumber 없음 /board/list
* 수정 /board/modify POST 모든 항목 필요 /board/read
*
* */
@Controller
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/board/*")
public class BoardController {
private final BoardService boardService;
@GetMapping("register")
public void register(){}
@GetMapping("list")
public String getList(Criteria criteria, Model model){
log.info("----------------------------");
log.info("list............. : " + criteria);
log.info("----------------------------");
model.addAttribute("boardList", boardService.getList(criteria));
model.addAttribute("pageDTO", new PageDTO(criteria, boardService.getTotal(criteria)));
return "/board/list";
}
@PostMapping("register")
// 매개변수에 선언된 객체는 자동으로 화면에 전달되므로,
// 이를 막기 위해서는 redirect 방식의 전송이 필요하다.
public RedirectView register(BoardVO boardVO, RedirectAttributes rttr){
log.info("----------------------------");
log.info("register............. : " + boardVO);
log.info("----------------------------");
boardService.register(boardVO);
// 1. Flash 사용
// 세션에 파라미터를 저장하고, request 객체가 초기화된 후 다시 request에 담아준다.
rttr.addFlashAttribute("boardNumber", boardVO.getBoardNumber());
// 2. 쿼리 스트링
// rttr.addAttribute("boardNumber", boardVO.getBoardNumber());
return new RedirectView("/board/list");
}
// 게시글 상세보기
@GetMapping({"read", "modify"})
public void read(Long boardNumber, Criteria criteria, HttpServletRequest req, Model model){
log.info("----------------------------");
log.info(req.getRequestURI() + "............. : " + boardNumber);
log.info("----------------------------");
model.addAttribute("board", boardService.get(boardNumber));
}
// 수정
@PostMapping("modify")
public RedirectView modify(BoardVO boardVO, Criteria criteria, RedirectAttributes rttr){
log.info("----------------------------");
log.info("modify............. : " + boardVO);
log.info("criteria.......... : " + criteria);
log.info("----------------------------");
boardService.modify(boardVO);
// 컨트롤러에서 다른 컨트롤러의 매개변수로 파라미터를 전달할 때에는
// addAttribute(), 쿼리스트링 방식으로 전달해야 받을 수 있다.
// Flash방식은 최종 응답 화면에서 사용될 파라미터를 전달할 때에만 사용하도록 한다.
rttr.addAttribute("boardNumber", boardVO.getBoardNumber());
// 객체를 화면에 전달할 때에는 Flash를 사용하자.
rttr.addFlashAttribute("criteria", criteria);
return new RedirectView("/board/read");
}
// 삭제
@PostMapping("remove")
public String remove(Long boardNumber, Criteria criteria, Model model){
log.info("----------------------------");
log.info("remove............. : " + boardNumber);
log.info("----------------------------");
boardService.remove(boardNumber);
return getList(criteria, model);
}
}
2. src/test/java/com.example.board/mapper/ReplyMapperTests.java
package com.example.board.mapper;
import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.ReplyVO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.stream.IntStream;
@SpringBootTest
@Slf4j
public class ReplyMapperTests {
@Autowired
private ReplyMapper replyMapper;
private Long[] arBno = {5201L, 5183L, 5182L, 5181L, 5180L};
// @Test
// public void insertTest(){
//// 5개의 게시글에 2개씩 댓글 달기
//// 람다식 사용
// IntStream.rangeClosed(1, 10).forEach(i -> {
// ReplyVO replyVO = new ReplyVO();
//
// replyVO.setBoardNumber(arBno[i % 5]);
// replyVO.setReplyContent("댓글 테스트" + i);
// replyVO.setReplyWriter("user" + i);
//
// replyMapper.insert(replyVO);
// });
// }
// @Test
// public void selectTest(){
// log.info(replyMapper.select(1L).toString());
// }
// @Test
// public void updateTest(){
// ReplyVO replyVO = replyMapper.select(1L);
// replyVO.setReplyContent("수정된 댓글 내용");
// replyMapper.update(replyVO);
// }
// @Test
// public void deleteTest(){
// replyMapper.delete(1L);
// }
// @Test
// public void getListTest(){
// replyMapper.getList(new Criteria(1, 10), 5201L).stream().map(reply -> reply.getReplyContent()).forEach(log::info);
// }
@Test
public void getTotalTest(){
log.info("COUNT : " + replyMapper.getTotal(5183L));
}
}
3. src/test/java/com.example.board/service/ReplyServiceTests.java
package com.example.board.service;
import com.example.board.domain.dao.ReplyDAO;
import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.ReplyVO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.stream.IntStream;
@SpringBootTest
@Slf4j
public class ReplyServiceTests {
@Autowired
private ReplyDAO replyDAO;
private Long[] arBno = {5201L, 5183L, 5182L, 5181L, 5180L};
// @Test
// public void registerTest(){
//// 5개의 게시글에 2개씩 댓글 달기
//// 람다식 사용
// IntStream.rangeClosed(21, 30).forEach(i -> {
// ReplyVO replyVO = new ReplyVO();
//
// replyVO.setBoardNumber(arBno[i % 5]);
// replyVO.setReplyContent("댓글 테스트" + i);
// replyVO.setReplyWriter("user" + i);
//
// replyDAO.register(replyVO);
// });
// }
// @Test
// public void readTest(){
// log.info(replyDAO.read(25L).toString());
// }
// @Test
// public void modifyTest(){
// ReplyVO replyVO = replyDAO.read(25L);
// replyVO.setReplyContent("수정된 댓글 내용");
// replyDAO.modify(replyVO);
// }
// @Test
// public void removeTest(){
// replyDAO.remove(25L);
// }
// @Test
// public void getListTest(){
// replyDAO.getList(new Criteria(1, 10), 5181L).stream().map(reply -> reply.getReplyContent()).forEach(log::info);
// }
// @Test
// public void getTotalTest(){
// log.info("COUNT : " + replyDAO.getTotal(5181L));
// }
}
4. src/main/java/com.example.board/controller/ReplyController.java
package com.example.board.controller;
/*
* REST(Representational State Transfer)
* 하나의 URI는 하나의 고유한 리소스(데이터)를 대표하도록 설계된다.
* 예)/board/123 : 게시글 중 123번 게시글의 전체 정보
* */
import com.example.board.domain.vo.Criteria;
import com.example.board.domain.vo.ReplyVO;
import com.example.board.service.ReplyService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.UnsupportedEncodingException;
import java.util.List;
@RestController
@Slf4j
@RequestMapping("/reply/*")
@RequiredArgsConstructor
public class ReplyController {
private final ReplyService replyService;
// 댓글 등록
// 브라우저에서 JSON타입으로 데이터를 전송하고 서버에서는 댓글의 처리 결과에 따라 문자열로 결과를 리턴한다.
// consumes : 전달받은 데이터의 타입
// produces : 콜백함수로 결과를 전달할 때의 타입
// @RequestBody : 전달받은 데이터를 알맞는 매개변수로 주입할 때 사용
// ResponseEntity : 서버의 상태코드, 응답 메세지 등을 담을 수 있는 타입
@PostMapping(value="/new", consumes = "application/json", produces = "text/plain; charset=utf-8")
public ResponseEntity<String> create(@RequestBody ReplyVO replyVO) throws UnsupportedEncodingException {
log.info("replyVO : " + replyVO);
replyService.register(replyVO);
return new ResponseEntity<>(new String("댓글 등록 성공".getBytes(), "UTF-8"), HttpStatus.OK);
}
@GetMapping("/{replyNumber}")
public ReplyVO read(@PathVariable("replyNumber") Long replyNumber){
log.info("read......... : " + replyNumber);
return replyService.read(replyNumber);
}
@GetMapping("/list/{boardNumber}/{page}")
public List<ReplyVO> getList(@PathVariable("page") int pageNum, @PathVariable("boardNumber") Long boardNumber){
log.info("getList........... : " + pageNum + ", " + boardNumber);
return replyService.getList(new Criteria(pageNum, 10), boardNumber);
}
// 댓글 삭제
@DeleteMapping("/{replyNumber}")
public String remove(@PathVariable("replyNumber") Long replyNumber){
log.info("remove............... : " + replyNumber);
replyService.remove(replyNumber);
return "댓글 삭제 성공";
}
// 댓글 수정
// PUT : 자원의 전체 수정
// PATCH : 자원의 일부 수정
@PutMapping("/{replyNumber}")
public String modify(@PathVariable("replyNumber") Long replyNumber, @RequestBody ReplyVO replyVO){
log.info("modify............... : " + replyNumber);
log.info(replyVO.toString());
replyVO.setReplyNumber(replyNumber);
replyService.modify(replyVO);
return replyService.read(replyNumber) == null ? "댓글 수정 실패" : "댓글 수정 성공";
}
}
'웹 개발 > Spring' 카테고리의 다른 글
[Web_Spring] 19 (0) | 2022.07.01 |
---|---|
[Web_Spring] 18 (0) | 2022.06.30 |
[Web_Spring] 16 (0) | 2022.06.28 |
[Web_Spring] 15 (0) | 2022.06.27 |
[Web_Spring] 14 (0) | 2022.06.26 |