목차

반응형

Nodejs의 기본 메모리 사이즈를 512MB 초과하면 자동으로 앱이 종료된다.

기본 메모리 사이즈를 늘리는 방법에 대해서 알아보자.

 

커맨드라인 환경에서는 node --max-old-space-size=12000 app.js 로 하면 된다.

숫자는 mb를 의미하는데 12000이면 대략 12GB의 메모리까지 허용하겠다는 의미다.

 

 

 

 

메모리를 늘려서 앱에 5.2GB의 메모리가 할당되어 있는 모습이다.

 

추가로 인텔리제이에서는 어떻게 설정하고 간단하게 실행하는지도 알아보자

 

우측 상단 Add Configuraiton

 

+ 클릭

 

Node.js 선택

 

우측과 같이 설정을 해주자.

NODE_OPTIONS=--max-old-space-size=1000

=뒤에 오는 숫자는 할당될 메모리다. 단위는 MB

 

 

만들어진 설정을 선택하고 시작하면된다.

 

 

Nodejs 메모리 관련 글

Nodejs - 메모리 JavaScript heap out of memory

Nodejs - 메모리 할당 사이즈 변경

Nodejs - 메모리 누수 확인

반응형
반응형

1. 오류

2. 해결방법

 

 

 

1. 오류

노드를 하다 보면 아래와 같은 오류를 만날 수 있다.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->


