자바에서 스레드를 고려하지 않고 동시에 요청을 보내면 동시성 문제를 겪어서 심각한 오류를 경험할 수 있다.
간단한 로그 추적기 예제를 통해 알아보자.
<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 |