콘솔 로그로 디버깅하는 방법: 초급 개발자가 실무에서 바로 쓰는 로그 분석 가이드
개발을 시작한 지 얼마 안 됐을 때 가장 당황스러운 순간은, 코드가 “왜” 안 되는지 모를 때입니다.
에러 메시지가 쏟아지는데, 어디부터 읽어야 할지 모르겠고, IDE에서 빨간 줄이 그어진 곳만 멍하니 보게 되지요.
그런데 실무에서는 의외로 정답이 단순합니다.
콘솔 로그를 제대로 읽고 남기는 것이 디버깅의 절반 이상을 해결해 줍니다.
브레이크포인트 디버깅은 고급 기술이고, 상황에 따라 쓰기 어려운 경우가 많습니다.
반면 로그는 로컬, 테스트, 운영 어디서든 동일하게 사용하고, 흐름을 시간순으로 남길 수 있으며, 재현이 어려운 버그도 역추적할 수 있습니다.
이 글에서는 Java/Spring Boot 환경을 기준으로 하되, 어떤 언어에서도 적용 가능한 방식으로
콘솔 로그 디버깅의 핵심 원칙과 실전 패턴을 단계별로 정리해 드리겠습니다.

1. 로그는 “출력”이 아니라 “흐름 기록”입니다
초급 개발자분들이 가장 먼저 하는 디버깅은 보통 이런 형태입니다.System.out.println("여기까지 실행됨");
이 방법 자체가 나쁜 것은 아닙니다. 다만 이 출력은 “실행 여부”만 알려줄 뿐, 문제를 해결할 정보는 주지 못합니다.
좋은 로그는 “실행됨”이 아니라 다음을 기록해야 합니다.
1) 어떤 메서드에서
2) 어떤 입력값이 들어왔고
3) 어떤 조건을 통과했으며
4) 최종 결과가 무엇인지
즉 로그는 코드 흐름(Flow)을 타임라인으로 남기는 기술입니다.
이 관점이 잡히면 디버깅이 훨씬 단순해집니다.
2. 스택트레이스는 아래에서 위로 읽습니다
콘솔 로그의 꽃은 역시 스택트레이스(Stack Trace)입니다.
하지만 초급 개발자분들이 가장 많이 실수하는 부분이기도 합니다.
스택트레이스를 위에서 아래로 읽으면, 프레임워크 내부 호출까지 다 따라가느라 정작 핵심을 놓치게 됩니다.
반대로 아래에서 위로 읽으면 “근본 원인”이 바로 보입니다.
예를 들어 이런 로그를 보겠습니다.
Caused by: org.postgresql.util.PSQLException: ERROR: relation "users" does not exist
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
...
at com.example.demo.UserRepository.findAll(UserRepository.java:33)
... 74 more
여기서 중요한 건 단 두 줄입니다.
1) ERROR: relation "users" does not exist
→ users 테이블이 존재하지 않습니다. (DB 초기화/마이그레이션/오타 가능성)
2) UserRepository.findAll(UserRepository.java:33)
→ 사용자 코드에서 문제를 발생시킨 정확한 위치입니다.
즉, 스택트레이스는
“아래의 원인 → 위로 올라가며 호출 흐름 확인”
이 2단계로 읽으면 됩니다.
3. println 디버깅은 초급자에게 최고의 도구입니다
실무에서는 Logger(Slf4j/Logback)를 쓰는 게 정석이지만,
초급자분들이 원인을 빠르게 잡아야 할 때는 println이 훨씬 직관적입니다.
예시를 보겠습니다.
public void process(User user) {
System.out.println("[DEBUG] user=" + user);
System.out.println("[DEBUG] name=" + user.getName());
...
}
이렇게 “값을 바로 찍어보는 것”만으로도
null이 어디서 들어왔는지, 값이 언제 틀어지는지 빠르게 확인할 수 있습니다.
초급 유지보수 단계에서는
“빨리 확인 → 원인 찾기 → 다시 제거”
이 패턴이 속도와 정확도 모두에 좋습니다.
단, 기능이 안정화되면 println은 지우고 Logger로 바꿔야 합니다.

