SMALL
오늘의 공부
STOMP 를 구현을 하면서 @Payload 관련되어서 오류가 하나 떠서 해당 @Payload 에 대해 알아볼려고 구글링을 하였다.
@Payload 는 자체가 byte 형식으로 보내게 되는데, 나는 ChatController 에서
@AuthenticationPrincipal
이 어노테이션을 통해 유저에 대한 정보를 가져올려고 하였다. 하지만 Filter 에서 SercurityContext 에 데이터를 넣어놓고 가져오게 되는데 작동하지 않았다. 왜냐하면 프로트콜이 HTTP 프로트콜이 아닌 ws 프로트콜을 이용하기 때문에, 검증을 안하기 때문에 만약 검증을 한다면 필터를 하나 생성하여 처리 해야한다. 그러므로 저 어노테이션은 현재 데이터가 안들어오게 된다. 그래서 해결 방법으로 ws 프로트콜을 통해 연결을 할때, 검증을 해버리면 되지 않을까? 해서 채널인터셉트를 통해 연결할때 DB 에서 채팅방을 걸러서 검증을 하고 연결을 허용하였다. 그렇더니 해결!
아래의 코드는 직접 작성해본 코드다.
@Slf4j
@Component
@RequiredArgsConstructor
public class WebScoketInterceptor implements ChannelInterceptor {
private final ShopMessageService service;
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
MessageHeaders headers = message.getHeaders(); //메세지 들어올때 헤더
MultiValueMap<String, String> map = headers.get(StompHeaderAccessor.NATIVE_HEADERS, MultiValueMap.class);
//접속할때만 헤더에 roomKey 를 담고 그다음 메세지 줄때는 roomKey 를 가지고 통신.
if (StompCommand.CONNECT == accessor.getCommand()) {
String token = map.get("Authorization").get(0);
System.out.println("접속함.");
System.out.println("접속함 : "+token);
if(service.checkVaild(token)){
service.checkRoom(map.get("Authorization").get(0), map.get("roomKey").get(0));
}
}
return message;
}
}
@Service
@RequiredArgsConstructor
public class ShopMessageService {
private final ShopRoomRepository repository;
private final JwtUtil jwtUtil;
public boolean checkVaild(String token) {
return jwtUtil.validateToken(token);
}
@Transactional(readOnly = true)
public void checkRoom(String token, String roomKey) {
String userId = jwtUtil.getUserInfoFromToken(token).getSubject();
ShopRoom shopRoom = repository.findByRoomKey(roomKey)
.orElseThrow(() -> {
System.out.println("ShopRoomKey 가 맞지 않다.");
throw new CustomException(ErrorCode.NO_CHATROOM);
});
System.out.println(userId);
if (shopRoom.getSellUserId().equals(userId) ||
shopRoom.getBuyUserId().equals(userId)) {
return;
}
System.out.println("해당 유저가 아니다!");
throw new CustomException(ErrorCode.NO_CHATROOM);
}
}
내일은?
내일은 결제 시스템을 구성해볼려고 Batch 관련 문서와 월별 금액대 계산을 하기 위해 또한, 오차 없이 계산을 위해
BigDecimal 를 통한 서비스 로직을 구현해볼것이다. 또한 쿼리DSL 강의를 들어볼거다!
반응형
LIST
'TIL' 카테고리의 다른 글
2023.07.12 - 207만건 데이터 조회 (1) (0) | 2023.07.12 |
---|---|
2023.07.06 (0) | 2023.07.06 |
2023.07.03 ( STOMP 테스트 기능 ) (0) | 2023.07.03 |
2023.06.30 TIL (0) | 2023.06.30 |
2023-06-26 TIL (0) | 2023.06.27 |