[26828:0000020CB062E7D0]   706683 ms: Scavenge 7849.4 (8214.7) -> 7839.2 (8214.7) MB, 556.0 / 0.0 ms  (average mu = 0.131, current mu = 0.014) allocation failure 
Writing Node.js report to file: report.20200214.173258.26828.0.001.json[26828:0000020CB062E7D0]   708430 ms: Scavenge 7851.5 (8214.7) -> 7842.8 (8215.7) MB, 1247.6 / 0.0 ms  (average mu = 0.131, current mu = 0.014) allocation failure 
[26828:0000020CB062E7D0]   708535 ms: Scavenge 7855.6 (8215.7) -> 7846.4 (8218.7) MB, 32.1 / 0.0 ms  (average mu = 0.131, current mu = 0.014) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 00007FF742BAB21D]
Security context: 0x0314ac3808d1 <JSObject>
    1: /* anonymous */ [000002D987624109] [C:\Users\Desktop\project\node_modules\jsonparse\jsonparse.js:~127] [pc=000001C121A8459D](this=0x0314ac3b5539 <Parser map = 0000007B595C11A9>,0x02a34c9a8251 <Uint8Array map = 00000236682E5379>)
    2: /* anonymous */ [00000314AC3B0549] [C:\Users\Desktop\project\node_modules\JSONStream\inde...


Node.js report completed
 1: 00007FF741FAF22F napi_wrap+125087
 2: 00007FF741F4FAA6 public: bool __cdecl v8::base::CPU::has_sse(void)const __ptr64+35302
 3: 00007FF741F50776 public: bool __cdecl v8::base::CPU::has_sse(void)const __ptr64+38582
 4: 00007FF742767D4E private: void __cdecl v8::Isolate::ReportExternalAllocationLimitReached(void) __ptr64+94
 5: 00007FF742750371 public: class v8::SharedArrayBuffer::Contents __cdecl v8::SharedArrayBuffer::Externalize(void) __ptr64+833
 6: 00007FF74261BDEC public: static void __cdecl v8::internal::Heap::EphemeronKeyWriteBarrierFromCode(unsigned __int64,unsigned __int64,class v8::internal::Isolate * __ptr64)+1436
 7: 00007FF742627040 public: void __cdecl v8::internal::Heap::ProtectUnprotectedMemoryChunks(void) __ptr64+1312
 8: 00007FF742623B64 public: static bool __cdecl v8::internal::Heap::PageFlagsAreConsistent(class v8::internal::HeapObject)+3204
 9: 00007FF742619373 public: bool __cdecl v8::internal::Heap::CollectGarbage(enum v8::internal::AllocationSpace,enum v8::internal::GarbageCollectionReason,enum v8::GCCallbackFlags) __ptr64+1283
10: 00007FF7426179E4 public: void __cdecl v8::internal::Heap::AddRetainedMap(class v8::internal::Handle<class v8::internal::Map>) __ptr64+2452
11: 00007FF742638C7D public: class v8::internal::Handle<class v8::internal::HeapObject> __cdecl v8::internal::Factory::NewFillerObject(int,bool,enum v8::internal::AllocationType,enum v8::internal::AllocationOrigin) __ptr64+61
12: 00007FF74239CF71 public: class v8::internal::interpreter::JumpTableTargetOffsets::iterator & __ptr64 __cdecl v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=(class v8::internal::interpreter::JumpTableTargetOffsets::iterator && __ptr64) __ptr64+1681
13: 00007FF742BAB21D public: virtual bool __cdecl v8::internal::SetupIsolateDelegate::SetupHeap(class v8::internal::Heap * __ptr64) __ptr64+544781
14: 000001C121A8459D 

Process finished with exit code 134

궁금할 것도 없이 과도한 메모리 점유로 인하여 js 엔진이 폭발해버린 것이다.

 

 

노드를 돌리고 있는데 노드의 메모리가 엄청나게 올라간다.

아니 도대체 뭘하길래 저렇게 올라가느냐...?

내가 하고 있는 작업은 10GB 정도 되는 json 데이터를 stream pipe로 가져와서 읽는 작업을 한다.

개발 초기단계에는 몰랐지만 두곳에서 엄청난 메모리 누수가 발생하고 있어서 데이터를 읽을수록 메모리 점유가 계속해서 올라가는 문제가 있었다.

 

노드의 기본 메모리 사이즈는 512MB다.

 

 

 

2. 해결방법

근본적인 생각해볼만한 것은 두 가지가 있다.

1. 더 큰 메모리 할당

2. 앱 메모리 누수 개선

 

1번의 경우 노드 옵션 설정이기 때문에 정말 간단하다.

정말 어려운 것은 2번이다. 노드가 어디에서 메모리 누수가 일어나는지 확인하는 것이 여간 쉽지 않고 어디 나와있지도 않은 부분이다.

앱 메모리 누수를 개선하는 방법에 초점을 맞춰 글을 써 나가도록 하겠다.

 

 

 

Nodejs 메모리 관련 글

Nodejs - 메모리 JavaScript heap out of memory

Nodejs - 메모리 할당 사이즈 변경

Nodejs - 메모리 누수 확인

반응형
반응형

노드에서 파이어베이스 실시간 DB를 사용하려고 하면 

아래 코드에서 오류가 발생한다.

var db = admin.database();

찾아보니 파이어베이스의 컴포넌트가 제대로 설치가 안돼서 그렇다고 한다.

 

프로젝트에서 아래 명령어로 라이브러리 설치를 해주면 해결된다.

npm install --save @firebase/app

 

출처

https://github.com/firebase/firebase-admin-node/issues/722

반응형
반응형

vue를 사용하고자 이것저것 찾아보았다.


인터넷에서 흔히들 올린 vue 사용방법은 아래 사진처럼 node 서버를 사용하는데 서버의 API를 독자적으로 호출해서 데이터를 받아와야한다.


http://vuejs.kr/2017/02/05/express-with-vue/

잘못됐다는게 아니라 아니라 걍 내가 불편하다는거임 ;;



하지만 ejs 형식을 자주 쓰던 나는 이 방식이 정말 맘에 안들었다.

아니 서버 요청을 하는데 페이지에다가 데이터를 한번에 넣어주면 안되나?


그래서 인터넷에서 찾아보니 express-vue 라는 npm은 내가 원하는 방식으로 vue 페이지에 데이터를 넣어주는 방식이어서 사용하기로 마음먹었다. - 사용하려는 과정에서 삽질을 많이 하였다.

express-vue

express-vue 샘플앱


얼마나 간편한가 ejs와 비슷하다.


express-vue를 사용하기 위한 소스를 첨부하겠다.

먼저 npm을 설치한다

$ npm install --save express-vue


var express = require("express");
var app = express();
var expressVue = require("express-vue");
const vueOptions = {
VUE_DEV: true,
rootPath: path.join(__dirname, '/views')
};
const expressVueMiddleware = expressVue.init(vueOptions);
app.use(expressVueMiddleware);

express-vue를 세팅한다.


vue파일을 위치시켜야한다.

본인같은 경우는 root폴더 아래에 views라는 폴더를 만들어서 vue파일을 넣었다.


router.get('/user_list', function (req, res) {
util.basicLog(logger, req);
user.user_list2().then(function (result) {
if (!util.checkNull(result)) {
const data = {resultList: result, length: result.length, title: "제목"};
res.renderVue("admin/user_list.vue", data);
}
else util.return(res, "F", "일치하는 데이터가 없습니다.");
})
});

renderVue를 사용하여 return하고자 하는 vue 페이지와 데이터를 넣어준다.


node서버에 vue 파일이 존재하면 서버를 시작할때마다 vue파일을 미리 읽어오는 작업을 한다.

Preached -> vue 파일이름

이 메시지를 통해서 본인의 vue파일이 올라갔는지 확인 할 수 있다.


express-vue를 사용하면서

여기서 두 가지 에러가 났었다.

1. vue 파일 컴파일?오류

Error: render function or template not defined in component: anonymous

원래 vue를 사용하려면 Vue 객체를 생성한 뒤 사용해야 하지만

이 express-vue는 anonymous 컴포넌트를 사용하여 vue를 사용하는 것 같다.

(나도 anonymous 컴포넌트가 뭔지 잘 모른다.)

어떻게 고칠지 찾아보다가 express-vue에서 제공하는 starter 샘플을 봐서 고쳤다.

vue 소스에서 반드시 선언해야하는 부분이 선언되지 않아서 그런것같다.

template과 module.exports 부분이 없어서 그렇다.

정상적으로 작동하는 vue 소스를 올리도록 하겠다.

<template>
<div>
<h1>{{title}}</h1>
<p><a href="/post">Click here for an example of a Post</a></p>
<p><a href="/todo">TodoMVC</a></p>
<button v-on:click="test">버튼</button>
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">Index</th>
<th scope="col">이름</th>
<th scope="col">이메일</th>
<th scope="col">가입여부</th>
</tr>
</thead>
<tbody>
<tr v-for="result in resultList ">
<th scope="row">{{result.id}}</th>
<td>{{result.name}}</td>
<td>{{result.email}}</td>
<td>{{result.use_at}}</td>
</tr>
</tbody>
</table>
</div>
</template>

<script>
module.exports = {
data: function () {
return {
title: ''
}
},
methods: {
test: function () {
console.log('hi');
}
}
}
</script>

data부분은 넣어주는 값이 없지만 단순히 data부분을 선언해주는 것 만으로도 express에서 넣어주었던 데이터를 받아오는 효과가 있는듯하다.

또한 methods는 여러분들이 생각하는 vue의 methods가 맞다 위의 버튼을 누르면 콘솔에 hi가 찍힌다.


2. vue 파일 경로 불일치

{"errno":-4058,"code":"ENOENT","syscall":"stat","path":"C:\\Users\\안지환\\Desktop\\WebstormProjects\\server_renewal\\views\\user_list.vue"}

위의 메시지는 renderVue를 하였으나 vue 파일을 찾지 못해서 발생하는 문제다.

상대경로를 적당히 조절해서 경로를 맞춰주도록 하자.


그밖에도 에러가 난다면 express-vue 샘플앱을 참고하면 좋을 것 같다.

반응형
반응형

링크 주소에서 tabNo라는 parameter의 값을 받아온다. (parameter가 1개뿐이어야함)

예시) http://ajh322.tistory.com?tabNo=5

  var tabNo = location.search.split('tabNo=')[1];


