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
Link : https://aljjabaegi.tistory.com/566
반응형