@Slf4j
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
log.debug("사용자 목록 조회 시작");
// 비즈니스 로직
log.info("사용자 목록 조회 완료");
return users;
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
log.info("사용자 생성 요청: {}", user);
try {
// 사용자 생성 로직
log.debug("사용자 생성 완료: {}", user);
return user;
} catch (Exception e) {
log.error("사용자 생성 실패: {}", e.getMessage(), e);
throw e;
}
}
}
@Service
public class OrderService {
@Transactional
public Order createOrder(OrderRequest request) {
MDC.put("orderId", request.getOrderId());
log.info("주문 생성 시작: {}", request);
try {
validateOrder(request);
log.debug("주문 유효성 검사 완료");
Order order = orderRepository.save(new Order(request));
log.info("주문 저장 완료: {}", order.getId());
return order;
} catch (Exception e) {
log.error("주문 생성 실패: {}", e.getMessage(), e);
throw new OrderException("주문 처리 중 오류 발생", e);
} finally {
MDC.remove("orderId");
}
}
}
로깅 모범 사례
적절한 로그 레벨 사용
ERROR: 시스템 동작이 불가능한 경우
WARN: 시스템은 동작하지만 주의가 필요한 경우
INFO: 일반적인 정보
DEBUG: 개발 시 상세 정보
TRACE: 가장 상세한 정보
예외 처리 시 로깅
try {
// 비즈니스 로직
} catch (Exception e) {
log.error("에러 발생: {}", e.getMessage(), e);
throw new CustomException("처리 중 오류 발생", e);
}
성능 고려사항
// 좋은 예
if (log.isDebugEnabled()) {
log.debug("복잡한 계산 결과: {}", calculateExpensiveValue());
}
댓글