
1. View 확인하기


2. BoardController 에 updateForm() 만들기
- get 요청 : 수정 페이지 요청
 
- post 요청 : 수정 액션 요청
 
- get 요청 : 수정한 페이지로 이동
 
     이 페이지를 기억하기 위해 session에 저장해서 이동할 수 있음
package shop.mtcoding.blog.board;
import ch.qos.logback.core.model.Model;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@RequiredArgsConstructor
@Controller
public class BoardController {
    private final BoardNativeRepository boardNativeRepository;
    @GetMapping("/board/{id}/update-form")
    public String updateForm(@PathVariable (name="id") Integer id, HttpServletRequest request) {
        return "/board/update-form"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    
    @PostMapping("/board/{id}/delete")
    public String delete(@PathVariable Integer id) { // DTO 없이 구현
        boardNativeRepository.deleteById(id);
        return "redirect:/";
    }
    @GetMapping("/")
    public String index(HttpServletRequest request) {
        // 조회하기
        List<Board> boardList = boardNativeRepository.findAll();
        // 가방에 담기
        request.setAttribute("boardList", boardList);
        return "index"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/save")
    public String save(String title, String content, String username) { // DTO 없이 구현
        boardNativeRepository.save(title, content, username);
        return "redirect:/";
    }
    @GetMapping("/board/save-form")
    public String saveForm() {
        return "board/save-form";
    }
    @GetMapping("/board/{id}")
    public String detail(@PathVariable Integer id, HttpServletRequest request) { // Integer : 없으면 null, int : 0
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "board/detail";
    }
}
3. update-form 화면 만들기
{{> /layout/header}}
<div class="container p-5">
    <!-- 요청을 하면 localhost:8080/board/save POST로 요청됨
    title=사용자입력값&content=사용자값 -->
    <div class="card">
        <div class="card-header"><b>글수정하기 화면입니다</b></div>
        <div class="card-body">
            <form action="/board/1/update" method="post">
               <div class="mb-3"><!--username 추가-->
                    <input type="text" class="form-control" placeholder="Enter username" name="username" value="ssar">
                </div>
                <div class="mb-3">
                    <input type="text" class="form-control" placeholder="Enter title" name="title" value="제목1">
                </div>
                <div class="mb-3">
                    <textarea class="form-control" rows="5" name="content" value="내용1"></textarea>
                </div>
                <button type="submit" class="btn btn-primary form-control">글수정하기완료</button>
            </form>
        </div>
    </div>
</div>
{{> /layout/footer}}
4. BoardController 에 updateForm() 수정하기
package shop.mtcoding.blog.board;
import ch.qos.logback.core.model.Model;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@RequiredArgsConstructor
@Controller
public class BoardController {
    private final BoardNativeRepository boardNativeRepository;
    @GetMapping("/board/{id}/update-form")
    public String updateForm(@PathVariable (name="id") Integer id, HttpServletRequest request) {
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "/board/update-form"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/{id}/delete")
    public String delete(@PathVariable Integer id) { // DTO 없이 구현
        boardNativeRepository.deleteById(id);
        return "redirect:/";
    }
    @GetMapping("/")
    public String index(HttpServletRequest request) {
        // 조회하기
        List<Board> boardList = boardNativeRepository.findAll();
        // 가방에 담기
        request.setAttribute("boardList", boardList);
        return "index"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/save")
    public String save(String title, String content, String username) { // DTO 없이 구현
        boardNativeRepository.save(title, content, username);
        return "redirect:/";
    }
    @GetMapping("/board/save-form")
    public String saveForm() {
        return "board/save-form";
    }
    @GetMapping("/board/{id}")
    public String detail(@PathVariable Integer id, HttpServletRequest request) { // Integer : 없으면 null, int : 0
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "board/detail";
    }
}
5. update-form 수정하기
{{> /layout/header}}
<div class="container p-5">
    <!-- 요청을 하면 localhost:8080/board/save POST로 요청됨
    title=사용자입력값&content=사용자값 -->
    <div class="card">
        <div class="card-header"><b>글수정하기 화면입니다</b></div>
        <div class="card-body">
            <form action="/board/{{board.id}}/update" method="post">
               <div class="mb-3"><!--username 추가-->
                    <input type="text" class="form-control" placeholder="Enter username" name="username" value="{{board.username}}">
                </div>
                <div class="mb-3">
                    <input type="text" class="form-control" placeholder="Enter title" name="title" value="{{board.title}}">
                </div>
                <div class="mb-3">
                    <textarea class="form-control" rows="5" name="content">{{board.content}}</textarea>
                </div>
                <button type="submit" class="btn btn-primary form-control">글수정하기완료</button>
            </form>
        </div>
    </div>
</div>
{{> /layout/footer}}
6.

7. BoardController 에 update() 만들기
package shop.mtcoding.blog.board;
import ch.qos.logback.core.model.Model;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@RequiredArgsConstructor
@Controller
public class BoardController {
    private final BoardNativeRepository boardNativeRepository;
    @PostMapping("/board/{id}/update")
    public String update(@PathVariable Integer id, String title, String content, String username) { // DTO 없이 구현
        System.out.println("id : " + id);
        System.out.println("title : " + title);
        System.out.println("content : " + content);
        System.out.println("username : " + username);
        return "redirect:/board/" + id;
    }
    @GetMapping("/board/{id}/update-form")
    public String updateForm(@PathVariable (name="id") Integer id, HttpServletRequest request) {
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "/board/update-form"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/{id}/delete")
    public String delete(@PathVariable Integer id) { // DTO 없이 구현
        boardNativeRepository.deleteById(id);
        return "redirect:/";
    }
    @GetMapping("/")
    public String index(HttpServletRequest request) {
        // 조회하기
        List<Board> boardList = boardNativeRepository.findAll();
        // 가방에 담기
        request.setAttribute("boardList", boardList);
        return "index"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/save")
    public String save(String title, String content, String username) { // DTO 없이 구현
        boardNativeRepository.save(title, content, username);
        return "redirect:/";
    }
    @GetMapping("/board/save-form")
    public String saveForm() {
        return "board/save-form";
    }
    @GetMapping("/board/{id}")
    public String detail(@PathVariable Integer id, HttpServletRequest request) { // Integer : 없으면 null, int : 0
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "board/detail";
    }
}

- 단위 테스트 하기
 
package shop.mtcoding.blog.Board;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.Import;
import shop.mtcoding.blog.board.Board;
import shop.mtcoding.blog.board.BoardNativeRepository;
import java.util.List;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@Import(BoardNativeRepository.class)
@DataJpaTest
public class BoardNativeRepositoryTest {
    @Autowired // DI
    private BoardNativeRepository boardNativeRepository;
    @Test
    public void updateById_test(){
        // given
        int id = 1;
        String title = "제목수정1";
        String content = "내용수정1";
        String username = "이름수정1";
        // when
        boardNativeRepository.updateById(id, title, content, username);
        // then
        Board board = boardNativeRepository.findById(id);
        System.out.println("updateById_test/board : "+board);
        assertThat(board.getTitle()).isEqualTo("제목수정2");
        assertThat(board.getContent()).isEqualTo("내용수정1");
        assertThat(board.getUsername()).isEqualTo("이름수정1");
    }
    @Test
    public void findById_test() {
        //given - 지금은 넣을게 없음
        int id = 1;
        //when
        Board board = boardNativeRepository.findById(id);
        System.out.println("findById_test : " + board);
        //then
        //org.assertj.core.api
        Assertions.assertThat(board.getTitle()).isEqualTo("제목1");
        Assertions.assertThat(board.getContent()).isEqualTo("내용1");
    }
    @Test
    public void findAll_test() {
        //given - 지금은 넣을게 없음
        //when
        List<Board> boardList = boardNativeRepository.findAll();
        //then
        System.out.println("findAll_test/size : " + boardList.size());
        System.out.println("findAll_test/username : " + boardList.get(2).getUsername());
        //org.assertj.core.api
        Assertions.assertThat(boardList.size()).isEqualTo(4);
        Assertions.assertThat(boardList.get(2).getUsername()).isEqualTo("ssar");
    }
    @Test
    public void deleteById_test(){
        // given
        int id = 1;
        // when
        boardNativeRepository.deleteById(id);
        // then
        List<Board> boardList = boardNativeRepository.findAll();
        assertThat(boardList.size()).isEqualTo(2);
    }
}

8. BoardNativeRepository 에 update() 수정하기
package shop.mtcoding.blog.board;
import ch.qos.logback.core.model.Model;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@RequiredArgsConstructor
@Controller
public class BoardController {
    private final BoardNativeRepository boardNativeRepository;
    @PostMapping("/board/{id}/update")
    public String update(@PathVariable Integer id, String title, String content, String username){
        boardNativeRepository.updateById(id, title, content, username);
        return "redirect:/board/"+id;
    }
    @GetMapping("/board/{id}/update-form")
    public String updateForm(@PathVariable (name="id") Integer id, HttpServletRequest request) {
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "/board/update-form"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/{id}/delete")
    public String delete(@PathVariable Integer id) { // DTO 없이 구현
        boardNativeRepository.deleteById(id);
        return "redirect:/";
    }
    @GetMapping("/")
    public String index(HttpServletRequest request) {
        // 조회하기
        List<Board> boardList = boardNativeRepository.findAll();
        // 가방에 담기
        request.setAttribute("boardList", boardList);
        return "index"; // 서버가 내부적으로 index를 요청 - 외부에서는 다이렉트 접근이 안됨
    }
    @PostMapping("/board/save")
    public String save(String title, String content, String username) { // DTO 없이 구현
        boardNativeRepository.save(title, content, username);
        return "redirect:/";
    }
    @GetMapping("/board/save-form")
    public String saveForm() {
        return "board/save-form";
    }
    @GetMapping("/board/{id}")
    public String detail(@PathVariable Integer id, HttpServletRequest request) { // Integer : 없으면 null, int : 0
        Board board = boardNativeRepository.findById(id);
        request.setAttribute("board", board);
        return "board/detail";
    }
}

Share article