쿨타임 구현하기

알파로그·2023년 5월 14일
0

Spring Boot

목록 보기
45/57

✏️ 필요성

  • 클라이언트가 특정 작업을 한 뒤,
    특정 시간동안 같은 작업을 하지 못하게 막기위한 기능이다.
  • 사용자 편의를 위해 다음 작업 가능시간까지 초단위로 보여줄 수 있는 기능도 구현하면 좋다.

✏️ 특정 시간동안 작업 금지 구현

📍 application yml

  • custom 을 사용해 원하는 금지 시간을 입력해준다.
    • 이렇게 구현하면 java 코드로 구현된 모든 금지시간 관련 값들을 한번에 일괄적으로 관리할 수 있다.
custom:
  likeablePerson:
    modifyCoolTime: '#{60 * 60 * 3}'

📍 AppConfig 계층

  • 작업을 얼마나 금지시킬 지를 정의하는 변수를 만든다.
    • applicaion yml 에서 만들어 @Value 로 값을 받아온 뒤 현재시간과 더해 주입시켜준다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

		@Getter
    private static long likeablePersonModifyCoolTime;

		@Value("${custom.likeablePerson.modifyCoolTime}")
    public void setLikeablePersonModifyCoolTime(long likeablePersonModifyCoolTime) {
        AppConfig.likeablePersonModifyCoolTime = likeablePersonModifyCoolTime;
    }
}

📍 Service 계층

  • 클라이언트가 특정 작업을 요청하면 AppConfig 에서 작업 금지시간을 가져와 필드에 저장시켜준다.
  • if 문을 사용해 지금 시간과 비교해 시간이 지나지 않았을 경우 작업을 하지 못하도록 막아두면 완료

✏️ 작업 금지 남은시간 계산기 구현

📍 Ut 계층

  • Ut 계층은 다양한 프로젝트에서 코드의 변경 없이 공통적으로 사용되는 부분에 대한 로직을 저장하는 직접 만든 라이브러리이다.
    • 남은 시간 계산기는 어느 프로젝트에서든 코드 수정없이 붙여넣기로 사용할 수 있어 이 객체에 포함시켰다.
  • time 1 과 2 를 변수로 받는다.
    • 1 은 현재 시간, 2는 작업이 금지된 시간이다.
  • suffix 에 1과 2를 비교해 아직 안 지났으면 “전”, 지났으면 “후”를 저장한다.
  • 1과 2의 시간 차이를 초로 환산해 diff 에 저장
  • 초, 분, 시간, 일 단위로 각각 변수에 저장
  • String Builder 를 생성해 모든 값들을 더해준 뒤 String 으로 변환해 반환시킨다.
public class Ut {

    public static class time {

        public static String diffFormat1Human(LocalDateTime time1, LocalDateTime time2) {

            String suffix = time1.isAfter(time2) ? "전" : "후";

            // 두개의 시간의 차이를 초로 환산
            long diff = ChronoUnit.SECONDS.between(time1, time2);

            long diffSeconds = diff % 60; // 초 부분만
            long diffMinutes = diff / (60) % 60; // 분 부분만
            long diffHours = diff / (60 * 60) % 24; // 시간 부분만
            long diffDays = diff / (60 * 60 * 24); // 나머지는 일 부분으로

            StringBuilder sb = new StringBuilder();

            if (diffDays > 0) sb.append(diffDays).append("일 ");
            if (diffHours > 0) sb.append(diffHours).append("시간 ");
            if (diffMinutes > 0) sb.append(diffMinutes).append("분 ");
            if (diffSeconds > 0) sb.append(diffSeconds).append("초 ");

            return sb.append(suffix).toString();
        }
    }
}

📍 Entity 계층

  • 작업을 금지시킨 필드가 있는 entity 에 method 를 생성한다.
    • html 에서 반환값을 바로 호출해서 사용할 수 있다.
    • modifyUnlockDate 는 작업을 금지시킨 시간을 기록하는 변수이다.
public String getModifyUnlockDateRemainStrHuman() {
    return Ut.time.diffFormat1Human(LocalDateTime.now(), modifyUnlockDate);
}

📍 HTML

  • th:text 를 사용해 method 를 호출하면 완료
<div th:unless="${likeablePerson.modifyUnlocked}"
     class="text-center text-gray-500 text-sm mt-2">

    <span class="text-red-400">변경</span><span class="text-red-400">취소</span><span class="badge badge-primary"
	        th:text="${likeablePerson.modifyUnlockDateRemainStrHuman}">
		</span>에 가능합니다.
</div>
profile
잘못된 내용 PR 환영

0개의 댓글