날짜 차이 계산하기(Auditing)

문한성·2022년 12월 18일
1

공부

목록 보기
2/28
post-thumbnail

리뷰에 ?? 전 이라고 작성일을 띄우기 위해 현재 시간과 리뷰의 작성일의 차이를 계산하는 것이 필요했다.

리뷰의 작성일자 받는법(Auditing)

BaseTimeEntity

/*
    생성 시간, 수정 시간은 대부분 필요하므로 사용
    BaseTimeEntity에는 시간 관련 Auditing 기능만 작성
    BaseEntity에서 이 클래스를 상속받아 시간 + 작성자, 수정자까지 담당
    필요한 엔티티에 알맞게 상속받아서 사용하면 됨
 */
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass // 속성만 단순 상속시켜주는 애노테이션
public class BaseTimeEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}

BaseEntity

/*
    Auditing을 위한 등록, 수정 관련 엔티티
 */

@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass // 속성만 단순 상속시켜주는 애노테이션
public class BaseEntity extends BaseTimeEntity{

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;
}

Review

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Review extends BaseEntity {

리뷰 Entity에서 BaseEntity만 상속받으면 DB에 값이 저장 될때마다 자동으로 생성일, 수정일, 생성자, 수정자 값이 같이 들어간다.
날짜는 현재 시간으로 들어가지만 생성자 수정자는 값을 지정해줘야 한다.

AuditingConfig

@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값을 넣어주었다.

날짜간의 차이 계산

DateUtils

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)가 시간, 분, 밀리초로 계산된 값입니다.
시작 시간이 종료 일자보다 이후인 경우 음수가 반환됩니다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글