스프링 핵심 원리 - 고급편 - 섹션1. 예제 만들기
CS/김영한 스프링 강의

스프링 핵심 원리 - 고급편 - 섹션1. 예제 만들기

프로젝트 기본 세팅

 

 

 

로그 추적기를 만들어볼거다.

 

package hello.advanced.trace;

import java.util.UUID;

public class TraceId {

    private String id;
    private int level;

    public TraceId() {
        this.id = createdId();
        this.level = 0;
    }

    private TraceId(String id, int level) {
        this.id = id;
        this.level = level;
    }

    private String createdId() {
        return UUID.randomUUID().toString().substring(0, 8);
    }

    public TraceId createNextId() {
        return new TraceId(id, level + 1);
    }

    public TraceId createPreviousId() {
        return new TraceId(id, level - 1);
    }

    public boolean isFirstLevel() {
        return level == 0;
    }

    public String getId() {
        return id;
    }

    public int getLevel() {
        return level;
    }
}
package hello.advanced.trace;

public class TraceStatus {

    private TraceId traceId;
    private Long startTimeMs;
    private String message;

    public TraceStatus(TraceId traceId, Long startTimeMs, String message) {
        this.traceId = traceId;
        this.startTimeMs = startTimeMs;
        this.message = message;
    }

    public TraceId getTraceId() {
        return traceId;
    }

    public Long getStartTimeMs() {
        return startTimeMs;
    }

    public String getMessage() {
        return message;
    }
}
package hello.advanced.trace.hellotrace;

import hello.advanced.trace.TraceId;
import hello.advanced.trace.TraceStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class HelloTraceV1 {

    private static final String START_PREFIX = "-->";
    private static final String COMPLETE_PREFIX = "<--";
    private static final String EX_PREFIX = "<X-";

    public TraceStatus begin(String message) {
        TraceId traceId = new TraceId();
        Long startTimeMs = System.currentTimeMillis();
        log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX,
                traceId.getLevel()), message);
        return new TraceStatus(traceId, startTimeMs, message);
    }

    public void end(TraceStatus status) {
        complete(status, null);
    }

    public void exception(TraceStatus status, Exception e) {
        complete(status, e);
    }

    private void complete(TraceStatus status, Exception e) {
        Long stopTimeMs = System.currentTimeMillis();
        long resultTimeMs = stopTimeMs - status.getStartTimeMs();
        TraceId traceId = status.getTraceId();
        if (e == null) {
            log.info("[{}] {}{} time={}ms", traceId.getId(),
                    addSpace(COMPLETE_PREFIX, traceId.getLevel()), status.getMessage(),
                    resultTimeMs);
        } else {
            log.info("[{}] {}{} time={}ms ex={}", traceId.getId(),
                    addSpace(EX_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs,
                    e.toString());
        }
    }

    // level=0
    // level=1 |-->
    // level=2 |    |-->

    // level=2 ex |    |<X-
    // level=1 ex |<X-
    private static String addSpace(String prefix, int level) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++) {
            sb.append( (i == level - 1) ? "|" + prefix : "| ");
        }
        return sb.toString();
    }
}

 

테스트 해보자. 여기에 덧붙이며 진행할 거기 때문에 여기를 확실히 이해해야 한다.

 

 

대충 만들었으니 적용해보자

 

별건 없다. 그냥 모든 함수들 시작점과 끝점에 trace 클래스인 TraceStatus 시작 종료를 다 넣어주는 것 뿐이다.

 

 

 

이제 남은 문제들도 처리해보자.

 

깊이 구현

 

자신의 깊이 레벨 +1을 한 객체를 반환해서 준다. 이걸로 자신의 레벨을 파악한다.

 

 

이걸 실제로 적용한다.

 

id를 같게 하려고 sync 함수를 만든 것 뿐 별 다른건 없다.

 

V1때와 똑같이 status 안의 TraceId 객체를 매번 생성해서 주지만, id는 같은걸로 만들어서 주기때문에 이젠 id는 같고 깊이만 다르게 생긴다.

 

 

아직 남은 문제는 id 맞출려고 일일히 수정하고, 처음 시작은 begin, 이후에 시작은 beginSync로 해야 되고.. 하는 불편함이 있다. 당연하지만 나중에 보완해본다.