본문 바로가기
공부/java & Spring

[Thread pool 설정] 스프링 부트 스레드 개수 조절하기

by 고기 2022. 11. 20.

1. 개요

2. 스레드 풀 설정하기

3. 스레드 풀 적용 확인하기


 

1. 개요

스레드라는 단어를 전공수업에서 또는 어디선가 주워들었던 적이 있을 것이다.

나 역시 운영체제시간에 공부를 했으나... (놀랍게도 운영체제 과목 학점은 무려 A였다.)

정작 직접 프로젝트에 실적용해본적은 없었다. 대충 이론만 공부했다는 소리ㅋㅋㅋ

 

그리고 몇 년이 지난 지금.

생각지도 않은 스프링 토이 프로젝트를 하게 되어 부랴부랴 자바를 공부하게 되었다.

젠장.

 

아무튼 현재 필요한 작업은 다중 사용자 요청을 처리해야하는 것이다.

다중으로 사용자 요청이 들어오는 경우를 처리하기 위해 무슨 처리를 해야 하는가?

과거의 기억을 되살려 스레드라는 것을 열심히 검색해봤다.

 

이처럼 전공자라면 자바 스레드 생성 또는 스레드 풀 등으로 검색을 하는 망령들이 많을 것이라고 생각한다.

근데 뭐 대충 보니까 스프링 및 스프링 부트에서는

클라이언트의 요청을 처리할 때 자동으로 스레드 풀을 생성해서 처리해준다네?

정확히는 톰캣에서 스레드 풀을 관리한다는 것 같다.

 

그나저나 개념에 대해서도 좀 공부를 해야할텐데 이렇게 겉핥기로 낼름낼름거리기만 해도 될런지 모르겠네.

어쨌든 스레드 풀에 대해 설정하기 위해 스프링 부트에 내장되어 있는 톰캣의 설정을 변경해주면 된다는 말이다.

 

2. 스프링 부트에서 스레드 풀 설정하기

설정이라고는 해도 딱히 우와... 하게 거창하게 코드를 작성할 건 없었다.

먼저 스프링 부트 프로젝트를 생성하면 같이 생성되는 application.properties 파일을 찾는다.

application.properties 파일의 확장자를 applicaiton.yml형식으로 바꿔주자.

 

그냥 properties로 만들어도 상관없을 것같긴 한데, yml이 가독성이 좋다나?

보다보니 그런 것 같기도 하고 해서 나도 바꿔봤다.

근데 변경하면 내용도 일부 변경해줘야하니까 귀찮은 사람은 그냥 properties로 쓰면 된다.

 

파일에 작성되어 있는 건 간단한 DB와 mybatis 설정이므로 신경쓰지 않아도 된다.

 

# applicaiton.properties #

# server setting
server.tomcat.threads.max=5
server.tomcat.threads.min-space=5
server.tomcat.accept-count=100
server.port=8080

# db setting
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.username=mhor
spring.datasource.password=1234

# template cache false
spring.thymeleaf.cache=false

# MyBatis mapper setting
mybatis.mapper-locations:mapper/**/*.xml

# mybatis camel case setting
mybatis.configuration.map-underscore-to-camel-case=true

# mybatis package alias
mybatis.type-aliases-package=toy.mapleStory

# log4j level setting
logging.level.toy.mapleStory=TRACE

 

# application.yml #

server:
  tomcat:
    threads:
      max: 5
      min-space: 5
    accept-count: 100

  port: 8080

spring:
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521/orcl
    username: mhor
    password: 1234

  thymeleaf:
    cache: false
  
mybatis:
  mapper-locations: mapper/**/*.xml
  configuration:
    map-underscore-to-camel-case: true
  type-aliases-package: toy.mapleStory

logging:
  level:
    toy.mapleStory.mapper: TRACE​

 

3. 스레드 풀 적용 확인하기

일단 내가 생각하고 있는 개략적인 서버-클라이언트 로직은 이렇다.

현재 최대로 입력받을 수 있는 입력값의 개수는 48개까지로 생각하고 있다.

 

48개의 입력값을 비동기방식으로 서버에 보내면 순식간에 48개의 요청이 올 것이고,

그렇게 되면 한 번에 크롤링 요청을 보내게 되어 connection error가 발생하기 때문에...

크롤링 요청을 보내는 스레드에 제한을 두려고 한다.

 

아무튼 그런건 아무래도 좋겠지.

일단 클라이언트에서 테스트 함수를 작성해서 아이디 6개를 서버로 보내본다.

 

대충 클라이언트 로직은 이렇다.

map 함수를 써서 서버로 비동기 요청(axios)을 보낸다.

 

요청이 서버에 보내진 것을 확인해보자.

먼저 6개의 요청이 서버로 보내진 것을 확인할 수 있다.

Waterfall을 보면 알겠지만 1~5번째의 요청이 먼저 수행되고 그 다음 마지막 6번째의 요청이 수행된다.

(비동기방식이라서 n번째라고 하기엔 애매모호하지만 사진에서 보내진 순서로 이해하면 된다.)

 

이제 서버를 확인해보자.

대충 서버 로직은 이렇다.

테스트용 Queue를 만들고, 클라이언트에서 요청한 개수 만큼 큐에 추가해서 출력하게 한다.

마지막으로 스레드 풀 개수가 설정되었는지 확인하기 위해 3초간 delay를 주었다.

 

이미 클라이언트 단에서도 적용된 내용을 확인할 수 있었지만 서버에서도 확인할 수 있도록 log를 찍히게 설정해봤다.

log를 확인해보면 제대로 설정되었는지 확인할 수 있다.

 

휴.. 다음주쯤에는 서버랑 클라이언트 두 개 다 어느정도 구현 끝날 것 같네!

적당히 빨리 끝내고 sqlp공부 해야하는데.

생각해보면 학생 시절에 아무것도 하지 않았던 시간이 너무 아깝다;;

 

핑핑 놀았던것도 아니다...

진짜 문자 그대로 아무것도 안해서 남는것도 없고 ㅠㅠ

이제와서 뭔가 해보고 싶어도 이것저것 할 시간이 없네 ㅡㅅㅡ

댓글