개발자의 오르막

스프링 데이터 JPA 커스텀 인터페이스 만드는 방법 본문

ORM/JPA

스프링 데이터 JPA 커스텀 인터페이스 만드는 방법

계단 2019. 9. 24. 11:17

인터페이스를 정의할 때 2가지 경우가 있다.

1) JpaRepository의 메소드만을 사용하는 인터페이스를 만들 것이냐, 

2) 아님 인터페이스 자체를 커스터마이징 할 것이냐

 

이번 시간은 독자적인 인터페이스를 만들고 싶을 때 어떻게 하는지 알아보겠다.

 

# 독자적인 인터페이스를 정의

@RepositoryDefinition(domainClass = Comment.class, idClass = Long.class)
public interface CommentRepository {
	
	Comment save(Comment comment);
	
	List<Comment> findAll();
	
}

 

위의 예시와 같이 JpaRepository를 상속받지 않는 독자적인 인터페이스를 생성한 후

Test도 구성해준다.

@RunWith(SpringRunner.class)
@DataJpaTest
public class CommentRepositoryTest {

	@Autowired
	CommentRepository commentRepository;
	
	@Test
	public void crud() {
		Comment comment = new Comment();
		comment.setComment("Hello comment");
		commentRepository.save(comment);
		
		List<Comment> all = commentRepository.findAll();
		assertThat(all.size()).isEqualTo(1);
		
	}
}

 

허나, 이 방법은 문제점이 있는데, 바로 위의 CommentRepository를 사용하고자 할때

일일이 save, findAll 을 각각 재정의를 해줘야 한다는 점이다.

 

이 방법을 방지하기 위해 MyRepository를 새로 생성한다.

 

@NoRepositoryBean
public interface MyRepository<T, Id extends Serializable> extends Repository<T, Id>{
	<E extends T> E save(E entity);
	List<T> findAll();
}

 

그리고 위의 CommentRepository가 MyRepository를 상속받게 만들어 준다.

public interface CommentRepository extends MyRepository<Comment, Long>{
}

 

 

이 방법을 사용하면, 내가 정의하고자 하는 공통 메소드를 갖고 있는 MyRepository는

제너럴 타입으로 여러 인터페이스가 상속받게 할 수 있고,

 

CommnetRepository는 Save, FindAll 메소드를 보유하고 있지 않기 때문에

매번 메소드를 재정의 할 필요가 없다는 말씀!!

Comments