.float_wrap.tab_auto li에 selected 클래스를 줄 것인데, 이미 selected가 먹혀있을수도 있으니 일단 selected를 다 지워준다.

jQuery('.float_wrap.tab_auto li').each(function(child){

$(this).removeClass('selected');

})


li에 selected를 준다.

jQuery('.float_wrap.tab_auto li').eq(tabNo).addClass('selected');

반응형
반응형

CK에디터에서 XSS취약점을 이용하여 본문에 위와 같은 태그값을 전송하면


스크립트가 작동한다.


웹 브라우저 콘솔에서 CK에디터의 설정값을 봐보면 removeFormatTags라고 특정 태그의 값은 삭제해주는 기능이 있다.

저기다가 svg를 추가해주면 svg로 시작하는 구문은 작동안한다.


ckeditor.js파일에 가보면 removeFormatTags라는 부분이 있다.

이곳에 svg를 추가해주면 된다.

반응형
반응형

공공기관 사이트에서 CK에디터의 버전정보가 보이지 않도록 버전확인 기능을 삭제해달라고 요청이 왔다.


글을쓰는 지금 생각해보면 CK에디터로 해킹을 할정도의 생각이 있는 사람이면 어차피 자바스크립트단에서 CK에디터 객체에서 버전정보를 찾을 수 있을텐데 이게 뭔소용일까


