✏️ 필요성
- 클라이언트가 특정 작업을 한 뒤,
특정 시간동안 같은 작업을 하지 못하게 막기위한 기능이다.
- 사용자 편의를 위해 다음 작업 가능시간까지 초단위로 보여줄 수 있는 기능도 구현하면 좋다.
✏️ 특정 시간동안 작업 금지 구현
📍 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>