의존성은 lombok과 spring web두개만 추가했다.

예제프로젝트 만들기 - v0

간단한 예제부터 만들어보자.

리포지

package hello.advance.v0;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class OrderRepositoryV0 {
    public void save(String itemId) throws InterruptedException {
        // 저장 로직
        if (itemId.equals("ex")) {
            throw new IllegalStateException("예외 발생!");
        }
        sleep(1000); // 1초 대기
    }

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

서비스

package hello.advance.v0;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class OrderService {

    private final OrderRepositoryV0 orderRepositoryV0;

    public void orderItem(String ItemId) throws InterruptedException {
        orderRepositoryV0.save(ItemId);

    }
}

컨트롤러

package hello.advance.v0;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class OrderControllerV0 {

    private final OrderServiceV0 orderServiceV0;

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

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

새로운 회사에 입사했다고 해보자. 수년간 운영중인 거대한 프로젝트에 투입되었음. 전체 소스는 수십만 라인이고 클래스도 수백개 있다. 이때 내게 처음 맡겨진 요구사항이 로그 추적기를 만든다고 해보자.

요구사항은 다음과 같다.

  1. 모든 public 메서드의 호출과 응답 정보를 로그로 출력
  2. 애플리케이션의 흐름 변경 x
  3. 메서드 호출에 걸린 시간 측정
  4. 정상 흐름과 예외 흐름 구별해 출력 (예외 발생시 예외 정보 출력)
  5. 메서드 호출의 깊이 표현
  6. 어떤 HTTP 요청인지 구별 (HTTP요청별로 특정 ID출력, 트랜잭션 ID 구별)