안녕하세요 오늘은 Spring Boot에서 Enum을 활용한 코드 리팩토링 작업을 진행해보겠습니다.
enum이란 열거형을 정의하는 키워드로, int 또는 문자열을 단순 나열하는 대신 enum을 통해 쉽게 관리할 수 있습니다. enum은 다음의 장점을 가집니다.
이런 장점을 프로젝트에 활용해보았습니다. 아래 보시는 부분은 Mdc 등록을 위한 enum 클래스입니다. MdcKeysExtender 인터페이스를 생성하여 enum 원소들이 가질 수 있는 여러 메소드를 정의합니다. 이를 통해 enum을 유연하게 확장하여 효율적인 객체 생성이 가능합니다. 아래 코드의 경우 mdc에 값을 추가, 삭제, 로그 출력을 하나의 enum 원소에 등록한 코드입니다. 클라이언트에서 이를 실행시키려면 REQUEST_ID.add(request) 이런 식으로 사용하면 가독성도 좋아지고 위에서 말씀드린 여러 장점들을 취할 수 있습니다.
public enum MdcKeys implements MdcKeysExtender {
/**
* - request_id : 로그 아이디
* - request_context_path : 요청 path
* - request_url : 요청한 url
* - request_method : url method
* - request_time : 요청 시간
* - request_ip : 요청한 ip 주소
* - request_header : 요청 헤더
* - request_query_string : 요청 쿼리 스트링
* - request_body : 요청 바디 (컨트롤러에서 벨리데이션 이후 추가)
*/
REQUEST_ID{
public void add(HttpServletRequest request){ MDC.put("request_id",UUID.randomUUID().toString()); }
public void remove(){ MDC.remove("request_id"); }
public void log(){ logger.info("request_id : " + MDC.get("request_id")); }
},
REQUEST_CONTEXT_PATH{
public void add(HttpServletRequest request){ MDC.put("request_context_path", request.getContextPath()); }
public void remove(){ MDC.remove("request_context_path"); }
public void log(){ logger.info("request_context_path : " + MDC.get("request_context_path")); }
},
REQUEST_URL{
public void add(HttpServletRequest request){ MDC.put("request_url", request.getRequestURI()); }
public void remove(){ MDC.remove("request_url"); }
public void log(){ logger.info("request_url : " + MDC.get("request_url")); }
},
REQUEST_METHOD{
public void add(HttpServletRequest request){ MDC.put("request_method", request.getMethod()); }
public void remove(){ MDC.remove("request_method"); }
public void log(){ logger.info("request_method : " + MDC.get("request_method")); }
},
REQUEST_TIME{
public void add(HttpServletRequest request){ MDC.put("request_time", new Date().toString()); }
public void remove(){ MDC.remove("request_time"); }
public void log(){ logger.info("request_time : " + MDC.get("request_time")); }
},
REQUEST_IP{
public void add(HttpServletRequest request){ MDC.put("request_ip", request.getRemoteAddr()); }
public void remove(){ MDC.remove("request_ip"); }
public void log(){ logger.info("request_ip : " + MDC.get("request_ip")); }
},
REQUEST_HEADER{
public void add(HttpServletRequest request){ MDC.put("request_header", request.getHeader(TokenProvider.HEADER_NAME)); }
public void remove(){ MDC.remove("request_header"); }
public void log(){ logger.info("request_header : " + MDC.get("request_header")); }
},
REQUEST_QUERY_STRING{
public void add(HttpServletRequest request){ MDC.put("request_query_string", request.getQueryString()); }
public void remove(){ MDC.remove("request_query_string"); }
public void log(){ logger.info("request_query_string : " + MDC.get("request_query_string")); }
};
protected final Logger logger = LoggerFactory.getLogger(MdcKeys.class);
}
package com.toda.api.TODASERVERSPRINGBOOT.utils.extenders;
import jakarta.servlet.http.HttpServletRequest;
public interface MdcKeysExtender {
void add(HttpServletRequest request);
void remove();
void log();
}