서버를 운영하기 위한 공부를 하던 도중에 자꾸 개념이 헷갈리거나 확실하게 숙지가 안되어 코드를 제대로 이해하기 힘들었다. 그래서 미숙한 개념들을 정리해보고 한다.
기본적으로 절대 경로
는 고유한 경로를 말한다. 만약 어떤 파일을 읽어오자고 한다면 맥을 기준으로 MacintoshHD/Users/unsnruu/Documents
이 되는 셈이다. 윈도는 C:\~
부터 시작하는 파일이 될 것이다.
상대 경로
는 그 파일이 위치한 곳을 기준으로 작동한다. 만약 상대경로로 어떤 파일을 읽어오자고 한다면, 읽어오기 위한 작동을 시작하는 지점이 상대경로의 출발지가 될 것이고 출발지/읽어오려는 파일
로 경로가 설정될 것이다.
절대 경로와 상대 경로에 대한 의문은 path에 속한 두 메서드, join
과 resolve
때문이었다.
join과 resolve에서 /(슬래시)
를 인수로 받았을 떄 다르게 작동한다.
만약 두 메서드에서 /가 존재하지 않는다면 상대경로를 기준으로 동일하게 작동한다.
Nodejs가 URL을 다루는 방식은 두 가지가 존재한다. 하나는 WHATWG
방식이고 다른 하나는 기존의 nodejs가 자체적으로 다루던 방식
이다. 기존 nodejs방식은 deprecated다고 한다. 다만 경우에 따라서는 nodejs 자체의 방식으로 쓰는 경우도 있다고 한다.
노드의 url 형식을 꼭 사용해야 하는 경우가 있습니다. host 부분 없이 pathname 부분만 오는 주소인 경우(예시: /book/bookList.apsx)에는 WHATWG 방식이 처리할 수 없습니다.
-알라딘 eBook <Node.js 교과서 개정2판> (조현영 지음) 중에서
WHATWG 방식은 search부분을 searchParams라는 특수한 객체로 반환하므로 유용하게 쓸 수 있다고 한다.
searchParam 객체는 JS의 맵 객체와 비슷한거 같은데 append라는 메서드를 사용하면 set과는 다르게 key값을 중복해서 사용이 가능한 듯 하다.
기존 노드에서는 searchParam 대신 querystring 모듈을 사용한다.
쿠키는 stateless한 http 통신에서 사용자의 정보를 저장하는 하나의 방법이다. 다만 보안상 취약한 부분이 있고 저장할 수 있는 정보의 한계가 있기 때문에 세션이 등장했다고 한다.
처음에 이해가 안되었던 부분은 쿠키와 세션이 아예 다른 것인가 하는 부분이었다. 쿠키는 클라이언트에게 세션은 서버에만 정보를 저장하는 것인가 하는 의문이 들었던 것이다.
차근히 들여다 본 결과, 세션은 서명된 쿠키인 id를 클라이언트에게 전달한다. 따라서 쿠키가 아예 쓰이지 않는 것은 아니다.
다만 클라이언트에게 부여한 id를 통해 사용자에 관한 정보나 설정을 서버 측에서 복원하므로 보다 정보량의 제한에서 자유롭고 보안의 안전성도 높다고 할 수 있다.
express-session
패키지는 req.session
객체 내부에 유저에 따라 정보를 유지하도록 돕는 패키지이자.
쿠키를 서명하는데 있어서 secret 값이 필요한다. 이때 cookie-parser
를 사용한다면 이와 동일하게 값을 설정하는 편이 좋다고 한다.
Express를 사용하면서도 req.body에 대체 뭐가 어떻게 들어가는 것인가 하는 의문이 있었다. 모르는 채로 일단 강의를 진행하다가 혼자서 서버를 다시 재현해보려하니 그제서야 body가 어떻게 생겼는지 모르겠다는 생각이 들었다.
express.json();
express.urlencoded({ extended:false});
너무 자연스럽게 사용했던 위의 구문이 사실 body-parser
이었다. 이 두 instruction은 미들웨어로서 form이나 ajax 요청의 데이터를 처리한다.
단 멀티파트 데이터는 처리하지 못하므로 이 때는 multer
를 사용하는 것을 추천했다.
express 4.16 이후로는 body-parser의 일부기능이 익스프레스에 내장되었다고 한다.
마찬가지로 cookier-parser의 경우 데이터를req.cookies 객체로 변환해주는 미들웨어이다.
express로 MySQL과 연결을 할 때, createConnection
메서드가 있는 한편, createPool
이 존재한다.
작동의 결과는 같은데 깃문서를 살펴보면 pool을 사용할 시에 미리 연결을 설정해 두어서 보다 빠르게 sql과의 상호작용이 일어나는 듯 싶다.