티스토리 뷰
[Mapstruct] LocalDateTime To String Converter, 엔티티와 DTO간 타입이 다를때 맵핑하기 (feat.AttributeConverter)
종벌🍀 2023. 7. 5. 17:34
보통 날짜값을 사용할 때 db와 뷰와의 관계에서 컨버팅을 자주 하게 된다.
DB에는 예쁘게 들어가있지만 사용자 화면에 그대로 뿌리면
보통 우리가 보던 포맷이 아니기 때문에 매우 별로다.
그래서 데이터 조회해올 때 컨버팅한다던가
애초에 db에 string 형태로 넣는 경우다.
현재 프로젝트에서 날짜 컬럼타입을 timestamp 형식으로 사용하고 있다.
JPA 에서 조회해서 뷰에 그대로 뿌려보니
2023-07-05T16:05:41
날짜와 시간 값을 구분하는 T가 들어간다.
그래서 엔티티는 LocalDateTime 타입으로,
DTO 는 String 타입으로 mapstruct 에서 자동으로 컨버팅 되도록 해보려고 한다.
엔티티와 DTO의 날짜 필드타입을 다르게 선언하였다.
@Entity
public class SampleEntity {
@Column(name="REG_DATE")
private LocalDateTime regDate;
}
@Data
public class SampleDTO {
private String regDate;
}
여기 까지만 하면 뷰단 날짜가 timestamp 형식으로 나온다.
여기서 컨버팅 클래스를 하나 작성해줍시다.
@Component
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, String> {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public String convertToDatabaseColumn(LocalDateTime attribute) {
return attribute != null ? attribute.format(FORMATTER) : null;
}
@Override
public LocalDateTime convertToEntityAttribute(String dbData) {
return dbData != null ? LocalDateTime.parse(dbData, FORMATTER) : null;
}
}
AttributeConverter 인터페이스를 구현하였고
원래는 database column type ↔ entity type 간 타입을 변환하는 용도로 쓰는데
이것을 mapstruct 에서 DTO 변환에 쓰려고 한다.
원래의 AttributeConverter 인터페이스 설명.
/**
* A class that implements this interface can be used to convert
* entity attribute state into database column representation
* and back again.
* Note that the X and Y types may be the same Java type.
*
* @param <X> the type of the entity attribute
* @param <Y> the type of the database column
*/
public interface AttributeConverter<X,Y> {...}
잠깐 삼천포로 빠져서 말하자면 DB(varchar) ↔ Entity(localdatetime) 사이에서
컨버팅을 발생시킬 땐 아래와 같이 사용하면 된다.
@Convert(converter = LocalDateTimeConverter.class)
@Column(name="REG_DATE")
private LocalDateTime regDate;
그럼 이제 LocalDateTimeConverter 클래스를 mapstruct 에서 사용하게 지정해준다.
@Mapper(componentModel = "spring", uses = LocalDateTimeConverter.class)
public interface SampleToMapper extends GenericToMapper<SampleDTO, SampleEntity> {
}
( * GenericToMapper<> 는 제가 만든 공통 제네릭 인터페이스입니다. )
빌드하여 구현된 클래스를 확인해 보면
@Component
public class SampleToMapperImpl implements SampleToMapper {
@Autowired
private LocalDateTimeConverter localDateTimeConverter;
@Override
public SampleDTO toDTO(SampleEntity e) {
if ( e == null ) {
return null;
}
SampleDTO sampleDTO = new SampleDTO();
sampleDTO.setRegDate( localDateTimeConverter.convertToDatabaseColumn( e.getRegDate() ) );
return sampleDTO;
}
}
mapstruct 에서 string 타입인 regDate 에 localDateTimeConverter 를 사용해서
지정한 포맷대로 set 해주는 것을 확인했다.
이제 DTO 담긴 regDate 를 뷰단에서 확인해보면
2023-07-05 16:05:41
yyyy-MM-dd HH:mm:ss 형식으로 보이는 것을 확인할 수 있다.
'Java > Mapstruct' 카테고리의 다른 글
[Mapstruct] @Mapping 활용하기 (0) | 2024.02.27 |
---|---|
[Mapstruct] 이클립스(eclipse) 로컬환경에서 구현체 적용/구동하는 설정법. (feat.STS) (4) | 2022.12.30 |