//delete//삭제 할 번호가 있는지 없는지 확인 해야함, 트랙젝션이 뜨면 느려짐//Repository 이름은 직관적 이름을 사용해야한다.
@Transactional
public voiddeleteById(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 voidupdateById(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">
<divclass="card"><divclass="card-header"><b>글수정하기 화면입니다</b></div><divclass="card-body"><!--
method 가 put 이라면 /update를 사용 할 필요가 없다. post는 동사를 걸어준다.
--><formaction="/board/{{model.id}}/update"method="post"><divclass="mb-3"><inputtype="text"class="form-control"placeholder="Enter title"name="title"value="{{model.title}}"></div><divclass=" mb-3"><textareaclass="form-control"rows="5"name="content"> {{model.content}} </textarea></div><buttonclass="btn btn-primary form-control">글수정하기완료</button></form></div></div>
action 속성은 폼이 제출되었을 때 데이터를 처리할 URL을 지정합니다. 여기서는 /board/{{model.id}}/update로 설정되어 있으며, {{model.id}}는 템플릿 엔진(예: Django, Flask, Thymeleaf 등)에 의해 게시물의 고유 ID로 대체됩니다.
method="post"는 폼 데이터가 서버로 전송될 때 HTTP POST 요청을 사용함을 나타냅니다. POST 메서드는 주로 데이터를 생성하거나 수정할 때 사용됩니다
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 Stringupdate(@PathVariable("id") int id, @RequestParam("title") String title, @RequestParam("content") String contnet) {
boardRepository.updateById(title, content, id);
//만들어놨으면 redirectreturn"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 voidfindById_test() {
//given (가짜로 id를 만들어본다.)
int id = 1;
//whenBoard 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");
}
💡
상세보기 테스트 결과
💡
이 코드는 JUnit을 사용하여 작성된 단위 테스트에서 AssertJ 라이브러리를 사용하여 특정 조건이 충족되는지 확인하는 단언문입니다. 이 코드의 각 부분에 대한 설명은 다음과 같습니다:
Assertions.assertThat(board.getTitle())
설명:
Assertions.assertThat은 AssertJ 라이브러리에서 제공하는 메서드로, 단언(assertion)을 작성할 때 사용합니다.
board.getTitle()은 board 객체의 getTitle() 메서드를 호출하여 해당 객체의 title 값을 반환합니다. 여기서 board는 테스트하고자 하는 객체입니다.