개발자꿈나무

TCP 통신을 통한 CRUD 구현 본문

기술블로그

TCP 통신을 통한 CRUD 구현

망재이 2023. 4. 7. 21:49

TCP와 UDP에 대해서 배우고 난뒤, 서버와 클라이언트를 연결해 채팅 프로그램도 만들어봤으나 그건 수업에서 진행한 코드라 공개적으로 올리는건 힘들 것 같고 자체적으로 만들어본 프로그램이 있어서 그것에 대해서 블로깅해보려고 한다.

 

먼저 TCP와 UDP란 무엇이며 가장 큰 차이는 무엇인가?

TCP : 연결기반 (연결 후 통신 - 1:1통신방식) ex) 전화 [Socket, ServerSocket]

UDP : 비연결기반 (연결없이 통신 - 1:1, 1:n, n:n 가능) ex) 소포 [DatagramSocket, DatagramPacket, MulticastSocket]

 

두 통신의 가장 큰 차이점은 '신뢰성'이다! TCP는 연결 요청이 있고난 후 수락을 해야만 통신이 가능하지만 UDP는 그런 과정이 존재하지 않는다. 그렇다면 클라이언트와 서버 간의 관계와 소켓은 무엇인가?

아래 그림을 보면 이해가 조금 쉬울 듯하다.

각각의 Server와 Client 영역이 존재한다. ServerSocket을 실행시켜서 port 50001번의 문을 열어놓고 대기하고 있으면 접속하고자 하는 Client가 Socket을 통해서 ServerSocket에 connet한다.

접속이 받아들여지면 실질적인 통신은 socket과 socket 사이에 이루어진다.

 

우리가 만들어본 프로그램은 TCP통신을 기반으로 클라이언트가 정보를 JSON에 넣어서 보내면 Server에서 처리한 후 다시 클라이언트에게 목록창을 띄워주는 작업이었다.

 

1. Product DTO

    - 데이터베이스와 연동하지는 않았음

    - 기본적인 이름, 번호, 수량, 가격 정보를 저장

    - getter와 setter 생성

 

2. ProductServer { SocketClient 중첩 }

    - SocketClient 클래스가 위에서 설명했던 실제 통신이 이루어지는 Server안에 존재하는 Socket

    - 이런 프로그램을 만들 때 핵심적인 부분들은 스레드풀의 활용!

    - 스레드를 사용하는 이유는 스레드를 사용하지 않게되면 main문에서 서버를 start해주고 통신을 수락하기 위해 대기하는 동안 다른

       작업이 이루어질 수 없어서 프로그램이 실행되지 않고 무한대기 상태가 된다.

    - 또한 클라이언트의 동시요청을 처리하기 위해 단일 스레드를 사용하는게 아니라 멀티 스레드를 사용해야 하는데 멀티 스레드만! 쓴다고 

      무조건 좋은건 아님. 여러 개의 스레드를 무한히 늘리게 되면 오히려 과부하가 일어날 수 있으므로 스레드풀을 만들어서 사용할 최대 

      스레드 갯수를 설정해주는게 좋음. 위 코드는 100개의 스레드풀을 생성

    - ExecutorService 인터페이스와 Executors 클래스 : 병렬처리를 처리해주는 클래스. 하나의 작업을 완료하고 다음 작업을 수행하는

       방식이 아니라 병렬적으로 여러 스레드가 여러 개의 코어에서 동시에 실행할 수 있도록 도와줌.

    - Server에는 접속을 허용하고 실행시키는 역할만 수행하고 대부분의 기능은 SocketClient에서 실행

 

 

    - SocketClient 생성자 생성 : ProductServer와 socket을 매개변수로 받아서 생성자 초기화

    - JSON객체를 받아서 처리하는 과정 : CRUD를 구성하는 부분으로 무조건 목록을 반환해야 하므로 read를 항상 실행해주고 나머지 

       CREATE, UPDATE, REMOVE는 switch문을 이용해서 입력받는 숫자에 따라 처리해주도록 구성.

       고민을 많이 했던 부분들이 JSON객체 안에 JSONArray를 넣어야 하는데 이 부분은 구체적으로 배우지 않았어서 어떻게 처리를 

       해야할지 고민을 많이 했다. JSONObject를 만들어서 그 안에 데이터를 저장해서 list에 저장을 해주면 Server에서는 그 list에 

       들어있는 값들을 하나하나 JSONObject에 넣어주고 그렇게 만들어진 JSONObject를 JSONArray에 넣어주도록 구성했다.

create / read

 

3. ProductClient

    - 실질적으로 화면을 띄워주는 부분

    - JSONObject로 받아온 객체를 String으로 변환해 콘솔에 띄워줌

    - 1 ~ 4가 아닌 값을 넣게 되면 입력을 받지 않고, 수량에 문자열 등 적합하지 않은 데이터를 입력하게 되면 예외가 발생해서 잘못된

       처리를 하지 않도록 구성

 

4. 결과창

    - 제일 처음 나타나게되는 화면

    - create를 했을 때 바로 목록에서 read값을 가져오는 화면

    - 잘못된 타입의 데이터값을 입력했을 때 예외가 발생하는 모습(실제 클라이언트창에서는 볼수없지만 서버창에서는 예외가 발생한 상황)

    - delete 처리 화면

    - Client의 접속이 끊기더라도 Server가 종료되지 않으면 내부 데이터는 계속 저장되어 있음

728x90