결국 SSE 관련 버그를 처리했습니다.
서치를 하다가 비동기, 동기 개념에 대해 더 깊게 파고들었고 결국 해결했습니다. 허탈하긴하지만 @Async 어노테이션 하나로 해결했습니다. 컨벤션 관련 리팩토링 중이여서 푸시를 못하고 있다가 오후에 시도했는데 @Async 하나 붙였더니 connection leak 이 발생하거나 connection pool이 다 차는 에러가 발생하지 않고 정상적으로 잘 작동이 되었습니다. 알림전송도 잘 됩니다.
@Async
비동기처리를 위해서 @Async 를 사용합니다. 사용하기 위해서는 @Enableasync를 함께 추가해줘야합니다.
@Async // 비동기 처리를 위한 어노테이션
@Transactional
public void send(Member receiver, Member sender, NotificationType notificationType, String content, RedirectionType type, Long typeId, Long postId) {
Notification notification = notificationRepository.save(new Notification(receiver, notificationType, content, type, typeId, postId, sender));
String memberId = String.valueOf(receiver.getId());
Map<String, SseEmitter> sseEmitters = emitterRepository.findAllEmitterStartWithByMemberId(memberId);
sseEmitters.forEach(
(key, emitter) -> {
emitterRepository.saveEventCache(key, notification);
sendToClient(emitter, key, SSE_MAPPER.NotificationtoResponseNotificationDto(notification));
}
);
}
아래와 같이 프로젝트Application에 @EnableAsync를 달아줍니다.
@EnableJpaAuditing
@EnableAsync
@SpringBootApplication
public class HanghaeFinalProjectApplication {
public static void main(String[] args) {
SpringApplication.run(HanghaeFinalProjectApplication.class, args);
}
}
@Async를 사용하기 위해서는 public이어야 하며 self-invocation이면 안됩니다.
우선은 @Async를 사용하면 기본 설정으로 SimpleAsyncTaskExecutor를 사용하게 됩니다. 커스터마이징 하고 싶으면 Async 설정 클래스를 만들어서 설정할 수 있는데 이는 내일 구현할 예정입니다. 일단 급한 불을 끄는데 집중했습니다.
참조 블로그 (https://steady-coding.tistory.com/611)
동기 vs. 비동기
- 동기(synchronous): 요청과 결과가 동시에 일어난다는 약속; 요청한 자리에서 결과가 주어져야 함
- A작업이 모두 진행 될 때까지 B작업은 대기해야함
- 비동기(Asynchronous): 요청과 결과가 동시에 일어나지 않을거라는 약속;
- A작업이 시작하면 동시에 B작업이 실행되며, A작업은 결과값이 나오는 대로 출력된다
SSE 관련 더 공부할 부분
ApplicationEventPublisher를 사용해서 서비스간의 의존성을 낮추는 방법에 대해 알게 되었습니다. EventListner를 사용해서 하는 방법이 있다고 해서 연구해보려고 합니다. 무래도 다른 Service안에 알림 Service를 넣다보니 의존성 문제가 있다고 여겨져서 방법을 찾고 있었기 때문입니다.
추가로 공부한 것
각자 파트를 맡아서 개발을 하다보니 컨벤션 준수가 되지 않거나 일관성이 없는 부분들에 대해서 팀장님이 리팩토링을 진행중입니다. DTO 관련해서 링크를 첨부해주셔서 읽어보려고 합니다. Mapper 사용할때 Dto를 참조하는 안티패턴이 발견되었습니다. 여러사람이 같은 프로젝트를 하니까 좋은점은 check-balance가 된다는 점입니다. 내공있는 조원들의 경험을 레버리지 할 수 있어서 좋습니다.
'TIL' 카테고리의 다른 글
TIL 에러 넘어 에러 (feat. 객체직렬화) 230128 (0) | 2023.01.29 |
---|---|
TIL @EventListener 알림 기능 강한 결합 제거 230127 (0) | 2023.01.28 |
TIL SSE 에러 트러블슈팅 230125 (0) | 2023.01.26 |
TIL SSE 에러 230124 (0) | 2023.01.25 |
TIL 설연휴 월요일 230123 (0) | 2023.01.23 |