Notice
Recent Posts
Recent Comments
Link
꾸준한 개발일기
Thread(스레드)란? 본문
반응형
🧵 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(무상태)하게 설계
반응형
'Programing > 스프링' 카테고리의 다른 글
스프링(Spring)과 스프링 부트(Spring Boot)의 차이 (0) | 2025.03.22 |
---|---|
@Configuration이란? (0) | 2025.03.21 |
스프링 컨테이너(ApplicationContext)의 구현체 AnnotationConfigApplicationContext란? (0) | 2025.03.19 |
웹 애플리케이션과 싱글톤 컨테이너란? (0) | 2025.03.07 |
Spring:: IntelliJ에서 Gradle 버전 업그레이드 방법 (0) | 2024.08.21 |
Comments