1. JPQL(Java Persistence Query Language) 이란?
JPA에서 사용하는 객체 지향 쿼리 언어로, 데이터베이스 테이블 대신 엔티티 객체 모델을 대상으로 쿼리를 작성한다.
(1) 기본 문법
Board 객체를 전체 조회한다.
select b from Board b
//b 는 Board 의 모든 데이터를 출력
Board 객체의 제목과 내용을 조회한다.
select b.title,b.content from Board b
where절을 사용한 조건 검색
select b.title from Board b where b.id = :id;
JOIN 사용
select b from Board b join fetch b.user u where b.id =:id
//Board 엔티티와 User 엔티티를 조인, Board 엔티티 필트에 User 오브젝트를 넣는다.

Board 엔티티 내부에 User 엔티티를 넣는다. 이렇게 되면 Board 객체를 조회할 때 User 객체의 데이터를 함께 받을 수 있다.
2. JPQL 을 활용한 데이터 조회
네이티브쿼리
select * from board_tb order by id desc;
JPQL, BoardPersistRepositoyu
public List<Board> findAll(){
Query query = em.createQuery("select b from Board b order by b.id desc",Board.class);
return query.getResultList() ;
}
3. JUnit 테스트
test/java/shop.mtcoding.blog/board/BoardPersistRepositoryTest
@Test
public void findAll_test(){
//given
//when
List<Board> boardList = boardPersistRepository.findAll();
//then
System.out.println("findAll_test/size : "+boardList.size());
System.out.println("findAll_test/username : "+boardList.get(2).getUsername());
//org.assertj.core.apo
Assertions.assertThat(boardList.size()).isEqualTo(4);
Assertions.assertThat(boardList.get(2).getUsername()).isEqualTo("ssar");
}

DB에 전달되는 쿼리가 JPQL 방식이다.
4. 컨트롤러
@GetMapping({ "/"})
public String index(HttpServletRequest request) {
List<Board> boardList = boardPersistRepository.findAll();
request.setAttribute("boardList",boardList);
return "index";
}
5. View 확인하기
{{#boardList}}
<div class="card mb-3">
<div class="card-body">
<h4 class="card-title">{{title}}</h4>
<div class="mb-3">{{time}}</div>
<a href="/board/{{id}}" class="btn btn-primary">상세보기</a>
</div>
</div>
{{/boardList}}

데이터가 정상적으로 화면에 출력된다.
Share article