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를 가진 레코드의 titlecontent를 업데이트하기 위해 호출됩니다.
    • title: 업데이트할 새로운 제목.
    • content: 업데이트할 새로운 내용.
    • id: 업데이트할 레코드를 식별하는 고유 ID입니다.

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

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

 
 
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를 가진 게시물의 titlecontent를 업데이트합니다. 이 메서드는 이전에 작성한 것처럼 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.assertThatAssertJ 라이브러리에서 제공하는 메서드로, 단언(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