본문 바로가기

웹 개발/Spring

[Web_Spring] 17

실습(댓글)

- [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