diff --git a/src/main/java/cokr/xit/foundation/component/ScheduledBean.java b/src/main/java/cokr/xit/foundation/component/ScheduledBean.java
new file mode 100644
index 0000000..3341b67
--- /dev/null
+++ b/src/main/java/cokr/xit/foundation/component/ScheduledBean.java
@@ -0,0 +1,31 @@
+package cokr.xit.foundation.component;
+
+/**지정한 일정에 따라 작업을 수행하는 Bean.
+ * {@link ScheduledServiceBean}이 작업을 시작한다.
+ * @author mjkhan
+ */
+public abstract class ScheduledBean extends ManagedComponent {
+ private boolean busy;
+
+ /**현재 Bean이 작업 중인지 반환한다.
+ * {@link ScheduledServiceBean}이 사용한다.
+ * @return 작업 여부
+ *
- 작업 중이면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ public boolean isBusy() {
+ return busy;
+ }
+
+ /**현재 Bean의 작업 여부를 설정한다.
+ * {@link ScheduledServiceBean}이 사용한다.
+ * @param busy 작업 여부
+ * - 작업 중이면 true
+ * - 그렇지 않으면 false
+ *
+ */
+ public void setBusy(boolean busy) {
+ this.busy = busy;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/cokr/xit/foundation/component/ScheduledServiceBean.java b/src/main/java/cokr/xit/foundation/component/ScheduledServiceBean.java
new file mode 100644
index 0000000..c374df9
--- /dev/null
+++ b/src/main/java/cokr/xit/foundation/component/ScheduledServiceBean.java
@@ -0,0 +1,40 @@
+package cokr.xit.foundation.component;
+
+import java.util.function.Supplier;
+
+/**지정한 일정에 따라 작업을 수행하는 서비스 구현체가 상속받는 베이스 클래스.
+ * 일정은 quartz 라이브러리를 사용해 지정한다.
+ * @author mjkhan
+ */
+public class ScheduledServiceBean extends AbstractServiceBean {
+ /**주어진 작업을 수행한다. scheduled이 작업 중이면 무시한다.
+ * @param scheduled 작업 Bean
+ * @param task 작업 Bean의 메소드
+ */
+ protected void execute(ScheduledBean scheduled, Runnable task) {
+ if (scheduled.isBusy()) return;
+
+ scheduled.setBusy(true);
+ try {
+ task.run();
+ } finally {
+ scheduled.setBusy(false);
+ }
+ }
+
+ /**주어진 작업을 수행하고 결과를 반환한다. scheduled이 작업 중이면 무시하고 null을 반환한다.
+ * @param scheduled 작업 Bean
+ * @param task 작업 Bean의 메소드
+ * @return 작업 결과
+ */
+ protected T execute(ScheduledBean scheduled, Supplier task) {
+ if (scheduled.isBusy()) return null;
+
+ scheduled.setBusy(true);
+ try {
+ return task.get();
+ } finally {
+ scheduled.setBusy(false);
+ }
+ }
+}
\ No newline at end of file