예제 프로젝트 생성

1. 컨트롤러

  • @RestController
    • @Controller + @ResponseBody 합쳐진 것
    • 컴포넌트 스캔과 스프링 Rest 컨트롤러로 인식됨
  • RequestBody 와 ResponseBody 어노테이션
    • JSON으로 요청한 파라미터들을 Java에서 받으려면 Java Object로의 변환이 필요함
    • 응답시에도 Java Object에서 JSON으로 변환이 필요함
    • @RequestBody 와 @ResponseBody 어노테이션이 이러한 작업들을 자동으로 처리
      • @RequestBody: HTTP 요청의 body 내용을 자바객체로 매핑하는 역할
      • @ResponseBody: 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할
@RestController
@RequiredArgsConstructor
public class OrderControllerV0 {

    private final OrderServiceV0 orderService;

    @GetMapping("v0/request")
    public String request(String itemId){
        orderService.orderItem(itemId);
        return "ok";
    }
}

2. 서비스

  • @Service
    • @Service 내부에 @Component 존재하여 컴포넌트 스캔 대상이 됨
    • 스프링 빈으로 자동 등록됨
  • @RequiredArgsConstructor
    • DI(의존성 주입)의 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션
    • 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성
@Service
@RequiredArgsConstructor
public class OrderServiceV0 {

    private final OrderRepositoryV0 orderRepository; // 의존관계 주입

// RequiredArgsConstructor 어노테이션으로 인하여 생략 가능
/*
   @Autowired
   public OrderService(OrderRepositoryV0 orderRepository) {
      this.orderRepository = orderRepository;
   }
*/

    public void orderItem(String itemId){
        orderRepository.save(itemId);
    }
}

3. 레포지토리

  • @Repository : 컴포넌트 스캔 대상이 됨 → 스프링 빈으로 자동 등록됨
@Repository
@RequiredArgsConstructor
public class OrderRepositoryV0 {
    public void save(String itemId){
        if(itemId.equals("ex")){ // 예외 상황 확인 : itemId가 ex인 경우 예외 발생 
            throw new IllegalStateException("예외 발생!");
        }
        sleep(1000); // 1초 지연 : 상품 저장하는데 약 1초 걸린다고 가정
    }

    private void sleep(int millis){
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

4. 실행 및 결과

요구사항

로그 추적기 - 요구사항 분석

  • 모든 Public 메서드의 호출과 응답 정보를 로그로 출력
  • 애플리케이션 흐름을 변경하면 안됨 → 로그 남기기위해 비즈니스 로직 동작에 영향 주면 안됨
  • 메서드 호출에 걸린 시간 출력
  • 정상 흐름과 예외 흐름 구분 → 예외 발생시 예외 정보가 남아야 함
  • 메서드 호출의 깊이 표현
  • HTTP 요청을 구분
    • HTTP 요청 단위로 특정 ID(트랜잭션 ID)를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확히 구분
    • 트랜잭션ID : 하나의 http요청이 시작해서 끝날때 까지를 하나의 트랜잭션이라 함 (DB 트랜잭션과 무관)

예시

image.png