[ BoardJPARepository 생성 ]
package shop.mtcoding.blog.board; import org.springframework.data.jpa.repository.JpaRepository; public interface BoardJPARepository extends JpaRepository<Board, Integer> { }
findByIdJoinUser를 제외한 나머지는 JPARepository가 들고 있음. (기본적인 CRUD라?)
findByIdJoinUser만 BoardJPARepository에 만들어주자!
[ 테스트 시작! ]
지금 다 LAZY 전략이다.
[ save_test ]
@DataJpaTest public class BoardJPARepositoryTest { @Autowired private BoardJPARepository boardJPARepository; //save @Test public void save_test() { //given User sessionUser = User.builder().id(1).build(); Board board = Board.builder() .title("제목5") .content("내용5") .user(sessionUser) .build(); //when boardJPARepository.save(board); //then System.out.println("save_test : " + board.getId()); }
[ findById_test ]
//findById @Test public void findById_test() { //given int id = 1; //when Optional<Board> boardOP = boardJPARepository.findById(id); if (boardOP.isPresent()) { Board board = boardOP.get(); System.out.println("findById_test : " + board.getTitle()); } //then }
[ findByIdJoinUser ] - BoardJPARepository에서 작성
package shop.mtcoding.blog.board; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface BoardJPARepository extends JpaRepository<Board, Integer> { @Query("select b from Board b join fetch b.user u where b.id = :id") Board findByIdJoinUser(@Param("id") int id); }
이렇게 2줄만 적으면 join도 끝! 알아서 구현해줌
@Query문 적어줘야함 (join이니… 쿼리 메소드 사용 불가!)
원래는 이렇게 길게 적었는데… 2줄로 끝나버렸다.
[ findByIdJoinUser_test ]
//findByIdJoinUser @Test public void findByIdJoinUser_test() { //given int id = 1; //when Board board = boardJPARepository.findByIdJoinUser(id); //then System.out.println("findByIdJoinUser_test : " + board.getTitle()); System.out.println("findByIdJoinUser_test : " + board.getUser().getUsername()); Assortion~~~코드도 있어야함 }
Assortion 하기 전에 반드시 눈으로 검증을 한 다음 하기!
[ findAll_test ] - Sort
//findAll (sort) @Test public void findAll_test() { //given Sort sort = Sort.by(Sort.Direction.DESC, "id"); //when List<Board> boardList = boardJPARepository.findAll(sort); //then System.out.println("findAll_test : " + boardList); }
[ deleteById_test ]
//deleteById @Test public void deleteById_test() { //given int id = 1; //when boardJPARepository.deleteById(id); //then }
delete 할 때, select 먼저 하고 delete 날아가니까 select 쿼리문이 뜬다.
근데 지금 delete 쿼리가 안 날아가는 이유 → 트랜젝션 때문 (알지?)
엔티티 매니저로 삭제할 때에는 em.remove로 해야함.
삭제할 때 번호로 삭제하려면 조회한 아이디로 삭제해야하기 때문에 아이디를 먼저 받아야한다. 때문에 바로 삭제가 안되고 조회부터 해야 함
[ delete쿼리 확인하고 싶으면 em.flush ]
@DataJpaTest public class BoardJPARepositoryTest { @Autowired private BoardJPARepository boardJPARepository; @Autowired private EntityManager em; //deleteById @Test public void deleteById_test() { //given int id = 1; //when boardJPARepository.deleteById(id); em.flush(); //then }
조회 후 삭제 쿼리문 날아가는 것 확인!!!
Share article