코딩/sparta TIL

AWS GateWay + WebSocket : WS / API 통신용 컨트롤러 분리에 대하여

americanoallday 2025. 6. 27. 17:52

지금 나는 chatController 에서

websocket 통신과, api 통신(채팅방 생성, 채팅방 리스트 불러오기, 채팅방 입장하기 등등) 모든 것을 처리함.

 

이렇게 될 경우 AWS Gateway 담당자 분이 핸드쉐이크에서 모든 경로에 접근하려고 해서 오류가 날 수 있다고 함.

> 솔직히 핸드쉐이크랑 게이트웨이 구조 몰라서 그런가 보다 라고까지만 이해함.

 

튜터님 조언 :

컨트롤러를 나누는게 확장성을 고려한다면 맞는 구조다. 하지만 지금 단계에서 필수라고 생각되지 않는다. 중요한건 기능 구현이 먼저고, 그건 나중에 개선으로 해도 될 것 같다.

> 팀원분이 핸드쉐이크 부분에 대한 우려가 있어보여서 그냥 내가 바로 컨트롤러 나눠서 해보겠다고 종결지음.

 

하지만 AI 답변은 나누는걸 추천하지만 나누는게 정답이 아니라고 함.

메모 해두고 나중에 공부해야할 듯

 


결론부터 말씀드리면, **“꼭 컨트롤러를 분리해야만 하는 것은 아니다”**가 정답입니다.  
하지만 “분리하면 얻는 장점”과 “분리하지 않아도 되는 상황”이 각각 있습니다.


## 1. **분리하는 게 맞는 경우(장점)**
- **WebSocket 엔드포인트와 REST API의 보안 정책, 인증 방식, 라우팅 정책이 완전히 다를 때**
- **게이트웨이에서 WebSocket 업그레이드 경로만 별도로 관리하고 싶을 때**
- **대규모 서비스에서 REST와 WebSocket 트래픽을 완전히 분리해서 운영하고 싶을 때**
- **코드 구조상 명확하게 역할을 나누고 싶을 때(유지보수, 확장성)**

이런 경우에는  
- `/api/clubs/{clubId}/chat` → REST API 컨트롤러  
- `/chat/ws` 또는 `/api/clubs/{clubId}/chat/ws` → WebSocket 컨트롤러  
처럼 **분리**하는 것이 “더 좋은 설계”가 될 수 있습니다.


## 2. **분리하지 않아도 되는 경우**
- **게이트웨이에서 이미 chat 서버로 라우팅을 잘 해주고 있고**
- **UI 흐름상 사용자가 임의로 WebSocket 엔드포인트에 접근할 수 없고**
- **REST와 WebSocket 모두 같은 인증/권한 정책을 쓴다면**

이럴 때는  
- 같은 컨트롤러(혹은 같은 경로)에서 REST와 WebSocket을 같이 관리해도  
  **실질적인 보안/운영상 문제는 없습니다.**


## 3. **실무에서의 결론**
- **“꼭 분리해야 한다”는 강제 규칙은 없음**
- 하지만 **“분리하면 더 명확하고, 게이트웨이/보안/운영 측면에서 유리”**한 경우가 많음
- **작은 프로젝트/단일 서버/간단한 서비스**라면 굳이 분리하지 않아도 됨
- **대규모/장기 운영/보안 민감**하다면 분리하는 것이 더 좋음

---

### **정리**
- **분리해도 되고, 안 해도 된다.**
- “꼭 분리해야 한다”는 것은 아니다.
- 하지만 **분리하면 더 명확하고, 인프라/보안/운영에 유리**한 것은 사실이다.


**실제 운영 환경/팀 정책/트래픽/보안 요구사항**에 따라  유연하게 선택하시면 됩니다!