inblog logo
|
Uni
    SpringbootSQL

    1-5 Delete, Update,Then(코드 검증)

    Delete, Update,Then(코드 검증)
    홍윤's avatar
    홍윤
    Aug 20, 2024
    1-5 Delete, Update,Then(코드 검증)
     

    1.Delete

     
    BoardRepository
    //delete //삭제 할 번호가 있는지 없는지 확인 해야함, 트랙젝션이 뜨면 느려짐 //Repository 이름은 직관적 이름을 사용해야한다. @Transactional public void deleteById(int id){ Query query = em.createNativeQuery("delete from board_tb where id =?"); query.setParameter(1, id); query.executeUpdate(); }
    💡
    @Transactional
    • 설명: 이 어노테이션은 메서드가 트랜잭션 내에서 실행된다는 것을 나타냅니다. 메서드가 성공적으로 완료되면 트랜잭션이 커밋되고, 실패하거나 예외가 발생하면 롤백됩니다. 트랜잭션이 생성되면 성능에 영향을 줄 수 있으므로, 가능한 한 최적화하는 것이 중요합니다.

    public void deleteById(int id)

    • 설명: 이 메서드는 특정 ID를 가진 레코드를 삭제하기 위해 호출됩니다. id는 삭제할 레코드의 고유 식별자입니다.

    Query query = em.createNativeQuery("delete from board_tb where id =?");

    • 설명: 이 줄은 EntityManager를 사용하여 네이티브 SQL 쿼리를 생성합니다. 이 경우, board_tb라는 테이블에서 특정 ID를 가진 레코드를 삭제하는 SQL 쿼리를 생성합니다. ?는 이후에 id 값으로 대체될 자리 표시자입니다.
     

     

    2.Update

     
    BoardRepository
    //udapte @Transactional public void updateById(String title, String content, int id) { Query query = em.createNativeQuery("update board_tb set title =? , content =? where id=?"); query.setParameter(1, title); query.setParameter(2, content); query.setParameter(3, id); query.executeUpdate(); }
    💡
    public void updateById(String title, String content, int id)
    • 설명: 이 메서드는 특정 ID를 가진 레코드의 title과 content를 업데이트하기 위해 호출됩니다.
      • title: 업데이트할 새로운 제목.
      • content: 업데이트할 새로운 내용.
      • id: 업데이트할 레코드를 식별하는 고유 ID입니다.

    Query query = em.createNativeQuery("update board_tb set title =? , content =? where id=?");

    • 설명: 이 줄은 EntityManager를 사용하여 네이티브 SQL 쿼리를 생성합니다. 여기서는 board_tb라는 테이블에서 특정 id를 가진 레코드의 title과 content 컬럼을 업데이트하는 쿼리를 생성합니다. ?는 이후에 파라미터 값으로 대체될 자리 표시자입니다.
     
     
     

     
     
    update-form.mustache
    {{>layout/header}} <div class="container p-5"> <div class="card"> <div class="card-header"><b>글수정하기 화면입니다</b></div> <div class="card-body"> <!-- method 가 put 이라면 /update를 사용 할 필요가 없다. post는 동사를 걸어준다. --> <form action="/board/{{model.id}}/update" method="post"> <div class="mb-3"> <input type="text" class="form-control" placeholder="Enter title" name="title" value="{{model.title}}"> </div> <div class=" mb-3"> <textarea class="form-control" rows="5" name="content"> {{model.content}} </textarea> </div> <button class="btn btn-primary form-control">글수정하기완료</button> </form> </div> </div>
    💡
    <form action="/board/{{model.id}}/update" method="post">
    • 설명:
      • action 속성은 폼이 제출되었을 때 데이터를 처리할 URL을 지정합니다. 여기서는 /board/{{model.id}}/update로 설정되어 있으며, {{model.id}}는 템플릿 엔진(예: Django, Flask, Thymeleaf 등)에 의해 게시물의 고유 ID로 대체됩니다.
      • method="post"는 폼 데이터가 서버로 전송될 때 HTTP POST 요청을 사용함을 나타냅니다. POST 메서드는 주로 데이터를 생성하거나 수정할 때 사용됩니다
      •  
        <input type="text" class="form-control" placeholder="Enter title" name="title" value="{{model.title}}">
      • 설명:
        • 이 요소는 제목(title)을 입력하기 위한 텍스트 입력 필드를 정의합니다.
        • type="text"는 텍스트 입력 필드임을 나타냅니다.
        • class="form-control"은 Bootstrap 클래스이며, 입력 필드를 적절한 스타일로 렌더링합니다.
        • placeholder="Enter title"은 사용자가 필드에 값을 입력하지 않았을 때 표시되는 안내 텍스트입니다.
        • name="title"은 이 필드의 이름을 지정하며, 폼이 제출될 때 이 이름으로 값이 서버로 전송됩니다.
        • value="{{model.title}}"는 템플릿 엔진에 의해 현재 게시물의 제목으로 대체됩니다. 사용자가 폼을 열면 이 필드에 기존 제목이 미리 입력됩니다.
        •  
          <textarea class="form-control" rows="5" name="content"> {{model.content}} </textarea>
        • 설명:
          • 이 요소는 내용을 입력하기 위한 텍스트 영역 필드를 정의합니다.
          • class="form-control"은 동일하게 Bootstrap 스타일링을 적용합니다.
          • rows="5"는 텍스트 영역의 초기 표시 줄 수를 지정합니다. 이 경우 5줄이 기본적으로 표시됩니다.
          • name="content"은 이 필드의 이름을 지정하며, 폼이 제출될 때 이 이름으로 값이 서버로 전송됩니다.
          • {{model.content}}는 템플릿 엔진에 의해 현재 게시물의 내용으로 대체됩니다. 사용자가 폼을 열면 이 텍스트 영역에 기존 내용이 미리 입력됩니다.
           
     
     
    BoardController
    //url : http://loacahost8080/board/1/update //body: title = 제목1변경&content=내용1변경 //content-type : x-www-form-urlencoded @PostMapping("/board/{id}/update") public String update(@PathVariable("id") int id, @RequestParam("title") String title, @RequestParam("content") String contnet) { boardRepository.updateById(title, content, id); //만들어놨으면 redirect return "redirect:/board/" + id; }
    💡

    @PostMapping("/board/{id}/update")

    • 설명: 이 어노테이션은 이 메서드가 /board/{id}/update 경로로 들어오는 POST 요청을 처리하도록 지정합니다.
      • {id}는 URL 경로 변수로, 업데이트하려는 특정 게시물의 고유 식별자를 나타냅니다.
      • @PostMapping은 POST 요청을 처리하기 위한 어노테이션입니다.

    public String update(@PathVariable("id") int id, @RequestParam("title") String title, @RequestParam("content") String content)

    • 설명: 이 메서드는 클라이언트로부터 전달된 데이터를 받아 게시물을 업데이트합니다.
      • @PathVariable("id") int id: URL에서 {id} 부분을 변수 id로 매핑하여 해당 값을 메서드로 전달합니다. 이 변수는 업데이트할 게시물의 ID입니다.
      • @RequestParam("title") String title: 요청 본문에서 title이라는 이름의 매개변수를 받아 이 값을 title 변수에 저장합니다. 이는 새로 업데이트할 게시물의 제목입니다.
      • @RequestParam("content") String content: 요청 본문에서 content라는 이름의 매개변수를 받아 이 값을 content 변수에 저장합니다. 이는 새로 업데이트할 게시물의 내용입니다.

    boardRepository.updateById(title, content, id);

    • 설명: boardRepository 객체의 updateById 메서드를 호출하여, 데이터베이스에서 특정 id를 가진 게시물의 title과 content를 업데이트합니다. 이 메서드는 이전에 작성한 것처럼 SQL UPDATE 쿼리를 실행합니다.

    return "redirect:/board/" + id;

    • 설명: 이 코드는 업데이트 작업이 완료된 후 사용자를 /board/{id} 페이지로 리다이렉트합니다.
      • "redirect:/board/" + id는 클라이언트의 브라우저를 해당 경로로 다시 보내도록 지시합니다. 이는 일반적으로 업데이트 후 변경된 내용을 확인하도록 사용자를 다시 그 게시물의 상세 페이지로 안내하기 위해 사용됩니다.
     

     

    3.Then(코드 검증)

     
    //상세보기 테스트 @Test public void findById_test() { //given (가짜로 id를 만들어본다.) int id = 1; //when Board board = boardRepository.findById(id); //eye (잘 하지 못 해서 눈으로 확인 했습니다.) System.out.println(board.getTitle()); System.out.println(board.getContent()); System.out.println(board.getContent()); //then(코드로 검증) Assertions.assertThat(board.getTitle()).isEqualTo("제목1"); }
    💡
    상세보기 테스트 결과
    notion image
    notion image
    💡
    이 코드는 JUnit을 사용하여 작성된 단위 테스트에서 AssertJ 라이브러리를 사용하여 특정 조건이 충족되는지 확인하는 단언문입니다. 이 코드의 각 부분에 대한 설명은 다음과 같습니다:

    Assertions.assertThat(board.getTitle())

    • 설명:
      • Assertions.assertThat은 AssertJ 라이브러리에서 제공하는 메서드로, 단언(assertion)을 작성할 때 사용합니다.
      • board.getTitle()은 board 객체의 getTitle() 메서드를 호출하여 해당 객체의 title 값을 반환합니다. 여기서 board는 테스트하고자 하는 객체입니다.

    isEqualTo("제목1")

    • 설명:
      • isEqualTo("제목1")은 앞서 assertThat 메서드로 전달된 값(board.getTitle()의 반환 값)이 "제목1"과 같은지 확인합니다.
      • 이 단언은 두 값이 동일한지를 비교하며, 동일하지 않다면 테스트는 실패하게 됩니다.

    전체 코드 설명

    • Assertions.assertThat(board.getTitle()).isEqualTo("제목1");는 board 객체의 title 속성이 "제목1"이라는 값과 동일한지 확인하는 단언문입니다.
    • 만약 board.getTitle()의 결과가 "제목1"과 같다면 이 테스트는 성공적으로 통과합니다.
    • 만약 값이 다르다면 테스트는 실패하며, 일반적으로 실패 원인을 설명하는 오류 메시지가 출력됩니다.
    이 단언문은 코드의 특정 부분이 예상한 대로 동작하는지 확인하는 데 사용됩니다. 예를 들어, 특정 메서드를 호출한 후 객체의 상태가 올바르게 변경되었는지 확인하는 데 유용합니다.
     

    //given (가짜로 id를 만들어본다.)

    • 설명: 테스트를 준비하는 단계입니다. 여기서는 테스트에서 사용할 데이터를 설정합니다.

    //when

    • 설명: 실제로 테스트하려는 동작을 수행하는 단계입니다

    //eye (잘 하지 못 해서 눈으로 확인 했습니다.)

    • 설명: 테스트의 중간에 결과를 눈으로 직접 확인하기 위한 디버깅 목적으로 출력하는 부분입니다.

    //then(코드로 검증)

    • 설명: 테스트 결과를 코드로 검증하는 단계입니다. 이 부분에서는 테스트의 성공 여부를 결정하는 중요한 검증 논리가 들어갑니다.
     
    //Update 테스트 @Test public void UpdateById_test() { //given int id = 1; String title = "제목1변경"; String content = "내용변경1"; //when boardRepository.updateById(title, content, id); //Then Board board = boardRepository.findById(id); Assertions.assertThat(board.getTitle()).isEqualTo("제목3변경"); }
     
    💡
    notion image
    notion image
     
     

    Share article

    Uni

    RSS·Powered by Inblog