꾸준한 개발일기

Thread(스레드)란? 본문

Programing/스프링

Thread(스레드)란?

꾸개일 2025. 3. 20. 07:35
반응형

🧵 Thread(스레드)란?

스레드(Thread)프로그램 내에서 실행되는 하나의 작업 흐름(실행 단위) 을 의미합니다.

  • 하나의 애플리케이션은 여러 개의 스레드를 가질 수 있음 (멀티스레드 환경)
  • 스레드끼리 자원을 공유할 수 있지만, 동시에 접근하면 경합(경쟁 조건, Race Condition) 이 발생할 수 있음

🔍 코드에서 Thread 개념 이해하기

// A 사용자가 10000원 주문
int userAPrice = statefulService1.order("userA", 10000);
// B 사용자가 20000원 주문
int userBPrice = statefulService2.order("userB", 20000);

이 코드에서 statefulService1과 statefulService2는 동일한 빈(객체) 을 참조하고 있습니다.
즉, 싱글톤 객체(StatefulService)가 여러 스레드에서 동시에 사용될 수 있다는 뜻입니다.


멀티스레드 환경에서 발생할 수 있는 문제

만약 StatefulService가 공유되는 필드(상태값) 을 가지고 있다면,
여러 스레드가 같은 객체를 사용하면서 값이 덮어쓰기될 위험이 있습니다.

🚨 문제가 될 코드 (상태를 가진 싱글톤 빈)

public class StatefulService {
    private int price; // 상태를 유지하는 필드 ❌ 위험!

    public void order(String user, int price) {
        System.out.println(user + " 주문 금액 = " + price);
        this.price = price; // ❌ 상태를 변경하는 코드
    }

    public int getPrice() {
        return price;
    }
}
  • ThreadA 가 10000원 주문 → price = 10000
  • ThreadB 가 20000원 주문 → price = 20000
  • ThreadA 가 getPrice() 호출 → 20000원이 반환됨 (원래는 10000원이 나와야 함 😵)
  • 즉, B 사용자의 주문이 A 사용자의 데이터를 덮어쓰는 문제 발생!

해결 방법: 무상태(Stateless)하게 설계하기

상태값을 필드에 저장하지 말고, 메서드 내부에서 처리한 후 바로 반환하는 방식으로 변경하면 됩니다.

public class StatefulService {
    public int order(String user, int price) {
        System.out.println(user + " 주문 금액 = " + price);
        return price; // ✅ 상태를 저장하지 않고 바로 반환
    }
}
  • 이제 order()가 price 값을 그대로 반환하므로,
    각 요청이 독립적으로 처리되고, 값이 덮어쓰이는 문제가 사라집니다. 🎉

🎯 정리

Thread(스레드) 는 프로그램 내에서 실행되는 개별 작업 흐름
싱글톤 빈이 상태(값)를 가지면 멀티스레드 환경에서 문제 발생
해결 방법: 상태를 유지하지 않고 Stateless(무상태)하게 설계

 

반응형
Comments