nodejs 는 파일을 읽고 쓰기 위해 동기와 비동기 두 가지 형태의 함수를 제공합니다. 이벤트 방식의 비동기를 지향하기 때문에 비동기 방식의 파일 읽고 쓰기가 default 입니다.
이 포스팅에서는 url 모듈을 사용하여 요청된 자원이 파일인 경우 해당 파일을 읽어 클라이언트에 전달하는 예제를 실행해보겠습니다.
1. 파일 읽기
file_read.js 파일을 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
// 1. fs (파일시스템) 모듈 사용varfs=require('fs');// 2. 비동기 방식의 파일 읽기// - 파일을 읽은 후 마지막 파라미터에 넘긴 callback 함수가 호출fs.readFile('module_example.js','utf-8',function(error,data){console.log('01 readAsync : %s',data);});// 3. 동기 방식의 파일 읽기// - 파일을 읽은 후 data 변수에 저장vardata=fs.readFileSync('module_example.js','utf-8');console.log('02 readSync : %s',data);
1번의 readFile() 함수는 비동기방식으로 파일을 읽는 함수가 다른 thread 에 의해 실행되기 때문에 2번 readFileSync() 함수가 먼저 처리됩니다.
varfs=require('fs');// 1. 새로 생성할 파일에 입력될 문자열vardata="File Write Test";// 2. 비동기 방식으로 파일을 생성// - 파라미터 : 파일명, 입력데이터, 인코딩, 콜백함수fs.writeFile('file01_async.txt',data,'utf-8',function(e){if(e){// 3. 파일 생성 중 오류가 발생한 경우 콘솔에 오류 출력console.log(e);}else{// 4. 파일 생성 중 오류가 없다면 완료 문자열 출력console.log('01 WRITE DONE!');}});// 5. 동기 방식은 callback 함수를 통한 오류 처리를 할 수 없기 때문에// 함수 전체를 try 문으로 예외처리try{// 6. 동기 방식으로 파일 생성// - 파라미터 : 파일명, 입력데이터, 인코딩fs.writeFileSync('file02_sync.txt',data,'utf-8');console.log('02 WRITE DONE!');}catch(e){console.log(e);}
파일 읽기와 마찬가지로 동기방식인 2번 함수의 로그가 먼저 출력됩니다.
텍스트 파일을 열면 data 변수에 지정한 문자열이 입력되어 있는 것을 확인할 수 있습니다.
3. 브라우저를 통한 파일 요청 처리
1) 요청 대상이 되는 html 파일을 작성합니다.
file_test.html
<!DOCTYPE html><html><head><metacharset="utf-8"><title>file test</title></head><body><h1>Hello</h1>
클라이언트에서 파일 요청 처리 예제 입니다. </br>
server_req_file.js 에서 처리합니다.
</body></html>
varhttp=require('http');varurl=require('url');varfs=require('fs');varserver=http.createServer(function(request,response){varparsedUrl=url.parse(request.url);varresource=parsedUrl.pathname;// 1. 요청된 자원이 /test 이면if(resource=='/test'){// 2. file_test.html 파일을 읽은 후fs.readFile('file_test.html','utf-8',function(error,data){// 2-1. 읽으면서 오류가 발생한 경우 오류 내용을 출력if(error){response.writeHead(500,{'Content-Type':'text/html'});response.end('500 Internal Server Error : '+error);}else{// 2-2. 오류 없이 정상적으로 읽기가 완료된 경우 파일의 내용을 클라이언트에 전달response.writeHead(200,{'Content-Type':'text/html'});response.end(data);}});}else{response.writeHead(404,{'Content-Type':'text/html'});response.end('404 Page Not Found');}});server.listen(9074,function(){console.log('Server is running...');})