[트러블슈팅] 12. Mapping 오류

문정준's avatar
Mar 27, 2025
[트러블슈팅] 12. Mapping 오류
 

1. DTO 매핑 오류

Solution

  • 정의된 클래스가 아닌 새 DTO에 매핑을 시도할 경우, 직접 생성자에 값을 넣어서 매핑해야 함.
 
notion image
 
public AccountResponse.TransferUserDTO detail1(int number) { String sql = """ select at.balance account_balance, at.number account_number, ut.fullname account_owner from account_tb at inner join user_tb ut on at.user_id = ut.id where at.number = ? """; Query query = em.createNativeQuery(sql); query.setParameter(1, number); Object[] result = (Object[]) query.getSingleResult(); AccountResponse.TransferUserDTO dto = new AccountResponse.TransferUserDTO( ((Number) result[1]).intValue(), // account_number ((Number) result[0]).intValue(), // account_balance (String) result[2] // account_owner ); return dto; }
AccountResponse.TransferListDTO detail = new AccountResponse.TransferListDTO( (String) obs[0], ((Number) obs[1]).intValue(), ((Number) obs[2]).intValue(), ((Number) obs[3]).intValue(), ((Number) obs[4]).intValue(), (String) obs[5] );
 
 

2. Builder 매핑 오류

Solution

  • EntityManager에서 제공하는 NativeQuery를 사용하면, DB에서 반환하는 raw 타입을 그대로 받음
  • 해당 DB에서 반환 타입이 어떻게 나오는지 확인해보는 것이 좋음.
System.out.println("createdAt type: " + obs[4].getClass().getName());
 
  • 보통 String일 경우가 높고, Timestamp는 String으로의 명시적 형 변환이 불가함.
    • Timestamp.valueOf()를 사용해야 함.
 
  • User 클래스 자체를 받아온다면, NativeQuery + Entity 매핑을 사용하는 것이 좋음.
Query q = em.createNativeQuery("SELECT * FROM user_tb WHERE username = ?", User.class); q.setParameter(1, user.getUsername()); User foundUser = (User) q.getSingleResult();
 
✏️

Builder를 사용할 때, 속성을 제외하고 매핑을 시도하면 해결되나?

  • 에러를 피할 수는 있지만, 매핑이 되지 않으므로 해당 값은 null로 처리됨.
  • 이후 이를 사용해야 할 때에 값이 매핑되지 않아 다시 값을 받아올 때 문제가 됨.
  • 근본적인 해결법은 valueOf()를 사용한 타입 변환, Entity 매핑
Share article

sxias