1. 보드 컨트롤러 수정

2번째 에서는 매칭되는 url이 없어..

코드
@GetMapping("/board/{id}")
public String detail(@PathVariable("id") Integer id, HttpServletRequest request) {
Board board = boardRepository.findById(id);
//한건이니까 model
//여러건이면 models
request.setAttribute("model", board);
return "board/detail";
}
PathVariable 왜 사용하냐? 중요@
PathVariable 왜 사용하냐? 중요2. 보드 레파지토리
무조건 DB
DB먼저 테스트 하면 레파지토리쪽은 신경 안 써도 됨


조회여서 트랜잭션필요 없음
//resultset해서 하나씩 파싱해서 받아야 하는데 Board.class 하면 안해도 됨
public Board findById(int id) {
Query query = em.createNativeQuery("select * from board_tb where id = ?", Board.class);
query.setParameter(1, id);
//여러건이 아니니까 single, 빨간줄 뜨는 이유는 다운케스팅만 해주면 됨
Board board = (Board)query.getSingleResult();
return board;
}
3. 테스트
3.1 테스트 코드
//공장에 기계가 2개 있어 콩 10cm 있다 두번째 10cm 받아서 잘 간다
//첫번째는 10cm이하로 갈리는지확인
//두번째 10cm이하로 갈리는거 확인 할 필요 없음 임의로 갈린다는 것 만 넣으면 된다 이게 기븐
@Test
public void findById_test(){
//given
int id = 1;
//when
Board board = boardRepository.findById(id);
//eye 사실은 then 원래는 메서드로 해야 하는데 눈으로 해서 (어썰션으로 한다)(통합테스트 할 때 본다)
System.out.println(board.getId());
System.out.println(board.getTitle());
System.out.println(board.getContent());
//then
Assertions.assertThat(board.getTitle()).isEqualsTo("제목1");
Assertions.assertThat(board.getContent()).isEqualsTo("내용1");
}
끝 아님
3.2 경우의 수 생각하기
만약 6이 없는데 6이 나온다면
@Test
public void findById_test() {
//given
int id = 6;
//when
Board board = boardRepository.findById(id);
//eye 사실은 then 원래는 메서드로 해야 하는데 눈으로 해서 (어썰션으로 한다)(통합테스트 할 때 본다)
System.out.println(board.getId());
System.out.println(board.getTitle());
System.out.println(board.getContent());
}
오류

3.3 어디서 오류가 나는가?
여기서 오류남

- 문제 발생
화면을 누르면 상관 없지만 uri에 숫자 넣으면 문제가 된다 → 예외 잡아야 한다!!
오류 잡자
//resultset해서 하나씩 파싱해서 받아야 하는데 Board.class 하면 안해도 됨
public Board findById(int id) {
Query query = em.createNativeQuery("select * from board_tb where id = ?", Board.class);
query.setParameter(1, id);
//여러건이 아니니까 single, 빨간줄 뜨는 이유는 다운케스팅만 해주면 됨
try {
Board board = (Board) query.getSingleResult();
return board;
} catch (Exception e) {
return null;
}
}
이러면 nullpintException 오류남 → catch되면 null나온다고 했으니까

이거는 DB의 문제인데 테스트를 하지 않는다면 화면의 문제인지 알고 화면만 보고있다
- 다른 방법 이제는 예외 내가 제어할 수 있다 → 이거는 버전 2에서 할거다
3.4 보드 레파지토리에서 예외 제어 표시(임시)

테스트 돌리면 나온다

//resultset해서 하나씩 파싱해서 받아야 하는데 Board.class 하면 안해도 됨
public Board findById(int id) {
Query query = em.createNativeQuery("select * from board_tb where id = ?", Board.class);
query.setParameter(1, id);
//여러건이 아니니까 single, 빨간줄 뜨는 이유는 다운케스팅만 해주면 됨
try {
Board board = (Board) query.getSingleResult();
return board;
} catch (Exception e) {
throw new RuntimeException("게시글 id를 찾을 수 없습니다");
}
}
오류를 알고 있는 상황과 모르는 상황은 다르다 대비가 되는가 안 되는가 중요함!
이제 레파지토리 끝
번외
C에서 오류났다 try catch해준다 (여기서 오류나면 여기서 해결하겠다)
throw하면 아씨 나 모르겠는데 다른놈한테 위임함
만약 A도 throw하면 결국 JVM이 처리함

전부 throw로 날려서 최종 부모가 해결하는게 좋다!!
우리가 레이어(디스페치 서블릿 →컨트롤러, → 레파지토리, → em) 많이봄
지금은 레파지토리에서 에러남 → 모든 것 디스페치 서블릿에서 해결할 수 있게 핸들링 할 수 있게 만듬!!
디스페치 서블릿은 우리가 하는게 아니여서 그냥 던지기만 하면 알아서 해결해준다
3. 보드 컨트롤러 이동
@GetMapping("/board/{id}")
public String detail(@PathVariable("id") Integer id, HttpServletRequest request) {
Board board = boardRepository.findById(id);
//한건이니까 model
//여러건이면 models
request.setAttribute("model", board);
return "board/detail";
}
- for문 돌리면 {{}} 안에 모델.넣을 필요 없음
4. detail.mustache가서

{{>layout/header}}
<div class="container p-5">
<!-- 수정삭제버튼 -->
<div class="d-flex justify-content-end">
<a href="/board/{{model.id}}/update-form" class="btn btn-warning me-1">수정</a>
<form action="/board/{{model.id}}/delete" method="post">
<button class="btn btn-danger">삭제</button>
</form>
</div>
<div class="d-flex justify-content-end">
<b>작성자</b> : 익명
</div>
<!-- 게시글내용 -->
<div>
<h2><b>{{model.title}}</b></h2>
<hr/>
<div class="m-4 p-2">
{{model.content}}
</div>
</div>
</div>
{{>layout/footer}}
지금은 자바 스크립트 ajax안 쓰고 하려고 post에 insert delete update다 씀 나중에 배울거임
원래는 주소에 동사 넣지 않는다 하지만
<form action="/board/{{model.id}}" method="delete"> 원래는 이렇게 사용하면된다
하지만 4가지 다 쓰려면 js 사용해야 해서 post로 모든 것을 다 사용하기 위해
ajax, js 안 쓰고 java만 사용해서 crud만드려고 함
Share article