TIL 2024-08-12 VO와 JPA를 쓰면서 컨버터에 대한 깨달음

2024. 8. 12. 17:21TIL
목차
  1. AttributeConverter
  2. JPA(feat. Hibernate) 에서 매개변수로 넣은 값들은 AttributeConverter가 작동하지 않는다.
  3. 해결 방법 2가지
  4. 1. VO를 매개변수로 준다.
  5. 2. Value 를 명시적으로 붙여준다

AttributeConverter

DB와 언어 사이에서 컨버터 역할을 해준다.

예를 들어 객체가 있다고 하자


      
public class VO {
String value;
}
public class Entity {
private VO name;
}
// 머 그냥 대충 적었다~~

 

이렇게 있을 때 Entity를 DB에 저장하려고 하면

VO는 원시 타입이거나 지원하지 않는 객체이므로 에러가 뜰것이다.

 

그래서 컨버터를 사용해서 VO를 db와 맞게 바꿀 수 있다.

 


      
@Converter(autoApply = true)
public class VOConverter implements AttributeConverter<VO, String> {
@Override
public String convertToDatabaseColumn(VO vo) {
if (vo == null) {
return null;
}
return vo.value();
}
@Override
public MemberUsername convertToEntityAttribute(String dbData) {
if (daData == null) {
return null;
}
return new VO(dbData);
}
}

 

 

JPA(feat. Hibernate) 에서 매개변수로 넣은 값들은 AttributeConverter가 작동하지 않는다.

 

AttributeConverter 는 다음과 같이 행동한다.

1. DB 데이터를 불러올 때 객체와 매핑

2. 객체를 DB 에 저장할 때 매핑

 

그러니까 매개변수에서 작동하지 않는다.

 


      
Argument [username] of type [java.lang.String] did not match parameter type ~~

 

막 이런 오류가 뜬다.

 

아니 나는


      
boolean existsByUsername(String username);

 

이렇게 쓰고 싶은데


      
boolean existsByUsername(VO username);

 

이렇게 쓰라고 강요한다.

 

당연히 될 줄 알았지.. 컨버터가 있는데..ㅠ

 

해결 방법 2가지

1. VO를 매개변수로 준다.


      
boolean existsByUsername(VO username);

 

난 이 방법이 싫다.

하면

2. Value 를 명시적으로 붙여준다


      
boolean existsByUsernameValue(String username);
// directive "existsBy" field "VO.value"

 

이렇게 명시적으로 필드값을 넣어주면 JPA 에서 SpringData SQL 을 만들 때 자동으로 Value 값을 찾아서 해당 타입에 맞게끔 매개변수를 넣을 수 있게 해준다.



References

 

https://www.baeldung.com/jpa-attribute-converters

 

 

Hibernate ORM 5.4.33.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

 

 

스프링 JPA @Embedded 및 @EmbeddedId

1. 개요 이 예제에서는 복합 키 기반 JPA 엔터티를 쿼리하기 위한 @EmbeddedId 어노테이션 및 " findBy " 메서드의 사용을 다룰 것입니다. 따라서 @EmbeddeId 및 @Embeddable 어노테이션을 사용 하여 JPA 엔터티

recordsoflife.tistory.com

 

저작자표시 (새창열림)

'TIL' 카테고리의 다른 글

TIL 2024-08-14 대규모 시스템  (0) 2024.08.14
TIL 2024-08-13 sqld 공부 제약조건 및 참조 무결성 규정 관련 옵션  (2) 2024.08.13
TIL 2024-08-08 Feign Client 더 잘 써보기  (0) 2024.08.08
TIL 2024-08-06 Spring MSA 라이브러리  (0) 2024.08.06
TIL 2024-08-05 다익스트라 알고리즘  (0) 2024.08.06
  1. AttributeConverter
  2. JPA(feat. Hibernate) 에서 매개변수로 넣은 값들은 AttributeConverter가 작동하지 않는다.
  3. 해결 방법 2가지
  4. 1. VO를 매개변수로 준다.
  5. 2. Value 를 명시적으로 붙여준다
'TIL' 카테고리의 다른 글
  • TIL 2024-08-14 대규모 시스템
  • TIL 2024-08-13 sqld 공부 제약조건 및 참조 무결성 규정 관련 옵션
  • TIL 2024-08-08 Feign Client 더 잘 써보기
  • TIL 2024-08-06 Spring MSA 라이브러리
wonow_
wonow_
꾸준히 성장하는 개발자 WONOW 입니다. 🤗
wonow_
wonow_
wonow_
전체
오늘
어제
  • 분류 전체보기
    • Language
      • JAVA
    • TIL
    • 코딩테스트
      • 프로그래머스
      • 백준
    • 프로젝트
      • JAVA
      • Spring
    • 기타
    • ERROR
      • Spring
    • CS
      • 알고리즘
      • DB
      • Kafka
    • 잡담
    • 활동
      • 척척박사

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리챌린지
  • 문자열 붙여서 출력하기
  • 홀짝 구분하기
  • 나는바봉가봉가
  • 프로그래머스
  • 오블완
  • 공부열심히하자
  • 문자열 돌리기
  • 티스토리 꾸미기

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
wonow_
TIL 2024-08-12 VO와 JPA를 쓰면서 컨버터에 대한 깨달음
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.