리뷰에 ?? 전 이라고 작성일을 띄우기 위해 현재 시간과 리뷰의 작성일의 차이를 계산하는 것이 필요했다.
/*
생성 시간, 수정 시간은 대부분 필요하므로 사용
BaseTimeEntity에는 시간 관련 Auditing 기능만 작성
BaseEntity에서 이 클래스를 상속받아 시간 + 작성자, 수정자까지 담당
필요한 엔티티에 알맞게 상속받아서 사용하면 됨
*/
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass // 속성만 단순 상속시켜주는 애노테이션
public class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
/*
Auditing을 위한 등록, 수정 관련 엔티티
*/
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass // 속성만 단순 상속시켜주는 애노테이션
public class BaseEntity extends BaseTimeEntity{
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Review extends BaseEntity {
리뷰 Entity에서 BaseEntity만 상속받으면 DB에 값이 저장 될때마다 자동으로 생성일, 수정일, 생성자, 수정자 값이 같이 들어간다.
날짜는 현재 시간으로 들어가지만 생성자 수정자는 값을 지정해줘야 한다.
@EnableJpaAuditing
@Configuration
public class AuditingConfig {
/*
생성자, 수정자 Email로 받아옴
*/
@Bean
public AuditorAware<String> auditorProvider(HttpServletRequest request) {
return () -> {
HttpSession session = request.getSession();
Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
if (member == null) {
return Optional.empty();
}
return Optional.of(member.getEmail());
};
}
}
나는 로그인된 회원의 값을 session에서 가져와서 회원의 email값을 넣어주었다.
public class DateUtils {
//년 월 일 차이 가져오기
public static String periodDate(LocalDateTime createDate) {
LocalDateTime now = LocalDateTime.now();
Period diff = Period.between(createDate.toLocalDate(), now.toLocalDate());
if (diff.getYears() > 0) {
return diff.getYears() + "년 전";
} else if (diff.getMonths() > 0) {
return diff.getMonths() + "달 전";
} else if (diff.getDays() == 0) {
return durationDate(createDate);
} else {
return diff.getDays() + "일 전";
}
}
//시 분 초 차이 가져오기
public static String durationDate(LocalDateTime createDate) {
LocalDateTime now = LocalDateTime.now();
Duration diff = Duration.between(createDate.toLocalTime(), now.toLocalTime());
long hours = Math.abs(diff.toHours());
long minutes = Math.abs(diff.toMinutes());
long seconds = Math.abs(diff.toSeconds());
if (hours > 0) {
return hours + "시간 전";
} else if (minutes > 0) {
return minutes + "분 전";
} else {
return seconds + "초 전";
}
}
}
Period.between() 특징
시작 날짜는 포함되지만 종료 날짜는 제외됩니다.
"x년 y개월 z일" 형식의 데이터가 반환됩니다. 따라서, getDays() 메서드를 호출하면 두 날짜 사이의 일수가 아닌 "z일" 부분만 반환됩니다.
Duration.between() 특징
두 시간 사이를 초(second)로 계산합니다.
toHours(), toMinutes(), toMillis() 메서드는 두 시간 사이의 초(second)가 시간, 분, 밀리초로 계산된 값입니다.
시작 시간이 종료 일자보다 이후인 경우 음수가 반환됩니다.