여튼 저 ?버튼을 누르면


CK에디터의 버전정보를 확인 할 수 있다.


CK에디터를 불러오고나서 F12를 누르고 개발자도구 콘솔에 CKEDITOR.config.pluigins를 입력하면 ck에디터에서 활성화 되어있는 플러그인들이 나온다.

버전정보를 확인하는 기능도 about이라는 이름의 플러그인이다.


CK에디터 config에서 {name:'about'}이 부분을 지워준다.


그러면 버전정보 확인하는 부분이 없어졌다.


반응형
반응형

nodejs에서 vue를 사용할때 대부분의 예시나 튜토리얼은 꽤나 복잡하게 다뤘다.

특히 데이터를 넘길때 기존 express에서 render를 사용하여 데이터를 넘기는 것처럼 넘기지 않고 무조건 ajax와 비슷한 axios를 사용하여 데이터를 주고 받는 것을 보면서 불편함을 느꼈다.

않이;; 나는 그냥 데이터 최초로 넘겨주기만 할껀데 굳이 내가 axios를 써야하나?

render처럼 데이터를 초기에 넘겨주는 방식은 없나?



찾아보니 express-vue라는 npm이 있었다.



방식은 ejs에서 render를 통하여 데이터를 넘겨주는 방식과 비슷하다.


(ejs 렌더링 코드)




그냥 설명서에 나와있는대로 코드를 썼더니 

"Error: render function or template not defined in component: anonymous". 오류가 나면서 안된다.

해결방법을 찾으려고 했는데 정확한 원인도 모르고 해결방법도 별로 안나와있었다.

느낌상 템플릿쪽에서 나는 문제고 템플릿이 선언이 안되어 있어서 그런 것 같았다.


포기하려다가 express-vue 프로젝트의 example / starter라는 항목을 발견했다.(진작 발견했으면 편했을텐데...)



https://github.com/express-vue/express-vue-mvc-starter

express-vue의 프로젝트를 사용하는 방법에 대해서 알 수 있는 샘플 프로젝트이다.



프로젝트에서 app폴더 내에 main.vue를 까보면 아래와 같다.



나도 저렇게하면 되겠지? 하고 가져다가 썼다.



일단 페이지는 저런식으로 나와버리고 콘솔에서도 "Unexpected token export"라는 오류가 발생했다.

먼가 느낌상 코드상의 문제는 아니라고 생각이 들었다.

main.vue쪽에서 export부분이 es6용 코드를 es5에서 가져다가 써서 생긴 문제라고 생각이 들었다.




