티스토리 뷰

반응형

 

 

 

 

JavaSpring BootOracle

 

 

보통 날짜값을 사용할 때 db와 뷰와의 관계에서 컨버팅을 자주 하게 된다.

DB에는 예쁘게 들어가있지만 사용자 화면에 그대로 뿌리면

보통 우리가 보던 포맷이 아니기 때문에 매우 별로다.

 

그래서 데이터 조회해올 때 컨버팅한다던가 

애초에 db에 string 형태로 넣는 경우다.

 

 

현재 프로젝트에서 날짜 컬럼타입을 timestamp 형식으로 사용하고 있다.

JPA 에서 조회해서 뷰에 그대로 뿌려보니

2023-07-05T16:05:41

 

날짜와 시간 값을 구분하는 T가 들어간다.

 

 

그래서 엔티티는 LocalDateTime 타입으로,

DTO 는 String 타입으로 mapstruct 에서 자동으로 컨버팅 되도록 해보려고 한다.

 

 

 

엔티티와 DTO의 날짜 필드타입을 다르게 선언하였다.

 

oracle timestamp type

@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 형식으로 보이는 것을 확인할 수 있다.

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday