Node Express 백엔드 프로젝트 개발시 백엔드 소스에 대한 디버깅방법을 짧게 공유드립니다.
일반적으로 백엔드 시스템은  클라이언트/프론트엔드의 요청에 의해 적절히 웹페이지나 데이터를 처리하는등 사용자의 다양한 유형의 요청과 응답을 처리하기 위해
백엔드 시스템내 여러 계층(Layer)를 오가며 응답을 처리하기 떄문에 어플리케이션 버그나 에러가 발생시 그 원인을 빨리 찾고 해결할수 있는 방법을 알고 있어야합니다.

먼저 간단한 버그,에러,예외,디버거,디버깅에 대한 개념을 알아보고 노드 기반 백엔드 시스템에서 어떻게 에러를 잡는 행위,
즉 디버깅을 처리할수 있는지만 단계적으로 알아보도록 하겠습니다.

1) 버그,에러,예외,디버거,디버깅 개념 이해하기 

A) Bug:버그
프로그래밍에서의 에러(Error)나 문제(Problem)를 가리키는 말로 사용됩니다.
"버그"라는 용어는 1940년대에 처음 사용되었습니다.
그 당시, 컴퓨터는 아직 초기 단계에 있었고, 많은 문제가 발생했습니다.
그 중 하나는 기계에 실제 벌레가 들어가서 문제를 일으키는 경우를 말했는데 현대에 와서는 프로그래밍 에러의 원인을 버그라고 보통 말합니다.  

B) Error:에러
- 프로그램이 예상한 대로 동작하지 않을 때 발생하는 상황을 말합니다.
- 프로그램 에러는 크게 다음과 같이 분류할 수 있습니다:
- 이는 코드의 문제, 데이터 이슈, 환경 설정 문제 등 다양한 원인으로 발생할 수 있습니다.
ㄴ컴파일 에러(Compile-time Errors): 이는 프로그램이 컴파일되는 동안 발생하는 에러입니다. 예를 들어, 문법 오류, 타입 불일치, 미정의된 변수 사용 등이 있습니다.
ㄴ런타임 에러(Runtime Errors): 이는 프로그램이 실행되는 동안 발생하는 에러입니다. 예를 들어, 메모리 부족, 무한 루프, 배열의 범위를 벗어난 접근 등이 있습니다.
ㄴ논리 에러(Logical Errors): 이는 프로그램이 예상한 대로 동작하지 않는 경우를 말합니다. 코드는 컴파일되고 실행되지만, 예상한 결과를 얻지 못합니다. 
   예를 들어, 잘못된 알고리즘 또는 잘못된 계산 등이 있습니다.


C) Exception : 예외
-일반적으로 프로그램의 정상적인 흐름을 방해하는 이벤트를 말함
-이는 일반적으로 오류나 문제가 발생했을 때 발생합니다.
-예외는 프로그램이 예상한 대로 동작하지 않을 때 발생하며, 이는 코드의 문제, 데이터 이슈, 환경 설정 문제 등 다양한 원인으로 발생할 수 있습니다.
-예외 처리는 이러한 예외 상황을 프로그램이 적절하게 처리하도록 하는 메커니즘을 말합니다.
-예외 처리는 대부분의 현대 프로그래밍 언어에서 지원되며, 일반적으로 try/catch 문을 사용하여 구현됩니다

D) Debugger  : 디버거
-디버거는 프로그래밍에서 버그를 찾고 수정하는 데 사용되는 SW도구입니다.
- 디버거는 코드를 한 줄씩 실행하면서 변수의 값을 검사하고, 함수 호출을 추적하고, 조건부 실행을 설정하고, 프로그램의 실행을 중지하거나 재시작하는 등의 작업을 수행할 수 있습니다.

-디버거의 주요 기능은 다음과 같습니다:
ㄴ중단점 설정: 프로그램의 특정 지점에서 실행을 일시 중지할 수 있습니다. 이를 통해 해당 지점에서의 변수 값, 메모리 상태 등을 확인할 수 있습니다.
ㄴ단계별 실행: 프로그램을 한 줄씩 실행하면서 각 단계에서의 상태를 확인할 수 있습니다. 이를 통해 문제가 발생하는 정확한 지점을 찾을 수 있습니다.
ㄴ변수 및 표현식 검사: 프로그램의 실행 중에 변수의 값을 확인하거나 표현식을 평가할 수 있습니다.
ㄴ호출 스택 검사: 현재 함수가 어떤 함수에 의해 호출되었는지, 그리고 그 함수가 어떤 함수에 의해 호출되었는지 등을 확인할 수 있습니다. 
  이를 통해 프로그램의 실행 흐름을 이해할 수 있습니다.

E) Debugging : 디버깅
-디버거를 통해 버그를 찾고 수정하는 행위를 말합니다.


2) Node.js 기반 디버거 설정 및 디버깅하기

Node 백엔드 시스템 개발 시 VSCode 를 이용한 디버깅 기법에 대해 소개드립니다.


A) VSCode Node 디버거 설정하기
터미널  영역 우측   드롭다운 클릭 후 >  기본 프로필 선택 기본 터미널 프로필 선택 > JavaScript 디버그 터미널 선택



JavaScript 디버그 터미널 선택




B) VSCode 기본 디버거 설정 재 확인하기

모든 터미널 닫고 다시 터미널 오픈 시 기본 프로필로 Javascript Debug Terminal로 선택되어 터미널이 오픈 됨을 확인함


C) Javascript Debug Terminal 기반 디버깅하기
디버깅이 필요한 노드 모듈 소스 코드의 줄 번호 좌측 옆에 중단점(빨간 동그란점-중단점 breakpoint) 설정 후
어플리케이션 실행 시 해당 코드 위치에  실행 일시 멈춤(노란색) 확인 

node express 샘플 프로젝트의 routes\index.js 라우팅 모듈 파일을 오픈하고 

아래와 같이 디버깅 테스트를 위한 코드를 추가하고  코드라인 7번째줄에 왼쪽에 빨간색 중단점(Breakpoint)를 클릭하여 중단점을 설정합니다.
소스를 저장하고 프로젝트를 시작합니다.(npm start)


 -index.js 코드 소스 

/* GET home page. */
router.get('/', function(req, res, next) {

  console.log("디버깅을 시작합니다.");

  var clientIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

  console.log("클라이언트 IP주소: ",clientIp);

  var title = "페이지 제목입니다.";

  res.render('index', { title: title });
});


D)중단점 기반 디버깅 처리하기  
웹 브라우저에서 http://localhost:3000/  주소를 호출하면  VSCode 가 깜빡거리며 VS코드를 열어보면
해당 주소에 대한 사용자 요청과 응답을 처리하는 Index 컨트롤러(라우터의)의 해당 주소 라우팅 메소드가 호출되면서 중단점이 설정된 7번째 줄이 노란색으로 바뀌게 되고
사용자 요청이 해당 중단점 설정 지점에서 일시 중지됩니다. 

router.get('/', function(req, res, next) {

....
});


VSCode 의 해당소스 일시 멈춤(노란색)라인에서 해당 시점의 변수 상태 값등을 확인가능하며 다음 라인 코드 실행을 위해
F10 키(한줄씩이동), F11(함수단위이동), F5키 일괄실행등으로 소스를 이동해가며 프로세스 및 서버측에 전달된 값에 대해 확인 및  디버깅 작업이 가능합니다. 

에러 처리가 완료되었거나 데이터 흐름을 확인 완료했다면 반드시 중단점을 해제해줘야 사용자 요청/응답 프로세스가 원할히 진행되기떄문에
중단점을 통한 디버깅 작업이 완료되면 반드시 중단점을 해제하는것을 잊지 말기 바랍니다.

중단점 외에 백엔드 소스에서는 console.log() 를 이용해 터미널창에 서버측에서 확인하고 하는 데이터의 내용등을 로그로 출력해 간단한 디버깅 작업도 가능합니다.
console 객체는 Node Framework내 내장객체로 웹브라우저 개발자도구의 console.log()와는 별개의 객체입니다.

중단점은 여러개 설정이 가능하며 디버깅 상태에서 변수/객체등에 마우스를 올려보면 해당 변수/객체의 값을 바로 확인할수 있습니다.

Node.js 백엔드 개발시 사용할수 있는 기본적인 디버거와 디버깅 기법에 대해 알아보았습니다.
다음시간부터는 본격적으로 Node Express MVC패턴 기반  기본적인 라우팅 기법들에 대해 알아보겠습니다.

오늘도 함께해주셔서 감사드립니다.