그래서 아래의 export 부분을 es5코드로 바꾸었다.


이후 잘 된다.

아무래도 불편하기도 하고 es6로 빨리 업그레이드를 해야할 것 같다.

반응형
반응형

참고로 사용하는 view는 ejs 방식입니다.


우리가 원하는 최종 결과무울~



스마트 에디터는 html과 php에 적합한 에디터인것같군요 어쩌면 node js를 위한 에디터가 따로 있을거라는 생각도 갑자기 듭니다만 일단 한번 해보겠습니다.


https://github.com/naver/smarteditor2

에서 네이버 스마트 에디터를 다운로드합니다.



스마트 에디터 프로젝트를 까보면 위와 같습니다.

workspace는 뭔지 모르겠군요 저는 빨리하고 잘꺼니까 그냥 용량이 큰 dist로 합니다.

dist는 제느낌상 distibution인것같군요.


그러면 설명서에 저 파일에 모든것이 담겨있다고 나와있는데 저 파일을 한번 크롬에다가 드래그해서 열어봅니다.


당연히 한번에 안되죠 쉬운게 세상에 어딨습니까


크롬 개발자도구에서 콘솔을 열어보니 저도모르겠습니다 알고싶지도않고

accessing a cross-origin frame. 문제인데 이건 크롬에서 보안상의 문제로 자주 겪어보았습니다.

IE에다가 드래그해서 html파일 열어보니 에디터가 잘만 생성되는군요.

저거는 서버에다가 적용시켜주면 없어지는 오류니까 쌩까고 지나가도록 하겠습니다.


아까 그 대빵 html파일을 까서 소스를 복사합니다.


node서버에 새로운 라우터를 팝니다.

그리고 ejs파일도 새로 만들어줘서 그곳에 html소스를 넣습니다.


그 모습은 다음과 같죠.

그리고 아까 만든 라우터로 이동하면~


당연히 안됩니다.

왜냐면 js파일과 각종 css파일들도 같이 불러와야하기 때문이죠.

콘솔을 한번 까봅니다.


어휴 점점 글쓰기가 싫어집니다.

저기서 가장 큰 문제는 js 파일들을 불러와야하는 것 이겠죠?



콘솔의 가장 위에서도 보면 huskyEZ크레이터 뭐시기 js파일이 없다는 문제가 뿜 뜨는군요.

일단 js파일들을 연결시켜줘봅시다.


dist폴더를 editor라는 폴더로 이름을 바꾸고 복사해서  node프로젝트의 public 폴더에 넣도록하겠습니다.


public 폴더에다가 넣어야지 마음껏 접근이 가능하니까요.

그리고 가장먼저 HuskyEZCreator.js 파일을 ejs내에서 public과 연결해줍니다. 

제 경로는 다음과 같았습니다. ../js/service/HuskyEZCreator.js


그러면 새로운 에러가 발생합니다.

SmartEditor2Skin.html을 불러올 수 없다는 것인데...


SmartEditor2Skin는 기본 경로가 위와 같은데 에러메시지 잘 참고해서 맞춰주도록 합시다.


저는 위처럼 했습니다.


고럼 에디터가 뿅 나타나는군요.


문제는 저 에디터에는 이미지를 업로드하는 기능이 없다.

흠... 이미지가 있는 에디터를 다시 찾아서 돌아오도록 하겠다.

반응형
반응형


서버단에서 이런 데이터들이 모여져있는곳에서 데이터를 정렬한다던가 데이터를 수정할때 미쳤다고 JQuery나 자바스크립트를 사용할 수 없다고 생각이 들었다.

언젠가는 Vue, React, Angular(얘는 좀 오바)를 사용해서 관리자 페이지를 구성해야겠다고 생각하고 있었다.

C#도 공부해야하는데 흠...

이러다가 정말 잡부가 되는건 아닌지... 걱정은 들지만 저기서 사용하려는 Vue는 익혀두면 정말 도움이 많이 될 것같다.

반응형