1. 영속성 객체를 사용한 데이터 조회
네이티브쿼리 사용
public Board findById(int id) { Query query = em.createNativeQuery("select * from board_tb where id =?",Board.class); query.setParameter(1,id); Board board = (Board) query.getSingleResult(); }
Persistence Context 사용
public Board findById(int id){ Board board = em.find(Board.class,id); return board; }
ID가 1번인 데이터를 조회하면 PC에 데이터가 없기 때문에 DB에서 데이터를 조회한다.
@Test public void fintById_test(){ int id = 1; boardReposiroty.findById(id); }
쿼리가 한번 전송된다.
만약 ID가 1번인 데이터를 한 번 더 조회하면 PC 메모리에 데이터가 남아있기 때문에 DB에서 조회하지 않고 캐싱된다.
@Test public void fintById_test(){ int id = 1; boardReposiroty.findById(id); boardReposiroty.findById(id); }
이미 조회된 데이터가 있기 때문에 쿼리를 날리지 않고 캐싱된다.
2. 컨트롤러
@GetMapping("/board/{id}") public String detail(@PathVariable Integer id,HttpServletRequest request) { // int 를 쓰면 값이 없으면 0, Integer 를 넣으면 값이 없을 때 null 값이 들어옴. Board board = boardPersistRepository.findById(id); request.setAttribute("board",board); return "board/detail";
조회된 board 객체를 requset 객체에 담아 전달한다.
3. View 확인하기
<div class="container p-5"> <!-- 수정삭제버튼 --> <div class="d-flex justify-content-end"> <a href="/board/{{board.id}}/update-form" class="btn btn-warning me-1">수정</a> <form action="/board/{{board.id}}/delete" method="post"> <button class="btn btn-danger">삭제</button> </form> </div> <div class="d-flex justify-content-end"> <b>작성자</b> : {{board.username}} </div> <!-- 게시글내용 --> <div> <h2><b>{{board.title}}</b></h2> <hr /> <div class="m-4 p-2"> {{board.content}} </div> </div>
Share article