4. 디버깅의 본질은 “값의 흐름” 추적입니다
버그는 대부분 특정 줄이 틀려서 생기지 않습니다.
대부분은 “값이 예상과 다르게 흐른 결과”로 발생합니다.
예를 들어 아래 코드를 보겠습니다.
public int calculate(int a, int b) {
int sum = a + b;
int discount = getDiscount(sum);
int finalPrice = sum - discount;
return finalPrice;
}
결괏값이 이상하면, 아래처럼 흐름을 찍어봅니다.
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("sum=" + sum);
System.out.println("discount=" + discount);
System.out.println("finalPrice=" + finalPrice);
그러면 “언제부터 값이 어긋났는지”가 바로 보입니다.
즉 디버깅은 결국
“값이 정상 → 비정상으로 바뀐 지점 찾기”
이 한 줄로 요약됩니다.
5. 로그 레벨을 조정하면 디버깅 난이도가 확 내려갑니다
Spring Boot 기준으로 로그 레벨을 이해해 두면, 콘솔에서 훨씬 많은 정보를 안정적으로 얻을 수 있습니다.
일반적으로 다음 순서로 중요도가 올라갑니다.
ERROR → WARN → INFO → DEBUG → TRACE
초급 단계에서 꼭 기억할 것은 두 가지입니다.
- INFO: 서비스의 정상 흐름 확인용
- DEBUG: 변수 값이나 조건 흐름을 볼 때
디버깅이 필요한 구간만 DEBUG를 켜면 로그가 폭발하지도 않습니다.
logging:
level:
root: INFO
com.example.demo: DEBUG
이 설정만으로도 Spring 내부 동작, Security 필터 흐름, JPA 쿼리 발생 시점까지 훨씬 잘 보입니다.
6. 실무에서 자주 만나는 에러 패턴 5가지
로그를 많이 읽다 보면 “에러 패턴이 거의 반복된다”는 걸 느끼게 됩니다.
초급자분들이 가장 빨리 익혀야 할 대표 패턴은 아래 5개입니다.
6-1) NullPointerException
가장 흔한 오류입니다. “어디서 null이 들어왔는지”를 흐름으로 찾아야 합니다.
6-2) SQLSyntaxError / relation does not exist
테이블 미생성, 마이그레이션 누락, 혹은 오타가 원인입니다.
6-3) 400/404/500 API 오류
파라미터 불일치, DTO 검증 실패, 경로 설정 문제에서 대부분 발생합니다.
6-4) JSON deserialize 오류
JSON 구조와 DTO 구조가 안 맞을 때 나옵니다. 필드명, 타입을 비교해 보세요.
6-5) Failed to convert value / type mismatch
String → int 같은 타입 변환이 실패한 경우입니다. 입력값 로그가 핵심 단서입니다.
7. 가장 강력한 디버깅은 “재현 → 로그 → 수정 → 재확인”입니다
실무 개발자들이 공통으로 말하는 디버깅 원칙이 있습니다.
“문제를 재현할 수 있으면 이미 반은 해결한 것이다.”
재현이 되면, 로그 흐름을 남기고, 값이 어긋나는 시점을 찾고, 수정 후 다시 재현해서 확인하면 됩니다.
이 4단계를 습관처럼 돌릴 수 있으면 초급 개발자의 디버깅 능력은 확실히 빠르게 성장합니다.
8. 협업 가능한 로그를 남기는 습관
팀 개발에서는 “나만 알아보는 로그”는 도움이 되지 않습니다.
다음 규칙을 지키면 로그만으로도 협업이 쉬워집니다.
- 메서드 시작/끝을 명확히
- 입력값/핵심 결과값은 반드시 로그화
- 식별자(userId, orderId 등)를 남겨 흐름 연결
- 감정 로그 금지(“왜 안돼 ㅠㅠ”)
- 개인정보/비밀번호/토큰은 절대 출력 금지
이 습관은 단순 디버깅을 넘어 운영 안정성까지 올려줍니다.

9. 결론
콘솔 로그 디버깅은 초급 개발자가 가장 먼저 마스터해야 할 실무 기술입니다.
IDE 디버거보다 느슨해 보일 수 있지만, 실제 서비스 환경에서는 로그가 유일한 단서가 되는 경우가 훨씬 많습니다.
오늘 정리한 원칙만 기억하셔도 로그를 읽는 눈이 달라지고, 버그 해결 속도가 눈에 띄게 빨라질 겁니다.
다음 글에서는 크롬 개발자도구로 네트워크/요청 흐름을 분석하는 방법을 이어서 정리해드리겠습니다.
'개발자 기초 & 실무' 카테고리의 다른 글
| Chrome DevTools 디버깅 완벽 가이드: 콘솔·브레이크포인트·네트워크까지 실전 분석 (0) | 2025.11.27 |
|---|---|
| REST API 설계 원칙 — 효율적인 요청/응답 구조 만들기 실무 가이드 (0) | 2025.11.18 |
| Tomcat 로그 보는 법 — 서버 로그로 에러 추적하기 실무 가이드 (0) | 2025.11.15 |
| 크롬 개발자도구(DevTools) 완전 활용법 — 네트워크, 콘솔, 디버거까지 실무 가이드 (0) | 2025.11.14 |
| 콘솔 로그로 디버깅하기 — println에서 logback까지 실무 가이드 (0) | 2025.11.13 |