Skip to content

Commit 1b3a105

Browse files
committed
feat : 알림 웹소켓 연결 및 프론트 연동 완료 (#81)
1 parent 40f3d13 commit 1b3a105

File tree

6 files changed

+32
-22
lines changed

6 files changed

+32
-22
lines changed

src/main/java/cmf/commitField/domain/noti/noti/controller/ApiV1NotiController.java

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmf.commitField.domain.noti.noti.controller;
22

33
import cmf.commitField.domain.noti.noti.dto.NotiDto;
4+
import cmf.commitField.domain.noti.noti.event.NotiEvent;
45
import cmf.commitField.domain.noti.noti.service.NotiService;
56
import cmf.commitField.domain.user.entity.User;
67
import cmf.commitField.domain.user.repository.UserRepository;
@@ -10,7 +11,9 @@
1011
import cmf.commitField.global.websocket.NotiWebSocketHandler;
1112
import lombok.RequiredArgsConstructor;
1213
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.context.ApplicationEventPublisher;
1315
import org.springframework.security.core.Authentication;
16+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1417
import org.springframework.security.core.context.SecurityContextHolder;
1518
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
1619
import org.springframework.security.oauth2.core.user.OAuth2User;
@@ -30,24 +33,14 @@ public class ApiV1NotiController {
3033
private final NotiService notiService;
3134
private final UserRepository userRepository;
3235
private final NotiWebSocketHandler notiWebSocketHandler;
36+
private final ApplicationEventPublisher eventPublisher;
3337

3438
@GetMapping("")
35-
public GlobalResponse<List<NotiDto>> getNoti() {
36-
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
37-
38-
if (authentication instanceof OAuth2AuthenticationToken) {
39-
OAuth2User principal = (OAuth2User) authentication.getPrincipal();
40-
Map<String, Object> attributes = principal.getAttributes();
41-
String username = (String) attributes.get("login"); // GitHub ID
42-
User user = userRepository.findByUsername(username).orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
43-
List<NotiDto> notis = notiService.getNotReadNoti(user);
44-
// 웹소켓으로 알림 전송
45-
notiWebSocketHandler.sendNotification(user, notis);
46-
47-
return GlobalResponse.success(notis);
48-
}
49-
50-
return GlobalResponse.error(ErrorCode.LOGIN_REQUIRED);
39+
public GlobalResponse<List<NotiDto>> getNoti(@AuthenticationPrincipal OAuth2User oAuth2User) {
40+
String username = oAuth2User.getName();
41+
User user = userRepository.findByUsername(username).orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
42+
List<NotiDto> notis = notiService.getNotReadNoti(user);
43+
return GlobalResponse.success(notis);
5144
}
5245

5346
@PostMapping("")
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package cmf.commitField.domain.noti.noti.event;
22

3+
import cmf.commitField.domain.noti.noti.dto.NotiDto;
34
import lombok.Getter;
45
import org.springframework.context.ApplicationEvent;
56

7+
import java.util.List;
8+
69
@Getter
710
public class NotiEvent extends ApplicationEvent {
811
private final String username;
12+
private final List<NotiDto> notis;
913
private final String message;
1014

11-
public NotiEvent(Object source, String username, String message) {
15+
public NotiEvent(Object source, String username, List<NotiDto> notis, String message) {
1216
super(source);
1317
this.username = username;
18+
this.notis = notis;
1419
this.message = message;
1520
}
1621
}

src/main/java/cmf/commitField/domain/noti/noti/event/NotiListener.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import lombok.RequiredArgsConstructor;
44
import org.springframework.context.event.EventListener;
5+
import org.springframework.messaging.simp.SimpMessagingTemplate;
56
import org.springframework.stereotype.Component;
67

78
@Component
89
@RequiredArgsConstructor
910
public class NotiListener {
11+
private final SimpMessagingTemplate messagingTemplate;
1012
@EventListener
1113
public void handleNotiEvent(NotiEvent event) {
14+
String username = event.getUsername();
1215
System.out.println("NotiEvent: " + event.getMessage());
16+
messagingTemplate.convertAndSend("/topic/notifications/" + username, event.getNotis());
1317
}
1418
}

src/main/java/cmf/commitField/domain/noti/noti/service/NotiService.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cmf.commitField.domain.noti.noti.entity.NotiDetailType;
66
import cmf.commitField.domain.noti.noti.entity.NotiMessageTemplates;
77
import cmf.commitField.domain.noti.noti.entity.NotiType;
8+
import cmf.commitField.domain.noti.noti.event.NotiEvent;
89
import cmf.commitField.domain.noti.noti.repository.NotiRepository;
910
import cmf.commitField.domain.season.entity.Season;
1011
import cmf.commitField.domain.user.entity.User;
@@ -13,10 +14,12 @@
1314
import cmf.commitField.global.exception.CustomException;
1415
import lombok.RequiredArgsConstructor;
1516
import lombok.extern.slf4j.Slf4j;
17+
import org.springframework.context.ApplicationEventPublisher;
1618
import org.springframework.stereotype.Service;
1719
import org.springframework.transaction.annotation.Transactional;
1820

1921
import java.text.MessageFormat;
22+
import java.util.ArrayList;
2023
import java.util.List;
2124

2225
@Service
@@ -26,6 +29,7 @@
2629
public class NotiService {
2730
private final NotiRepository notiRepository;
2831
private final UserRepository userRepository;
32+
private final ApplicationEventPublisher eventPublisher;
2933

3034
// 알림 메시지 생성
3135
public static String generateMessage(NotiDetailType type, Object... params) {
@@ -46,7 +50,12 @@ public void createNoti(User receiver) {
4650
.isRead(false)
4751
.message(message)
4852
.build();
49-
notiRepository.save(noti);
53+
54+
List<NotiDto> notis = new ArrayList<>();
55+
Noti savedNoti = notiRepository.save(noti);
56+
notis.add(new NotiDto(savedNoti.getId(), savedNoti.getMessage(), savedNoti.getCreatedAt()));
57+
NotiEvent event = new NotiEvent(this, receiver.getUsername(), notis, "새로운 알림이 생성되었습니다.");
58+
eventPublisher.publishEvent(event);
5059
}
5160

5261

src/main/java/cmf/commitField/global/scheduler/NotiTestScheduler.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ public class NotiTestScheduler {
1717
private final UserRepository userRepository;
1818
private final ApplicationEventPublisher eventPublisher;
1919

20-
@Scheduled(cron = "30 14 * * * *")
20+
// @Scheduled(cron = "30 2 * * * *")
2121
public void test() {
2222
System.out.println("test 실행");
2323

2424
User user = userRepository.findById(1L).orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
2525
notiService.createNoti(user);
26-
// eventPublisher.publishEvent();
2726
}
2827
}

src/main/java/cmf/commitField/global/websocket/WebSocketConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
2121
.setAllowedOrigins("*"); // CORS 설정, 실제 환경에서는 보안을 위해 제한적으로 설정해야 함
2222

2323
// 알림 웹소켓 핸들러 등록
24-
registry.addHandler(notiWebSocketHandler, "/notifications")
25-
.setAllowedOrigins("*");
24+
// registry.addHandler(notiWebSocketHandler, "/notifications")
25+
// .setAllowedOrigins("*");
2626
}
2727
}

0 commit comments

Comments
 (0)