반응형
Converter란
DB에서 어떤 값을 저장할 때 전/후 처리가 필요한 경우가 있습니다.
이를 Spring AttributeConverter 인터페이스를 구현하여 처리할 수 있습니다.
사용 예시로, 자바 코드에서는 성과 이름을 따로 관리하고, 데이터베이스에서는 성이름을 그대로 저장하려는 경우 어떻게 처리하는지 보겠습니다.
AttributeConverter
public interface AttributeConverter<X,Y> {
public Y convertToDatabaseColumn (X attribute);
public X convertToEntityAttribute (Y dbData);
}
- convertToDatabaseColumn : 데이터베이스 컬럼으로 변환해주는 메서드이며, 자바 객체를 어떻게 변환하여 저장할지 작성합니다.
- convertToEntityAttribute : DB에 저장된 값을 자바 객체에 어떻게 불러올 것인지 작성합니다.
Java Object
public class PersonName implements Serializable {
private String name;
private String surname;
// getters and setters
}
@Entity(name = "PersonTable")
public class Person {
private PersonName personName;
//...
}
we’ll convert the attribute to a String value that contains both name and surname fields.
PersonTable에 name과 surname을 포함한 문자열로 변환하여 저장할 것입니다.
Converter 구현 코드
@Converter
public class PersonNameConverter implements
AttributeConverter<PersonName, String> {
@Override
public String convertToDatabaseColumn(PersonName personName) {
if (personName == null) {
return null;
}
StringBuilder sb = new StringBuilder();
if (personName.getSurname() != null && !personName.getSurname()
.isEmpty()) {
sb.append(personName.getSurname() + personName.getName());
sb.append(SEPARATOR);
}
return sb.toString();
}
@Override
public PersonName convertToEntityAttribute(String dbPersonName) {
if (dbPersonName == null || dbPersonName.isEmpty()) {
return null;
}
String surName = fullName.substring(0, 1);
String name = fullName.substring(1);
PersonName personName = new PersonName(name, surName);
return personName;
}
}
위와 같이 원하는 형태로 변환시키는 코드를 작성합니다.
@Converter 적용
@Entity(name = "PersonTable")
public class Person {
@Convert(converter = PersonNameConverter.class)
private PersonName personName;
// ...
}
Entity 클래스에서 변환이 일어나는 속성에 위에서 작성했던 Converter를 적용합니다.
참고 자료
https://www.baeldung.com/jpa-attribute-converters
반응형
'Spring Framework > Spring' 카테고리의 다른 글
Spring @PostConstruct, @Value 통한 빈 의존성 설정 - @PreDestroy bean destruction (1) | 2024.11.25 |
---|---|
Spring Annotation과 Meta Annotation 이해하기 - 어노테이션 활용법 (0) | 2024.11.21 |
[Spring] Optional 주요 메서드 활용법 - map, orElse, orElseGet, isPresent, ifPresent (0) | 2024.11.10 |
Java HashMap vs LinkedHashMap 차이점 - 스프링에서 데이터 삽입 순서 유지하기 (1) | 2024.11.09 |
Spring 정렬 Sort, Order 클래스 이해하기 - 정렬 방향, 속성 접근하기 (0) | 2024.11.08 |