Model 은 응답되는 데이터!
템플릿 엔진을 사용하면 html 에 Model 을 넣어서 전달 할 수 있다.
view(화면) - Controller - Repository 이런 순서대로 만들어도 되지만 복잡해진다
그러니 Repository 부터 만들어서 select 쿼리 잘 되는지 먼저 확인하자

jakarta.persistence Query 쿼리 선택

쿼리뒤에 클래스 작성해주면 JPA 가 Object Mapping 해준다.

결과가 여러개 나오면 getResultList()
결과가 1개만 나오는거면 getSingleResult()

package shop.mtcoding.blog.board;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Repository // @Repository를 붙이면 스프링이 new를 해서 IoC(컬렉션 List자료형 같은거)에 저장한다. - inversion of container
public class BoardRepository {
@Autowired // IoC에 있는 객체를 찾아온다.
private EntityManager em;
public List<Board> findAll() {
Query query = em.createNativeQuery("select * from board_tb order by id desc", Board.class); // board 클래스로 매핑해서 받는다. => Object Mapping
// 하이버네이트는 오브젝트 매핑뿐만 아니라 오브젝트 릴레이션 매핑도 해준다(매우 편리함)
// @Entity 로 관리되는 애들만 매핑이 된다.
List<Board> boardList = query.getResultList();
return boardList;
//datasource를 쓰고 있기 때문에, close 안해줘도 된다.
}
// insert 하기
@Transactional // 변경요청할 때는 transactional을 붙여줘야한다.
public void save(String title, String content) {
Query query = em.createNativeQuery("insert into board_tb(title, content, created_at) values(?,?,now())");
query.setParameter(1, title); // position = ?의 순서
query.setParameter(2, content);
query.executeUpdate();
}
// transational이 끝나기전에는 이 데이터가 안보인다.
}
Datasource 가 내장되어있기 때문에 close 안해줘도 된다!
insert , delete, update 할 때만 @ Transactional 을 매서드 위에 붙여준다.
지금 하는건 조회 select 이니까 안붙여줘도 Ok.
BoardRepositoryTest 에 findAll 매서드 테스트용으로 만들어준다.


select 잘 되는거 콘솔에서 확인할 수 있다.

만약 위처럼 쿼리를 잘못적었으면 ⇒ 콘솔에 SQL 에러난다

5개의 데이터가 잘 들어가 있음을 배열의 크기로 확인할 수 있다.

나는 위에 콘솔에 한국어가 잘 나왔지만,
뚫뀁꽉 처럼 이상한 한국어가 나온다면 아래 설정 해주기!
인텔리제이에서 한글이 깨지면 settings → gradle → 아래 두 가지 IntelliJ IDEA 로 바꿔준다.

Share article