

[ 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