[JAVA] TCP 소켓통신 SOLID 원칙으로 재구성하기
[JAVA] TCP 소켓통신 SOLID 원칙으로 재구성하기 — #JAVA소켓통신 #JAVASOLID #개발자의도구들 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 ...
#JAVA소켓통신 #JAVASOLID #개발자의도구들
AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다
\* 현재 소켓통신 프로젝트를 진행중입니다. 전체적인 목차를 보시려면 여기에서 참고하세요
SOLID 원칙 적용하기
이전글을 SOLID원칙을 전부 정리하였습니다. 이번에는 이 원칙을 적용하여 기존의 코드를 수정해보았는데요. 확실히 이전보다 객체나 인터페이스가 많아졌지만, 코드가 깔끔해졌고, 디버깅도 쉬워져서 개발하는데 편리하다고 생각이 들더군요.
실제 적용을 해보니 SRP원칙아너 ISP을 가장 많이 사용하는 것 같고, 나머지 원칙들은 크게 고려되지 않았던 것 같습니다. 그래도 쓸만한 상황이 최대한 사용 해보고자 합니다.
설계도
TCP 소켓 통신 전체 구조입니다.
송신 클라이언트
송신 클라이언트(Sender)
송신 클라이언트는 User로 부터 명령어를 입력받아 기능 패킷을 보내는 역할을 합니다.
- User: 명령어를 입력합니다.
- Main: 명령어를 입력 받아 Client로 넘겨줍니다.
- Client: Main으로 부터 명령어를 입력 받은 후 CommandProcessor에게 넘겨줍니다.
- CommandProcessor: 입력된 명령어를 처리하여 ProcessedObject를 만들어 Client로 넘깁니다.
- ServerHandler: 송/수신을 담당하는 부분이며, Client로 부터 ProcessedObject를 넘겨 받아, 패킷을 전송합니다.
- PacketSender: 송신의 제일 끝단에 해당하며, 최종적으로 서버로 파일을 전달하는 역할을 수행합니다.
ServerHandler에서 MessageType이 FileStartInfo일 경우 서버로 부터 파일 전송 시작됨을 알리게 되며, FileSender를 통해 따로 파일 전송 Sender를 만들어 둡니다. (이는 파일 토큰 구현에서 자세히 다룰 예정입니다.)
서버
서버(Server)
서버는 송신 클라이언트의 메세지를 해독하여 요청을 처리하는 역할을 수행합니다.
- PacketReader: 클라이언의 수신 최전방으로, Stream데이터를 해독항여 Message를 만듭니다.
- ClientHandler: 클라이언트로의 송/수신을 담당합니다. Thread이며, 각 클라이언트와 연결 될때마다 ClientHandler를 생성합니다.
- Server: ClientHandler로 부터 Message를 넘겨받고, ServiceGiver를 호출하여 원하는 서비스를 시행합니다.
- ServiceGiver: MessageType별로 서비스를 수행합니다. 이때 Managers를 통해 데이터를 관리합니다. (Id정보, message count, ClientHandler등.
- PakcetSender: 패킷전송의 최끝단으로, ServiceGiver에서 전달되 패킷을 수신 클라이언트에게 전달합니다.
수신 클라이언트
수신 클라이언트(Receiver)
수신 클라이언트는 서버로부터 데이터를 받아, 최종적으로 User에게 service를 제공합니다.
- PacketReader: 스트림 통신의 최전방으로 서버로 부터 온 데이터를 해독히여 Message를 만들어 ServerHandler로 넘깁니다.
- Server: ServerHandler로 부터 받은 메세지를 ServiceGiver에게 넘겨 줍니다.
- ServiceGiver: MessageType별로 정보를 해독하여 서비스를 제공합니다.
\* 최종적으로 User에게 서비스가 제공됩니다.
이때, FileStartInfo가 들어오는 경우 FileSaver를 따로 생성하여 File을 저장할 준비를 해놓습니다. 이후 FileType이 들어오면 파일이 순차적으로 저장됩니다.
모듈별로 각 기능을 최소한으로 쪼개어 전체 시스템을 설계하였습니다. 모든 Class는 각 기능을 한 문장으로 나타낼 수 있도록 만드는 것이 좋은 것 같습니다. 때로는 여러 기능이 묶여있을 수 있으나, 이건 추상화의 정도를 어디 까지 하느냐가 관건인 것 같습니다.
공통 모듈
- MessageType: command 별로 전달되는 MessageType
- PakcetMaker: body에 Header정보를 붙여준다.
- Message: PacketReader에서 사용되며, 스트림 바이트 데이터를 해독하여 MesseageTypeCode, MessageType 및 Socket 정보가 들어있다.
- MessageProcessor: 전달 받은 Message를 객체로 되돌려 주는 역할을 한다.
Code
Github
https://github.com/keyveloper/socket.git
[GitHub - keyveloper/socket: socket chatting project
socket chatting project. Contribute to keyveloper/socket development by creating an account on GitHub.
github.com](https://github.com/keyveloper/socket.git)







