Java 네트워킹발행일 2024. 5. 16.원본 https://blog.naver.com/jword_/223446859183 ↗

[JAVA] TCP 소켓통신 SOLID 원칙으로 재구성하기

[JAVA] TCP 소켓통신 SOLID 원칙으로 재구성하기 — #JAVA소켓통신 #JAVASOLID #개발자의도구들 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 ...

#[java]Socket 통신#Naver Blog

#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)

​