diff --git a/src/main/java/com/gaebaljip/exceed/adapter/in/notify/EmitterController.java b/src/main/java/com/gaebaljip/exceed/adapter/in/notify/EmitterController.java deleted file mode 100644 index c542a34eb..000000000 --- a/src/main/java/com/gaebaljip/exceed/adapter/in/notify/EmitterController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gaebaljip.exceed.adapter.in.notify; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import com.gaebaljip.exceed.application.port.in.notify.ConnectEmitterUseCase; -import com.gaebaljip.exceed.common.annotation.AuthenticationMemberId; - -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api") -@RequiredArgsConstructor -@SecurityRequirement(name = "access-token") -@Tag(name = "[SSE connection]") -public class EmitterController { - private final ConnectEmitterUseCase connectEmitterUseCase; - - @GetMapping(value = "/emitter/connect", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public SseEmitter connect( - @RequestHeader(value = "Last-Event-ID", required = false, defaultValue = "") - String lastEventId, - @Parameter(hidden = true) @AuthenticationMemberId Long memberId) { - return connectEmitterUseCase.execute(memberId.toString(), lastEventId); - } -} diff --git a/src/main/java/com/gaebaljip/exceed/adapter/out/scheduler/quartz/UpdateWeightEventListener.java b/src/main/java/com/gaebaljip/exceed/adapter/out/scheduler/quartz/UpdateWeightEventListener.java deleted file mode 100644 index 632d4c580..000000000 --- a/src/main/java/com/gaebaljip/exceed/adapter/out/scheduler/quartz/UpdateWeightEventListener.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.gaebaljip.exceed.adapter.out.scheduler.quartz; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; - -import org.quartz.*; -import org.quartz.impl.StdSchedulerFactory; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.event.TransactionPhase; -import org.springframework.transaction.event.TransactionalEventListener; - -import com.gaebaljip.exceed.adapter.out.scheduler.quartz.job.UpdateWeightEmitterJob; -import com.gaebaljip.exceed.application.domain.notify.NotificationType; -import com.gaebaljip.exceed.common.event.UpdateWeightEvent; - -import lombok.extern.log4j.Log4j2; - -@Component -@Log4j2 -public class UpdateWeightEventListener { - @TransactionalEventListener( - classes = UpdateWeightEvent.class, - phase = TransactionPhase.AFTER_COMMIT) - @Transactional(propagation = Propagation.REQUIRES_NEW) - @Async - public void handle(UpdateWeightEvent event) { - Long memberId = event.getMemberId(); - String url = event.getUrl(); - JobDetail jobDetail = createJobDetail(memberId, url); - Trigger trigger = createTrigger(event, jobDetail); - createSchedule(jobDetail, trigger); - } - - private void createSchedule(JobDetail jobDetail, Trigger trigger) { - try { - SchedulerFactory schedulerFactory = new StdSchedulerFactory(); - Scheduler scheduler = schedulerFactory.getScheduler(); - scheduler.start(); - log.info(">>>>>>>>>>>>>>>>> SSE 전송 스케줄링 시작"); - scheduler.scheduleJob(jobDetail, trigger); - log.info(">>>>>>>>>>>>>>>>> SSE 전송 스케줄링 등록"); - } catch (SchedulerException e) { - log.error(">>>>>>>>>>>>>>>>> SSE 전송 스케줄링 실패"); - } - } - - private JobDetail createJobDetail(Long memberId, String url) { - String content = "몸무게 수정하신지 7일이 지났습니다. 몸무게를 수정해주세요"; - NotificationType type = NotificationType.NOTICE; - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("memberId", memberId); - jobDataMap.put("url", url); - jobDataMap.put("content", content); - jobDataMap.put("type", type); - return JobBuilder.newJob(UpdateWeightEmitterJob.class) - .withIdentity("UPDATE_WEIGHT_JOB", "group1") - .setJobData(jobDataMap) - .build(); - } - - private Trigger createTrigger(UpdateWeightEvent event, JobDetail jobDetail) { - LocalDateTime triggerDateTime = event.getLocalDateTime().plusMinutes(1); - Date triggerDate = Date.from(triggerDateTime.atZone(ZoneId.of("Asia/Seoul")).toInstant()); - TriggerBuilder triggerTriggerBuilder = TriggerBuilder.newTrigger(); - triggerTriggerBuilder.withIdentity("UPDATE_WEIGHT_TRIGGER", "group1"); - triggerTriggerBuilder.startAt(triggerDate); - triggerTriggerBuilder.forJob(jobDetail); - return triggerTriggerBuilder.build(); - } -} diff --git a/src/main/java/com/gaebaljip/exceed/adapter/out/scheduler/quartz/job/UpdateWeightEmitterJob.java b/src/main/java/com/gaebaljip/exceed/adapter/out/scheduler/quartz/job/UpdateWeightEmitterJob.java deleted file mode 100644 index c1186498d..000000000 --- a/src/main/java/com/gaebaljip/exceed/adapter/out/scheduler/quartz/job/UpdateWeightEmitterJob.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gaebaljip.exceed.adapter.out.scheduler.quartz.job; - -import org.quartz.JobDataMap; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.springframework.scheduling.quartz.QuartzJobBean; - -import com.gaebaljip.exceed.application.domain.member.MemberEntity; -import com.gaebaljip.exceed.application.domain.notify.NotificationType; -import com.gaebaljip.exceed.application.port.in.notify.SendEmitterUseCase; -import com.gaebaljip.exceed.application.port.out.member.MemberPort; - -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@RequiredArgsConstructor -// Application Context에 Bean 등록되있는 것을 DI 하기 위해 QuartzJobBean을 상속함 -public class UpdateWeightEmitterJob extends QuartzJobBean { - private final SendEmitterUseCase sendEmitterUseCase; - private final MemberPort memberPort; - - @Override - protected void executeInternal(JobExecutionContext context) throws JobExecutionException { - JobDataMap jobDataMap = context.getMergedJobDataMap(); - Long memberId = jobDataMap.getLong("memberId"); - MemberEntity receiver = memberPort.query(memberId); - String url = jobDataMap.getString("url"); - String content = jobDataMap.getString("content"); - NotificationType notificationType = (NotificationType) jobDataMap.get("type"); - sendEmitterUseCase.send(receiver, content, url, notificationType); - } -} diff --git a/src/main/java/com/gaebaljip/exceed/application/service/member/UpdateWeightService.java b/src/main/java/com/gaebaljip/exceed/application/service/member/UpdateWeightService.java index 53ad92c28..c3b92484d 100644 --- a/src/main/java/com/gaebaljip/exceed/application/service/member/UpdateWeightService.java +++ b/src/main/java/com/gaebaljip/exceed/application/service/member/UpdateWeightService.java @@ -1,7 +1,5 @@ package com.gaebaljip.exceed.application.service.member; -import java.time.LocalDateTime; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,9 +10,6 @@ import com.gaebaljip.exceed.application.port.in.member.UpdateWeightUsecase; import com.gaebaljip.exceed.application.port.out.member.HistoryPort; import com.gaebaljip.exceed.application.port.out.member.MemberPort; -import com.gaebaljip.exceed.common.annotation.EventPublisherStatus; -import com.gaebaljip.exceed.common.event.Events; -import com.gaebaljip.exceed.common.event.UpdateWeightEvent; import lombok.RequiredArgsConstructor; @@ -26,7 +21,6 @@ public class UpdateWeightService implements UpdateWeightUsecase { @Override @Transactional - @EventPublisherStatus public UpdateWeightResponse execute(UpdateWeightCommand command) { MemberEntity memberEntity = memberPort.query(command.memberId()); HistoryEntity history = @@ -41,8 +35,6 @@ public UpdateWeightResponse execute(UpdateWeightCommand command) { .build(); historyPort.command(history); memberEntity.updateWeight(command.weight(), command.targetWeight()); - Events.raise( - UpdateWeightEvent.from(command.memberId(), command.uri(), LocalDateTime.now())); return UpdateWeightResponse.of(memberEntity.getWeight(), memberEntity.getTargetWeight()); } } diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 6cd2168f0..593dd6de2 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -8,42 +8,26 @@ - \"(?i).*email.*"\s*:\s*\"(.*?)\" \"(?i).*password.*"\s*:\s*\"(.*?)\" - \"(?i).*height.*"\s*:\s*(\d+) - \"(?i).*weight.*"\s*:\s*(\d+) - \"(?i).*targetWeight.*"\s*:\s*(\d+) - \"(?i).*age.*"\s*:\s*(\d+) - \"(?i).*etc.*"\s*:\s*\"(.*?)\" - \"(?i).*activity.*"\s*:\s*\"(.*?)\" ${CONSOLE_LOG_PATTERN} - - \"(?i).*email.*"\s*:\s*\"(.*?)\" \"(?i).*password.*"\s*:\s*\"(.*?)\" - \"(?i).*height.*"\s*:\s*(\d+) - \"(?i).*weight.*"\s*:\s*(\d+) - \"(?i).*targetWeight.*"\s*:\s*(\d+) - \"(?i).*age.*"\s*:\s*(\d+) - \"(?i).*etc.*"\s*:\s*\"(.*?)\" - \"(?i).*activity.*"\s*:\s*\"(.*?)\" ${FILE_LOG_PATTERN} ./log/%d{yyyy-MM-dd}.%i.log 10MB - 30 + 90 100MB - @@ -62,4 +46,4 @@ - + \ No newline at end of file diff --git a/src/test/java/com/gaebaljip/exceed/adapter/in/notify/EmitterControllerTest.java b/src/test/java/com/gaebaljip/exceed/adapter/in/notify/EmitterControllerTest.java deleted file mode 100644 index a9535450f..000000000 --- a/src/test/java/com/gaebaljip/exceed/adapter/in/notify/EmitterControllerTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gaebaljip.exceed.adapter.in.notify; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.jupiter.api.Test; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import com.gaebaljip.exceed.common.ControllerTest; -import com.gaebaljip.exceed.common.WithMockUser; - -public class EmitterControllerTest extends ControllerTest { - - @Test - @WithMockUser(memberId = 1L) - void when_connect_expected_success() throws Exception { - - // given - given(connectEmitterUseCase.execute(any(), any())).willReturn(new SseEmitter()); - - // when - ResultActions resultActions = - mockMvc.perform(get("/api/emitter/connect").contentType("text/event-stream")); - - // then - resultActions.andExpect(status().isOk()); - } -} diff --git a/src/test/java/com/gaebaljip/exceed/common/ControllerTest.java b/src/test/java/com/gaebaljip/exceed/common/ControllerTest.java index e0a1bc81c..648428460 100644 --- a/src/test/java/com/gaebaljip/exceed/common/ControllerTest.java +++ b/src/test/java/com/gaebaljip/exceed/common/ControllerTest.java @@ -25,7 +25,6 @@ import com.gaebaljip.exceed.adapter.in.member.OnBoardingController; import com.gaebaljip.exceed.adapter.in.member.UpdateMemberController; import com.gaebaljip.exceed.adapter.in.member.UpdateWeightController; -import com.gaebaljip.exceed.adapter.in.notify.EmitterController; import com.gaebaljip.exceed.adapter.in.nutritionist.GetAnalysisController; import com.gaebaljip.exceed.application.port.in.meal.*; import com.gaebaljip.exceed.application.port.in.member.*; @@ -49,7 +48,6 @@ UpdateMemberController.class, UpdateWeightController.class, GetAnalysisController.class, - EmitterController.class }) @MockBeans({ @MockBean(AuthService.class),