Spring

Spring에서의 프로세스와 스레드

윤밥밥 2024. 10. 21. 11:19

프로세스와 스레드


만약 프로세스와 스레드에 관한 지식이 부족하다면 아래 포스트를 참고해도 좋을 거 같습니다.

https://yooooonshine.tistory.com/43


Spring에서의 프로세스와 스레드


Spring 서버는 서버 자체로 하나의 프로세스이기 때문에, 내부 동작은 프로세싱과 거의 무관하다.

대신 Spring은 멀티 스레딩 개념을 활용하여 성능 최적화를 한다.

만약 멀티 프로세싱 개념을 통해 병렬 처리를 하고 싶다면, 컨테이너 기반 배포 환경을 공부하는 것이 좋을 거 같다.

Spring의 스레드

스프링에서는 스레드 개념을 어디서 사용하고 있을까?

대략 아래와 같은 부분에서 사용하고 있다고 한다.

  • 스레드 풀
  • 비동기 작업
  • 트랜잭션 관리

이것들을 중심으로 어떻게 사용되고 있는 지 알아보고자 한다.


스레드 풀(thread pool)


스레드 풀이란 미리 스레드를 생성하여 관리하고, 필요한 스레드를 재사용하는 기법이다.

Spring에서는 Spring 내의 Tomcat(WAS, 웹서버)이 스레드 풀을 관리하고, Tomcat은 요청이 오면 스레드 풀에서 가용 스레드를 꺼내 요청을 할당한다.

 

Spring 서버에서는 한 순간에 다중요청이 올 수 있다.

이 때 다중요청이 오면, 각 요청은 멀티 스레드를 통해 각 요청 별로 스레드를 할당받아 처리된다.

 

 

동작 방식

  • 클라이언트 요청 수신: Tomcat은 특정 포트(기본적으로 8080번 포트)에서 HTTP 요청을 대기하고 있다가 클라이언트 요청을 받는다.
  • 스레드 풀에서 스레드 할당: 요청을 받으면 Tomcat은 스레드 풀에서 사용 가능한 스레드를 할당합니다. 요청이 많을 때는 스레드 풀에서 가능한 스레드가 모두 사용될 수 있다. 이럴 경우 요청은 작업 큐에 들어가고 가용 스레드가 생기면 스레드를 할당받는다.
  • 요청 처리: 할당된 스레드는 요청을 처리하며, Spring Boot 컨텍스트를 통해 컨트롤러로 요청을 전달하여 로직을 실행한다.
  • 응답 반환 및 스레드 반환: 처리가 완료되면 스레드는 클라이언트에게 응답을 반환하고, 스레드는 다시 스레드 풀로 반환되어 다른 요청을 처리할 준비를 한다.

비동기 작업


Spring에서는 @Async 를 통해 비동기 작업을 할 수 있다.

비동기화된 메서드는 별도의 스레드에서 작업이 실행된다.

이 때 스레드 풀과 별개로, 비동기 작업에서 사용될 스레드 수, 미리 만들어진 스레드 수를 Spring내에서 설정할 수 있다.

트랜잭션 관리


트랜잭션 관리에서 스레드는 트랜잭션의 경계를 유지하고, 작업이 고유한 트랜잭션 컨텍스트 내에서 처리되도록하는 역할을 한다.

Spring에서 @Transactional 이 시작되면 스레드에 트랜잭션이 바인딩되고, 스레드 로컬에 트랜잭션 정보가 저장된다. 이를 통해 한 스레드에서 일어나는 여러 db 작업들이 하나의 트랜잭션으로 취급될 수 있다.

 

참고로, 트랜잭션은 일관성의 이유로 싱글 스레드에서 처리된다. 

만약 트랜잭션 내에서 비동기 작업을 통해 별개의 스레드로 들어간다면, 이 스레드에서는 기존의 트랜잭션이 반영되지 않는다.

스레드 로컬이란?

더보기

Java에서 제공하는 기능으로, 각 스레드가 독립적인 값을 저장할 수 있도록 저장소를 제공하는 컨테이너이다.