Query DSL DTO 변환 할 때 tuple 이용시 왜 for문을 사용하는가

박철현·2024년 4월 30일
0

문제해결

목록 보기
12/17

문제

  • DTO를 변환하여 반환해야 할 경우가 생김
  • 뤼튼에게 샘플 코드를 보며 tuple 각 요소의 .get[0] 이런식으로 가져오라해서 가져오려는데 계속 빨간줄..!

val query = from(member)
    .select(
        member.id,
        member.name,
        member.email
    )
    .limit(10)
    
val memberDtos = mutableListOf<MemberDto>()
val result = query.fetch()

for (row in result) {
    val id = row[0] as Long
    val name = row[1] as String
    val email = row[2] as String
    memberDtos.add(MemberDto(id, name, email))
}

해결

  • tuple은 Map과 유사한 interface로 제공됨
  • 따라서 각각을 .get(key명) 으로 접근해야 함
    • select문에 사용한 QClass.속성 이용
for (row in result) {
    val id = row.get(member.id)
    val name = row.get(member.name)
    val email = row.get(member.email)
    memberDtos.add(MemberDto(id, name, email))
}

의문점

  • tuple이 map 형태라 했는데 왜 for문을 통해서 key를 통해 접근하지? 그냥 어차피 map이면 그냥 get하면 가져오는 것 아닌가?
    • Tuple은 타입에 안전한 Map을 제공하고, 이를 통해 Tuple 행 객체로부터 컬럼 데이터에 접근할 수 있다. (QueryDsl 가이드)
    • 사용 예제 : get(컬럼) 으로 접근함을 확인
    • 근데 왜 for문이지? Map이면 그냥 for문 없이도 그냥 get하면 되지않나? 왜지?!?!?!?!?! 계속 고민고민..
    List<Tuple> result = query.from(employee).list(employee.firstName, employee.lastName);
    for (Tuple row : result) {
       System.out.println("firstName " + row.get(employee.firstName));
       System.out.println("lastName " + row.get(employee.lastName)); 
     }}    
  • 결과를 그려보다가 급 떠오르기!

  • fetch()의 결과가 List<Tuple> 의 형태
    • 각각의 결괴는 Tuple
    • Tuple 안에서 각각은 Map과 유사한 형태
    • 따라서 각각의 Map에서 get(key)로 접근!

마치며

  • 혹여나 왜 for문을 쓰는가에 대한 생각이 드는 분께 이 글이 도움이 되길!
  • 출처
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글