본문 바로가기
nodejs

[node.js] 비동기 프로그래밍

by jinbro 2017. 4. 12.

[목표]

- 동기 프로그래밍과 비동기 프로그래밍의 차이점을 알자
- 비동기 프로그래밍은 어떤 때에 사용하는 것이 좋은지 찾아보고 생각해보자
- nodejs는 비동기프로그래밍 하기가 쉬움을 느끼자
- nodejs api 문서를 보면서 api 사용하는 것에 익숙해지자
- 콜백함수란 무엇이고, 콜백함수 지옥 맛보기
- 앞으로 nodejs를 공부함에 있어서 어떤 것을 공부해야할지 생각해보기


[비동기프로그래밍이란]
- 영어로는 Asynchronous 
-  집안 일(빨래, 설거지, 청소)을 할 때 빨래 다하고 설거지 다하고 청소 하는 것, 순서대로 완료시키고 다음 넘어가는 것은 동기적인 것
- 빨래, 설거지, 청소 업체를 불러 동시에 처리하는 것, 하나가 완료됨과 상관없이 동시에 일을 처리하는 것을 비동기적인 것이라 함
- 일 처리완료의 순서가 상관없다면 비동기적으로 처리하면 됨
- 하나의 일처리에만 매달리는 것이 아니라 여러가지 일 처리를 동시에 할 수 있는 것이 특징, 백그라운드 상에서 일처리를 하고 있음


[동기적인 것과 비동기적인 것의 차이 느껴보기]
- nodejs가 제공하는 내장모듈 사용 : File System - 파일을 다루는 모듈(https://nodejs.org/dist/latest-v7.x/docs/api/fs.html)
- File System api 문서 내에서 메소드를 살펴보면 read()가 있고, readSync가 있음, 다른 메소드들도 마찬가지
=> 똑같은 메소드인데도 불구하고 어디선 sync가 있고 어디선 sync가 아닌게 있음
=> sync가 붙어있으면 동기적인 것이고, 붙어있지않으면 비동기적인 것
=> nodejs는 비동기적인 것을 추천함(공홈에서부터)

- 사용해보기 : 파일 읽기, 서버컴퓨터 내 특정디렉토리에 읽어올 파일을 만들어 놓아야함(vi로)

(1) 동기적
1-1) sync.js를 vi로 만듬
1-2) api 문서에 따라 참고해서 코드를 작성함 : sync는 sync가 아닌 메소드 사용방법을 참고하면됨(callback 함수만 빼주면됨)
1
2
3
4
5
var fs = require('fs')
console.log(1)
var data = fs.readFileSync('파일경로 및 파일이름', { encoding: 'utf-8' 여기는 옵션값 })
console.log(data) 
console.log(2)
cs

1-3) node 명령어로 파일을 동작시킴 : node sync.js

- 콘솔창에 앞서 작성한 파일의 내용이 나온다면 성공
- 또한 순서대로 처리될 것임, 1이 나오고 파일 내용 나오고 2가 나오는 순서
- 순서대로 출력되면 sync 적인 구현이 된 것

(2) 비동기적
1-1) async.js를 vi로 만듬
1-2) api 문서에 따라 참고해서 코드를 작성함 : readFile 메소드 참고
1
2
3
4
5
6
7
var fs = require('fs')
console.log(1)
var data = fs.readFile('파일경로 및 파일이름', { encoding: 'utf-8' 여기는 옵션값 }, function(err, data){
     //파일 읽기가 완료되었을 때 호출되는 함수(콜백함수라 함)
     console.log(data)      
})
console.log(2)
cs

1-3) node 명령어로 파일을 동작시킴 : node async.js

- 아까와 다른점이 있다면 콘솔창에 표시되는 순서가 1 - 2 - 파일 내용임
- 동기적으로 프로그래밍을 했다면 1을 표시하고 파일 읽기가 완료된 후 처리를 한 뒤 2가 표시되었을 것
- 간단히 말하면 동기적으로 처리했다면 순서대로 처리했을 것
- 내장 모듈의 비동기적 메소드를 사용하니 파일읽기는 시작만 해두고 다음 코드를 처리함
- 비동기적으로 처리를 하니 파일 읽기 처리를 해둔 채로 뒤의 코드를 실행함
- 파일 읽기가 완료되었을 때 미리 정의해둔 함수가 동작함 : 이때의 함수를 콜백함수라 함
- 콜백함수 매개변수 두가지 : 첫번째 - 에러났을 때 err 메세지를 포함한 객체, 두번째 - 콜백함수 호출 시 넘겨받는 실제 데이터(string)
- 각 모듈에서 사용하는 콜백함수에 따라 매개변수 자료형이나 개수가 다를 수 있음 : 공식 api 문서를 잘 활용할 것


[비동기프로그래밍의 단점]
- 비동기프로그래밍은 여러개를 실행시켜둔 뒤 완료되면 콜백함수(결과처리)가 실행되는 식임
- 비동기 처리를 남발한다면, 시스템 성능 저하.....
- 비동기 처리가 좋음에도 불구하고, 비동기 처리만을 쓰지않고 동기적 처리를 쓰는 이유가 있음
- 그걸 구분할 줄 아는 개발자


[계속해서 알아봐야할 것]
- V8 엔진 내부 동작
- nodejs 싱글쓰레드 기반 비동기 IO 처리
- 그리고 nodejs가 어떨 때 개발 환경으로 사용하기 좋은지 생각해보기


[참고자료]
(1) 생활코딩 동기와 비동기 프로그래밍 : https://opentutorials.org/course/2136/11884

(3) nodejs 장단점 : http://bcho.tistory.com/876



댓글