728x90
SpringDataJpa는 내가 원하는 구현 코드를 넣기 위해서는 사용자 정의 인터페이스를 만들어야 한다.
- 사용자 정의 리포지토리 사용법
- 사용자 정의 인터페이스 작성
- 사용자 정의 인터페이스 구현
- 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속


public class MemberRepositoryImpl implements MemberRepositoryCustom{
private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
@Override
public List<MemberTeamDto> search(MemberSearchCondition condition){
return queryFactory
//SelectionProjection 이 변경되어도 재사용이 가능하다.
.select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamId"),
team.name.as("teamName")
))
.from(member)
.leftJoin(member.team, team)
.where(
usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
)
.fetch();
}
private BooleanExpression usernameEq(String username) {
return hasText(username) ? member.username.eq(username) : null;
}
private BooleanExpression teamNameEq(String teamName) {
return hasText(teamName) ? team.name.eq(teamName) : null;
}
private BooleanExpression ageBetween(int ageLoe,int ageGoe){
return ageLoe(ageLoe).and(ageGoe(ageGoe));
}
private BooleanExpression ageGoe(Integer ageGoe) {
return ageGoe != null ? member.age.goe(ageGoe) : null;
}
private BooleanExpression ageLoe(Integer ageLoe) {
return ageLoe != null ? member.age.loe(ageLoe) : null;
}
}
- Custom Interface를 구현한 Custom Class를 직접 구현하여준다
- 구현한 CustomClass 같은 경우 MemberRepository + " ~~" + Impl 이러한 형식으로 생성해야 한다.
- 만약 화면이 너무 복잡하여 화면에 종속적인 Repository를 만들어야 된다면 따로 Query라는 Repository를 만들어 해당 Repository에서 따로 구현하여도 된다(아키택처 부분)
Query Repository를 만들어 화면에 종속적인 Repository 작성(CQRS)
커맨드와 쿼리를 분리한다.


728x90