자바

동시성 문제를 해결하기 위한 ThreadLocal[java]

연향동큰손 2025. 3. 5. 15:15

 

자바에서 스레드를 고려하지 않고 동시에 요청을 보내면 동시성 문제를 겪어서 심각한 오류를 경험할 수 있다.

 

간단한 로그 추적기 예제를 통해 알아보자.

 


 

<OrderRepositoryV3>

package hello.advanced.app.v3;

import hello.advanced.trace.TraceId;
import hello.advanced.trace.TraceStatus;
import hello.advanced.trace.hellotrace.HelloTraceV2;
import hello.advanced.trace.logtrace.LogTrace;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class OrderRepositoryV3 {

    private final LogTrace trace;


    public void save(String itemId){

        TraceStatus status = null;

        try {
            status = trace.begin("OrderRepositoryV1.save()");
           if(itemId.equals("ex")){
               throw new IllegalStateException("예외 발생!");
           }
           sleep(1000);
            trace.end(status);
        }catch(Exception e){
            trace.exception(status, e);
            throw e;
        }
    }

    private void sleep(int millis){
        try{
            Thread.sleep(millis);

        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }


}

 

 

<OrderServiceV3>

package hello.advanced.app.v3;

import hello.advanced.trace.TraceId;
import hello.advanced.trace.TraceStatus;
import hello.advanced.trace.hellotrace.HelloTraceV2;
import hello.advanced.trace.logtrace.LogTrace;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class OrderServiceV3 {

    private final OrderRepositoryV3 orderRepositoryV1;
    private final LogTrace trace;

    public void orderItem(String itemId){
        TraceStatus status = null;
        try {
            status = trace.begin("OrderService.orderItem()");
            orderRepositoryV1.save(itemId);
            trace.end(status);
        }catch(Exception e){
            trace.exception(status, e);
            throw e;
        }

    }
}

 

 

<OrderControllerV3>

package hello.advanced.app.v3;


import hello.advanced.trace.TraceStatus;
import hello.advanced.trace.hellotrace.HelloTraceV2;
import hello.advanced.trace.logtrace.LogTrace;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class OrderControllerV3 {

    private final OrderServiceV3 orderService;
    private final LogTrace trace;

    @GetMapping("/v3/request")
    public String request(String itemId){

        TraceStatus status = null;
        try {
            status = trace.begin("OrderController.request()");
            orderService.orderItem(itemId);
            trace.end(status);
            return "ok";
        }catch(Exception e){
            trace.exception(status, e);
            throw e;
        }
    }
}

'자바' 카테고리의 다른 글

추상 메서드, 추상 클래스, 익명 내부 클래스[Java]  (0) 2025.03.12
Thread란 무엇인가[Java]  (1) 2025.03.02
예외  (0) 2025.02.02
HashMap  (0) 2024.02.21
Iterator  (2) 2024.02.21