티스토리 뷰

728x90
반응형

오늘은 이어서 계산기 프로그램 프로젝트의 Step2 와 Step3를 진행해보려 한다. 

1. 계산기 프로그램을 웹 애플리케이션

1) 계산기 프로그램을 웹 애플리케이션으로 만들기

  • Step1 - 사용자 요청을 메인 Thread가 처리하도록 한다.
  • Step2 - 사용자 요청이 들어올 때마다 Thread를 새로 생성해서 사용자 요청을 처리하도록 한다.
  • Step3 - Thread Pool을 적용해 안정적인 서비스가 가능하도록 한다.

2) 구현 참고사항

  • Step1의 한계
    • Step1 과정에서 웹 애플리케이션 서버인 미니 톰캣을 구현하였다.
    • 이 때 main 스레드에서 작업을 하였는데, main 스레드가 작업을 수행하던 중 블럭킹이 걸리게 된다면 다음 클라이언트 요청이 바로 수행되지 못하고 이전 작업이 완료될 때까지 기다려야 한다.
    • 이러한 문제를 해결하기 위해 main 스레드가 아닌 별도 스레드가 생성되도록 해야한다.
  • Step2에서는 요청마다 새로운 스레드를 생성하여 작업하도록 구현해보려고 한다. 
  • ClientRequestHandler(스레드)를 구현한다.
    • 기존 CustomWebApplicationServer의 main 메서드 안에 있던 HttpRequest 파트를 잘라내어 ClientRequestHandler의 run 메서드로 이동시킨다.
  • CustomWebApplicationServer에는 새로운 요청이 들어올 때마다 새로운 스레드를 생성하도록 구현한다.
new Thread(new ClientTrequestHandler(clientSocket)).start();
  • 스레드의 이름을 logger로 찍어보면, 새로운 Thread-0 이 생성되는 것을 확인할 수 있다.
  • Step2의 한계
    • 사용자의 요청이 들어왔을 때마다 스래드를 생성하기 때문에 발생하는 문제가 있다. 독립적인 스택 메모리가 할당되기 때문에 비싼 작업이 많이 발생한다. 동시 접속자가 많아질 때는 성능이 떨어지며 최악에는 리소스 한계로 서버가 다운될 수 있는 문제가 있다. 따라서 제한을 두고 스레드를 생성하는 것이 필요하다.
  • Step3에서는 스레트 풀을 적용하여 리소스가 안정적으로 사용될 수 있도록 구현해보려 한다.
  • 스레드 풀을 적용하기 위해 여기서는 newFixedThreadPool을 사용할 것이다.
private final ExecutorService executorService = Executors.newFixedThreadPool(nThreads: 10);
  • Step2에서 새로운 스래드를 생성해줬던 것을 대신하여 스레드 풀을 execute하면 된다. 
executorService.execute(new ClientRequestHandler(clientSocket));
  • logger로 찍어보면 pool-1-thread-1의 이름을 확인할 수 있다. 즉 스레드 풀의 스레드를 꺼내어 쓴 것을 알 수 있다.

 


 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://bit.ly/43z0P6S

 

 

#패스트캠퍼스 #포트폴리오 #직장인자기계발 #환급챌린지 #포트폴리오챌린지 #패스트캠퍼스후기 #초격차패키지 #오공완

728x90
반응형
댓글