Programing/JPA

JPA MapStruct Date format 설정 timestamp, date, string

리커니 2023. 2. 7. 11:15
반응형

MapStruct 를 활용하는 경우 Date type의 format을 설정하는 방법을 알아보겠습니다.

 

DB는 PostgreSQL 입니다.

 

1. User Table

위와 같은 테이블이 있고 Entity 설정은 아래와 같습니다.

 

2.User Entity

@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name = "m_op_user", schema = "carbon")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name = "user_id")
    @Id
    private String userId;

    @Column(name = "user_nm")
    private String userNm;

    @Column(name = "user_pswd")
    private String userPswd;

    @Column(name = "is_use")
    private Boolean isUse;

    @Column(name = "email")
    private String email;

    @Column(name = "mobile")
    private String mobile;

    @Column(name = "birthDt")
    private Date birthDt;

    @Column(name = "regDtm")
    @Temporal(TemporalType.TIMESTAMP)
    private Date regDtm;

    @Column(name = "udtDtm")
    @Temporal(TemporalType.TIMESTAMP)
    private Date udtDtm;
}

 

3. UserDTO

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
    @NotNull
    private String userId;
    @NotNull
    private String userPswd;
    @NotNull
    private String userNm;
    @Email
    @NotNull
    private String email;
    @NotNull
    private String mobile;
    private String birthDt;

    private String regDtm;
    private String udtDtm;
    
    private boolean isUse = true;
}

 

Timestamp type의 컬럼을 Entity에 Date type으로 설정할 경우

MapStuct에서 자동으로 기본 포멧을 설정하여 변환해줍니다.

 

4. UserMapperImpl

@Override
public UserDTO toDTO(M_OP_USER arg0) {
    if ( arg0 == null ) {
        return null;
    }

    UserDTO userDTO = new UserSearchDTO();

    if ( arg0.getBirthDt() != null ) {
        userDTO.setBirthDt( new SimpleDateFormat().format( arg0.getBirthDt() ) );
    }
    userDTO.setEmail( arg0.getEmail() );
    userDTO.setIsUse( arg0.getIsUse() );
    userDTO.setMobile( arg0.getMobile() );
    if ( arg0.getRegDtm() != null ) {
        userDTO.setRegDtm( new SimpleDateFormat().format( arg0.getRegDtm() ) );
    }
    if ( arg0.getUdtDtm() != null ) {
        userDTO.setUdtDtm( new SimpleDateFormat().format( arg0.getUdtDtm() ) );
    }
    userDTO.setUserId( arg0.getUserId() );
    userDTO.setUserNm( arg0.getUserNm() );

    return userDTO;
}

 

4.1 MapStruct 자동 변환 코드

Date type setting 부분. SimpleDateFormat()을 활용한 변환.

userDTO.setRegDtm( new SimpleDateFormat().format( arg0.getRegDtm() ) );

4.2 요청 결과

{
    "userId": "geonlee",
    "userNm": "이건",
    "email": "geonlee@email.com",
    "mobile": "01012345678",
    "regDtm": "23. 2. 6. 오후 4:07",
    "isUse": true,
}

 

5. Mapper expression

해당 데이터의 날짜 포멧을 변경하기 위해서는 @Mapping annotion에 expression를 활용합니다.

위의 UserMapperImpl 에서 toDTO 메소드 선언부분을 복사하여 활용합니다.

@Mapper(componentModel="spring")
public interface UserMapper extends GenericMapper<UserSearchDTO, M_OP_USER>{
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    
    @Mapping(target = "regDtm", expression = "java(new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(entity.getRegDtm()))")
    @Mapping(target = "udtDtm", expression = "java(new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(entity.getUdtDtm()))")
    UserDTO toDTO(User entity);
}

expression에 java() 괄호 사이에 원하는 포멧의 코드를 입력해 주시면 됩니다.

이렇게 작성을 할 경우 UserMapperImpl.class 코드가 아래와 같이 변경되게 됩니다.

 

5.1 MapStruct 자동 변환 코드

userDTO.setRegDtm( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(entity.getRegDtm()) );

 

5.2호출 결과

{
    "userId": "geonlee",
    "userNm": "이건",
    "email": "geonlee@email.com",
    "mobile": "01012345678",
    "regDtm": "2023-02-06 16:07:34",
    "isUse": true,
}

 

6. Mapper에 클래스 Import 활용

별도의 클래스를 구현하여 활용한다면 @Mapper에 import 하고 해당 class의 메소드를 호출할 수 있습니다.

 

@Mapper(componentModel="spring", imports={CmmnDateFormat.class})
public interface UserMapper extends GenericMapper<UserSearchDTO, M_OP_USER>{
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    
    @Mapping(target = "regDtm", expression = "java(CmmnDateFormat.dateToStr(entity.getRegDtm()))")
    @Mapping(target = "udtDtm", expression = "java(CmmnDateFormat.dateToStr(entity.getUdtDtm()))")
    UserDTO toDTO(User entity);
}

 

7.참고

Link : https://aljjabaegi.tistory.com/669

 

JPA MapStruct, ModelMapper 설정 방법, 차이 Entity to DTO, DTO to Entity

JPA 에서 Entity를 DTO로 DTO를 Entity 로 변환 해주는 2가지 라이브러리가 있습니다. MapStruct와 ModelMapper 인데요. 이번 포스팅에서는 둘의 설정방법과 차이에 대해서 알아보도록 하겠습니다. 1. 간단한

aljjabaegi.tistory.com

Link : https://aljjabaegi.tistory.com/566

 

반응형