

[ 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