🫠만약 db에 값을 저장할 경우 자신이 원하는 값으로 저장하길 원한다면 @Converter
를 사용하면 됩니다.
사용방법은 아래와 같습니다.
@Converter
public class RoleConverter implements AttributeConverter<Set<Role>, String> {
@Override
public String convertToDatabaseColumn(Set<Role> attribute) {
return attribute.stream().map(Enum::name).collect(Collectors.joining(","));
}
@Override
public Set<Role> convertToEntityAttribute(String dbData) {
if (StringUtils.hasText(dbData))
return Arrays.stream(dbData.split(",")).map(Role::valueOf).collect(Collectors.toSet());
return new HashSet<>();
}
}
🥳위 코드는 권한을 매핑하고 있는 Set을 칼러에 저장시 ,으로 묶어서 저장하는 방식입니다. convertToDatabaseColumn
메소드는 Set -> String으로 바꾸는 메소드이며 convertToEntityAttribute
는 그 반대로 작용합니다.
이 후 자신이 적용하고 싶은 곳에 적용하면 됩니다.
@Convert(converter = RoleConverter.class)
private Set<Role> roles = new HashSet<>();
😊 만약 모든 곳에 적용하고 싶다면 @Converter
의 autoApply=true
를 적용해주시면 됩니다.
저의 경우 dbData에서 entity로 바꾸는 경우 split
함수를 통해 가져오고 있었는데 null
값을 처리해 주지 않아 문제가 생겼었습니다. 여러분도 만약 사용하게 된다면 null
값도 주의해주시면 될 것 같습니다.😭