Auth Server 에서 SlackInfo 추가 , MemberInfo 정보 등이 서비스를 확장 시켜나감에 따라 고민이 많았다.
QueryDsl 을 사용 하기 전
@Transactional(readOnly = true)
public Member getUserId(String userId) {
Member member = memberRepository.findByUserId(userId);
SlackMemberInfo slackMemberInfo = slackMemberService.getSlackMemberByUserId(member);
if (slackMemberInfo != null) {
// deep copy
return Member.builder()
.username(member.getUsername())
.memberInfo(member.getMemberInfo())
.userId(member.getUserId())
.password(member.getPassword())
.role(member.getRole())
.memberInfo(member.getMemberInfo())
.email(member.getEmail())
.emailVerifiedYn(member.getEmailVerifiedYn())
.modifiedAt(member.getModifiedAt())
.profileImageUrl(slackMemberInfo.getProfileImage512())
.providerType(member.getProviderType())
.build();
}
return member;
}
이러한 문제를 해결 하기 위해서 간단하게 Query DSL 을 도입 했다.
QueryDsl 을 사용 하기 후
// MemberService
@Transactional(readOnly = true)
public Member getUserId(String userId) {
return memberRepository.findByUserId(userId);
}
@Repository
public class MemberRepositoryImpl implements CustomMemberRepository {
private final EntityManager em;
@Autowired
public MemberRepositoryImpl(EntityManager em) {
this.em = em;
}
// 이 아래 작성
public Member findByUserId(String id) {
// querydsl 사용
JPAQueryFactory query = new JPAQueryFactory(em);
QMember m = new QMember("m");
QSlackMemberInfo s = new QSlackMemberInfo("s");
QMemberInfo i = new QMemberInfo("i");
Tuple t = query.select(m, s, i)
.from(m)
.leftJoin(i)
.on(m.eq(i.member))
.leftJoin(s)
.on(m.eq(s.userId)).where(m.userId.eq(id)).fetchOne();
if (Objects.isNull(t)) {
throw new IllegalArgumentException("해당 유저가 존재하지 않습니다.");
}
Member returnMember =
Member.builder()
.userId(t.get(m).getUserId())
.email(t.get(m).getEmail())
.memberInfo(t.get(i))
.emailVerifiedYn(t.get(m).getEmailVerifiedYn())
.modifiedAt(t.get(m).getModifiedAt())
.profileImageUrl(t.get(m).getProfileImageUrl())
.providerType(t.get(m).getProviderType())
.role(t.get(m).getRole())
.uploadDate(t.get(m).getUploadDate())
.username(t.get(m).getUsername())
.build();
if(t.get(s) != null) {
returnMember.setProfileImageUrl(Objects.requireNonNull(t.get(s)).getProfileImage512());
}
return returnMember;
}
}
// querydsl
implementation 'com.querydsl:querydsl-core'
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor 'com.querydsl:querydsl-apt::jpa'
annotationProcessor 'javax.persistence:javax.persistence-api'
annotationProcessor 'javax.annotation:javax.annotation-api'
gradle 종속성으로 다음을 추가 하면 된다!