HOWTO · Java
Java에서 console.log 사용하기
Java에는 JavaScript의 console.log가 내장되어 있지 않습니다. System.out.println으로 간단한 메시지를 출력하고, 애플리케이션에는 java.util.logging이나 Log4j, SLF4J와 Logback 같은 로깅 방식을 선택하는 방법을 알아봅니다.
이 페이지의 내용
Java에는 내장 console.log 함수가 없습니다. 이 이름은 JavaScript에서 사용됩니다. Java 프로그램에서 메시지를 간단히 출력하려면 System.out.println을 사용하세요. 로그 수준을 구분하거나 출력 위치를 설정하고 형식을 일관되게 관리해야 하는 애플리케이션이라면 로깅 API 또는 프레임워크를 사용하는 편이 적합합니다.
System.out.println 사용하기
System.out.println은 값을 표준 출력으로 보내고 줄바꿈을 추가합니다. 다음은 인사말 하나를 출력하는 완전한 Java 프로그램입니다.
public class ConsoleExample {
public static void main(String[] args) {
String message = "Hello, Java!";
System.out.println(message);
}
}
Hello, Java!
이 프로그램은 message의 값을 표준 출력으로 보냅니다. 간단한 명령줄 프로그램, 빠른 진단 메시지, 또는 프로그램을 실행하는 사람에게 보여 줄 결과에는 이 방법이 편리합니다. 사용법은 간단하지만 로그 수준, 타임스탬프, 출력 위치를 설정하는 기능은 없습니다. 규모가 큰 애플리케이션에서 출력문이 여러 곳에 흩어지면 메시지를 걸러내고 관리하기도 어렵습니다.
익숙한 호출 형태가 필요하다면 직접 래퍼를 만들 수 있습니다. static void log(String message) 메서드를 정의한 Console 클래스를 만들고, 메서드 본문에서 System.out.println(message)를 호출한 다음 Console.log("Ready")처럼 사용하면 됩니다. 여기서 Console.log는 직접 작성한 코드이지 Java에 내장된 API가 아닙니다. 이렇게 작성해도 Java에 JavaScript의 console.log가 생기는 것은 아닙니다.
Java 로깅 프레임워크 활용하기
로깅 API는 코드가 심각도에 따라 메시지를 기록하도록 하고, 로깅 구현체는 메시지의 형식과 콘솔이나 파일 같은 출력 위치를 처리합니다. 일반적으로 로그 수준을 사용해 진단용 메시지와 경고, 오류를 구분합니다. 설정을 통해 어떤 메시지를 어디에 출력할지 정할 수 있으므로 일반적인 프로그램 출력과 애플리케이션 로그를 분리해 관리할 수 있습니다.
Java 표준 라이브러리에는 java.util.logging이 포함되어 있습니다. 별도의 서드파티 의존성을 추가하지 않고 로깅 API를 사용하려는 경우 실용적인 선택입니다. Log4j는 설정 가능한 appender와 레이아웃을 제공하는 별도의 로깅 구현체입니다. SLF4J는 이들과 역할이 다릅니다. 애플리케이션 코드에 공통 로깅 API를 제공하는 파사드이며, 실제 로그 출력을 위해 호환되는 provider 또는 바인딩이 필요합니다. 특정 통합 요구가 없다면 애플리케이션은 하나의 구현체를 선택하세요. 여러 로깅 시스템을 연결하거나 함께 쓰면 설정이 복잡해질 수 있습니다.
간단한 java.util.logging 예제로는 Logger logger = Logger.getLogger(MyClass.class.getName());와 같이 로거를 가져온 다음 logger.info("Service started");, logger.warning("Retrying request");, logger.severe("Request failed");를 호출할 수 있습니다. JDK에 포함된 로깅 설정을 사용하므로 별도 의존성이 필요하지 않습니다. 기본 콘솔 핸들러에서는 타임스탬프, 수준, 메시지가 포함된 INFO: Service started 같은 줄이 출력될 수 있습니다. 전체 접두부와 활성화된 로그 수준은 실행 환경의 로깅 설정에 따라 달라집니다. 이 형식은 API와 일반적인 출력 형태를 설명하기 위한 예시이며, 실제 실행 결과를 보고한 것이 아닙니다.
SLF4J와 Logback 구현하기
Maven 프로젝트에서 SLF4J와 Logback을 사용하려면 호환되는 버전의 org.slf4j:slf4j-api 의존성과 ch.qos.logback:logback-classic provider를 추가하세요. 후자가 SLF4J API에 Logback 구현을 제공합니다. 버전은 프로젝트의 의존성 관리 방식에 따라 선택하세요. 이전 예제의 버전은 더 이상 적절하지 않을 수 있으므로, 여기서는 특정 버전 조합을 최신이라고 표시하지 않습니다.
Java 클래스에서 private static final Logger logger = LoggerFactory.getLogger(MyClass.class);를 선언하고 logger.info("Service started"), logger.warn("Retrying request"), logger.error("Request failed", exception) 같은 호출로 메시지를 기록할 수 있습니다. 마지막 호출처럼 예외를 함께 전달하면 구현체가 스택 추적을 기록할 수 있습니다. 런타임 클래스 경로에 Logback이 있으면 provider가 설정에 따라 호출을 처리합니다. 예를 들어 콘솔 설정에서는 INFO MyClass - Service started처럼 표시될 수 있습니다. 이는 형식을 보여 주는 예시이며 관찰된 실행 결과가 아닙니다. 실제 로그 수준, 형식, 출력 위치는 Logback 설정에 따라 달라집니다. 애플리케이션 코드가 SLF4J를 사용하면 파사드를 사용하는 코드에 미치는 영향을 줄이면서 provider를 변경할 수 있습니다.
결론
간단한 프로그램에서 콘솔에 결과를 바로 보여 주려면 System.out.println을 사용하세요. 심각도별 로그 수준, 설정, 선택 가능한 출력 위치가 필요한 애플리케이션에는 Log4j나 Logback 같은 로깅 구현체가 적합합니다. java.util.logging은 Java 표준 라이브러리에서 사용할 수 있고, SLF4J는 애플리케이션 코드를 Logback 같은 provider에 연결하는 파사드입니다.
자주 묻는 질문
Java에서 로깅은 어떤 용도로 사용하나요? 로깅은 애플리케이션의 동작을 파악하고, 문제를 진단하며, 운영 상태를 살피는 데 도움이 되는 이벤트를 기록합니다. 로그 메시지에 비밀 정보나 그 밖의 민감한 값을 남기지 마세요.
로그 수준은 어떤 도움이 되나요? debug, info, warn, error 같은 수준을 사용하면 진단에 필요한 세부 정보와 주목할 이벤트, 실패를 구분할 수 있습니다. 설정에서 기준 수준을 정해 어떤 로그를 내보낼지 제어할 수 있습니다.
애플리케이션 하나에서 여러 로깅 프레임워크를 사용할 수 있나요? 여러 로깅 시스템이나 브리지를 포함할 수는 있지만 설정이 늘어나고 같은 메시지가 중복 출력될 수 있습니다. 의존성이 다른 로깅 API를 사용한다면 하나의 백엔드와 필요한 브리지를 명확하게 선택하는 편이 좋습니다.
SLF4J 자체가 로깅 백엔드인가요? 아닙니다. SLF4J는 파사드입니다. 파사드를 통해 호출한 로그를 실제로 처리하려면 Logback 같은 호환 provider를 추가해야 합니다.
System.out.println 대신 프레임워크를 선택해야 하는 때는 언제인가요? 수준별 필터링, 설정을 통한 출력 위치나 형식 변경, 애플리케이션 구성 요소 전체의 일관된 로그 관리가 필요할 때 프레임워크를 선택하세요. 짧은 프로그램이나 결과 하나를 눈에 보이게 출력하는 경우에는 대개 System.out.println이면 충분합니다.