본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


기타

Node.js와 Java와의 서로다른 차이

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 30.

 

 

Node.js는 만들어진지 얼마 되지 않는 서버 언어로, 자바스크립트 문법을 바탕으로 개발되어있다.

2009년에 최초 버전이 탄생되어 2011년에 안정화버전이 발표되어 여러 곳에서 사용중이다.

Node.js로 구성된 서버의 특징은 단일 스레드만 사용하여 요청을 처리하며 응답속도가 빠른점이며, 자바스크립트처럼 이벤트 루프방식을 통해 해당 일을 수행하는 방식으로 된 점도 특징이라 할 수 있다.

이에반에 java로 이루어진 서버는 오래전부터 사용된 언어로, 1990년대부터 현재까지 사용중에 있다. 엄격한 문법체계가 특징이며 다른 인터프린터 언어와는 달리 컴파일언어인 점도 특징이라 할 수 있다. 또한 요청이 들어오면 스레드풀에서 스레드를 꺼내어 해당 일을 처리하게 구성되어있다.

Node.js를 사용하다 보면...스레드가 처리하는 부분과 이벤트 루프에서 처리되는 일로 구분되어져 있기 때문에..

자바 스타일로 Node.js를 코딩하다보면 뭔가 잘 안되고 순차적으로 실행되지 않는 경우를 자주 보게 된다.

* Case : 어떤 함수를 호출했는데 리턴값이 undefined나 null 등의 원치않는 결과가 나오는 경우

이러한 현상은 서로다른 동작방식에서 나오기 때문에 발생한다.

인터넷에는 이를 설명하는 수많은 자료가 있는데...도통 어려운 말로 써놓은게 대부분이라..이해가 잘 안된다.

그래도 간단하게 비교하여보면,

1. 자바는 들어온 요청을 스레드를 풀에서 꺼내서 요청된 내용을 순차적으로 실행한다.

2. Node.js는 들어온 요청을 단일 스레드가 처리하는데 순차적으로 진행되다 "이벤트가 일어난 부분"에서는 해당 작업을 이벤트루프에 쌓아두고 해결한다.

조금더 단순하게 풀어보면, Node.js가 개발자가 만든 코드를 순서대로 해석해서 처리하는중인데 해당 순서에서 이벤트가 발생하는 요소가 존재하면(특정라이브러리의 함수를 쓴다던지, 다른function으로 데이터를 전달하던지 등) 그 일을 대신해주는 이벤트 루프한테 전달해서 그 일은 이벤트 루프가 따로 수행하도록 한다는 의미정도가 될 것 같다. Node.js도 자바처럼 순차적으로 코드를 해석하지만 이벤트가 발생하는 부분에 도달하면 그일을 다른 녀석에게 전달하고 해당 이벤트가 끝나던지말던지 간에 다음 코드를 해석해 버린다.

간단한 예로 Mysql에 접속해서 정보를 가져오는 프로그램이 있다고 하면, 자바의 동작 방식은 아래 사진처럼 이루어 질 것이다.

 

자바는 단계별로 진행이 된다.

 

그런데..Node.js는 서버가 데이터베이스 관련된 일이 끝나지도 않았는데 이미 응답이 끝났다.

코드는 분명 결과조합 후 응답하라 했는데...기다리지도 않고 응답해 버리는 황당한경우가 종종 발생한다.

먼저 자바 관련된 샘플 소스코드로 살펴보면,

	@RequestMapping(value = "/list")  //사용자가 요청을 전달하면
	public ModelAndView list(@RequestParam  HashMap<Object, Object> param, 
    ModelAndView mv) {
		mv.addObject("list", dao.list(param));  //데이터베이스에서 결과를 가져와서
		mv.setViewName("/list");  
		return mv;  //다시 사용자한테 응답한다.
	}

위 소스코드 스타일은 자바에서는 당연히 응답값이 있는 코드이다.

요청을받아서, 데이터베이스에 조회할때 까지 서버는 기다리다가, 조회가 끝나면 결과를 리턴한다.

 

하지만, Node.js에서는 이런식으로 코딩하면 사용자는 데이터를 받을 수 없게 된다.

만약 위의 소스코드가 Node.js에서 실행된다면 "데이터베이스에서 결과를 가져와서" 라는 부분이 끝나기도 전에 응답을 해 버리기 때문이다. 왜냐하면 데이터베이스에 접속하는 이벤트가 발생했기 때문에 Node.js에서는 해당 이벤트를 다른녀석이 처리해주기 때문이다. 순차적으로 코드가 끝날때 까지 기다려주지 않는다.

 

다시말해, 순차적으로 일을하다가 "이벤트"가 발생하는 부분은 이벤트루프에게 전달하고 바로 다음일을 하기 때문에 해당 이벤트가 끝날 때 까지 기다려주지 않는 것이다.

이러한 방식은 서버는 빠른시간 내 응답과 동작을 가능하게 하는 장점이 있다.

반대로 단점은 무시(?)하고 지나쳐 버리기 때문에 따로 작업을 하지 않으면 원하는 결과를 받을 수 없게 된다.

이를 위해 Node.js에서는 Promise라는 기능을 통해 순차코딩이 가능하게 해 준다.

router.post('/getRequest', function (request, response) {  //getRequest라는 요청을 받아서
    db.query('select * from test where a = ?', ['b']).then((val)=>{//then을 만나면 기다린다.
        response.json({result:val});  //해당 db.query라는 함수 실행 후 응답한다.
    }).catch((error)=>{
        console.log(error);
        response.json({result:'FAIL'});
    });   
});

Promise를 사용하면 Node.js는 해당 이벤트가 끝날 때 까지 스레드가 기다려준다.

그리고 해당 일이 끝나면 then이라는 콜백함수를 통해 다음일을 진행하게 된다. (물론 async와 await라는 기능도 있다.)

 

자바에서의 코딩스타일은 순차적으로 작업해도 상관없지만, Node.js에서는 순차적인 것 보다는 이벤트 발생 여부에 따라 해당 이벤트를 무시하고 다음일을 할 지 아니면 해당 이벤트에 이어서 다음일을 할 지를 잘 보고 코딩 하여야 한다.

반응형

'기타' 카테고리의 다른 글

Visual studio 콘솔창 꺼짐 방지  (0) 2019.07.14
리눅스 레디스(Redis) 설치(바이너리 파일)  (0) 2019.07.12
이클립스 SVN, Git에서 커밋 제외(공유금지) 설정  (0) 2019.04.30
PSFTP 사용  (0) 2019.04.30
Firebase 저장소  (0) 2019.04.30
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글