데이터 처리를 위해 실제 DB와 연동되는 JPA Repository이다.
이는 Entity에 의해 생성된 DB의 table에 접근하는 메소드를 사용하기 위한 인터페이스이다.
아래 설명할 방법을 활용해 작성하면 Mybatis와 같은 별도의 SQL Mapper 없이도 CRUD를 수행할 수 있다.
// Repository 생성
public interface ExampleRepository extends JpaRepository<Question, Integer> {
Example
}
// 사용
@Autowired
private ExampleRepository exampleRepository;
@Test
void testJpa() {
List<Example> all = this.exampleRepository.findAll();
assertEquals(2, all.size());
Example e = all.get(0);
assertEquals("searchKeyword", e.getSubject());
}
Repository가 제공하는 메서드들을 이용하면 데이터 조회, 생성, 삭제 등의 CRUD 처리가 가능하다. 제공되는 메서드로는 findById, findBySubjectAndContent, findBySubjectLike 등 다양한 서치 메서드가 있으며 setSubject(), save(), delete() 등으로 등록, 수정, 삭제 처리가 가능하다. >>> Repository의 메소드명과 쿼리 생성 규칙에 대한 더 자세한 정보는 Repository 쿼리 생성 공식 문서를 참고하세요!
직접 쿼리를 추가하는 방법도 있다.
@Query("select "
+ "distinct q "
+ "from Question q "
...
+ "where "
+ " q.subject like %:kw% "
... )
Page<Question> findAllByKeyword(@Param("kw") String kw, Pageable pageable);
지난 글에서 트랜잭션과 예외처리에 대해 적어두었다!
트랜잭션은 업무 처리의 최소 단위이다. 어떠한 트랜잭션의 수행 중 에러가 발생하면 거기서 변경 중 에러가 발생하면 냅다 거기서 멈추면 안 되고, 아예 처리 전의 상태로 돌아올 수 있도록 처리해야 한다.
한편 테스트 코드로 DB에 액세스하는 경우에 모든 쿼리를 수행하지 않았음에도 DB 세션이 종료되어 버리는 경우도 발생할 수 있다.
이런 경우 @Transactional 어노테이션을 사용하면 해당 메소드를 트랜잭션으로 인식하여 DB 처리를 비교적 안전하고 수월하게 진행할 수 있다.
이 글은 점프 투 스프링부트를 스터디한 기록입니다.