반응형

이번 게시글은 지난 게시글 핵심노드 설명 1편에 이은 설명입니다.  아레 게시글 링크를 먼저 참고해 주세요.

【Node-RED #②】노드-레드! 핵심노드 설명 1편/ Core Node Description! #1

⑥  switch 노드

스위치노드는  입력으로 들어오는 메시지를 분석하여 설정한 조건에 따라 메시지의 출력 방향을 조절할 수 있는 기능을 제공합니다. 

예를 들어, 인젝트(inject)에서 "Dog"라는 메시를 설정하고 switch노드에서 목적상 여러 개의 출력을 설정하였을 때,  "Dog"라는 메시지와 동일한(==) 출력 노드로만 메시지를 보낼 수 있습니다.   즉 메시지에 일정한 규칙을 설정하여 Flow의 방향을 조절할 수 있습니다.

우선, 앞의 인젝트(inject)노드에서 "Dog"라는 메시지를 설정함.

여기서 만약 아래 이미지처럼, 처음 맞는 조건에서 더 이상의 하위 조건들을 검사하지 않고 종료할 수도 있는 옵션도 사용할 수 있습니다.


 검토할 수 있는 조건의 종류는 아래와 같습니다.   인젝터에 있는 메시지 전체에 대해 판별하며, 일치할 경우 true값을 반환합니다.    

특히, JSONata를 지원하기 때문에, 좀 더 디테일하게 조건을 판별 처리할 수 있습니다. 
( JSONata는 JSON 데이터를 위한 경량 쿼리 및 변환 언어입니다. XPath 3.1의 '위치 경로' 시맨틱에서 영감을 받아 정교한 쿼리를 간결하고 직관적인 표기법으로 표현할 수 있습니다. 추출된 데이터를 조작하고 결합하기 위해 내장된 연산자 및 함수의 풍부한 보완이 제공되며 쿼리 결과는 친숙한 JSON 개체 및 배열 구문을 사용하여 모든 JSON 출력 구조로 형식화될 수 있습니다. 사용자 정의 함수를 생성하는 기능과 함께 고급 표현식을 구축하여 모든 JSON 쿼리 및 변환 작업을 처리할 수 있습니다.   참고 →  http://docs.jsonata.org/overview.html   )

⑦  Template 노드

템플릿 노드는 이름 그대로 원하는 형태로 본을 떠주는 노드라고 할 수 있는데요, 아래 예시를 참고해 보세요. 

예시 1)

이 경우, template의 속성은 아래처럼 되어 있습니다.  그리고, 전달할 내용(payload)을  {{  ...  }}  이중 괄호 묶어서 템플릿을 구성하면 됩니다. 

 

예시 2)

예시 3) 여기서 템플릿노드는 특정문자를 HTML 이스케이프 코드로 바꾸어 버리는 경우가 생기는데,  이럴 때는 {{ ... }} 이중 괄호가 아니라,  {{{ ... }}} 삼중 괄호를 사용해 주면 됩니다. 

아래 예시는 html에서 강조(bold) 태그인 <b> </b>를 사용한 메시지를 전달할 때 이중괄호와 삼중괄호를 비교한 예시이니 참고해 보세요.  

 

또한,  템플릿 노드에서는, HTML, JSON... 뿐 아니라,   mustache(머 스테치)라는 템플릿 문법을 지원하는데요, 머스테치는다양한 언어를 합쳐서 사용할 수 있는 하나의 템플릿 엔진으로,  Loop와 같은 로직 구문이 존재하지 않으므로, Logic-Less Templates라고 불리는 엔진입니다.  머스테치는 가장 심플한 템플릿 엔진 중 하나이며, 다양한 언어를 지원하기도 합니다. (C++, C#, PHP, Java, JavaScript, Python, Perl... 등 50여 개 이상 지원)

따라서 머스테치와 같은 템플릿 엔진을 사용한 템플릿 노드를 이용해서 사용자가 정의한 형태의 타입으로 메시지를 가공하는데 효과적으로 사용할 수 있는 노드입니다.  특히, HTML과 같은 웹페이지 출력 형태를 사용할 때 많이 사용하게 됩니다.   뒤에서 다루게 될 [http response] 노드와 함께, 웹으로 출력하는 것을 볼 수 있습니다. 

 

⑧ Complete 노드

노드들의 Flow에서,  어떤 노드들은 출력이 없는 노드들이 있습니다.  따라서 수행완료(처리)를 파악하는 것이 필요할 경우가 생기는데,  complete 노드는 이런 경우처럼 다른 노드의 메시지 처리가 완료되면 이를 체크할 수 있는 기능을 제공하는 노드입니다.   물론 출력이 있는 노드도 체크할 수 있습니다. 
아래 예시에서 보면,  Complete노드에서  "Hello World!" 메시지를 갖고 있는 인젝트(Inject) 노드의 출력 메시지를 감지하면 "debug 2"를 통해서 동일한 메시지를 출력할 수 있도록 하였습니다. 

 

물론 "debug 1" 메시지의 출력을 체크하여도 동일한 결과를 얻을 수 있습니다. 

다만 모든 노드가 이벤트를 발생시키는 것은 아니기 때문에,  Complete노드를 모든 노드에 적용할 수 있는 것은 아닙니다. 

⑨ Link in, out과  Link Call 노드

Link 노드는  플로우 화면에 배치된 노드와 플로우가 너무 복잡할 경우 실제 링크 연결을 대신하여, 즉 무선으로 연결시켜 줄 수 있는 역할을 하는 노드로서, 플로우를 간결하게 표현하는 데 사용할 수 있는 노드입니다. 

아래 예시를 보면, 인젝터에 있는 Hello world! 메시지와 Function 1의 메시지를 합친 출력을 "Link Out 1"노드 → "Link In 1"노드로 전달시켜 debug 1으로 출력시켜본 예제입니다. 

 

아래 "Link Out 1" 노드를 선택해 보면, 옵션에서 "Link In 1" 연결되었다는 표시를 볼 수 있습니다.

 

위와 같이 연결되기 위해서는 아래에 있는 Link Out노드와 Link In노드의 설정을 참고해 주세요.

 

또한 Link 노드를 아래 예시처럼 서부루틴 함수처럼 활용할 수도 있습니다.   (Link Call 함수 활용)

Link node의 옵션은 아래 이미지들을 참고하세요~

 

그리고 아래처럼, 여러 개의 Flow node에서 Link Call 하여 정말 서부루틴 함수 활용하듯 할 수 있습니다.

 

그리고 아래처럼, 플로우 화면 1과 화면 2로 나누어 좀 더 체계적으로 플로우노드를 구성할 수도 있습니다.

 

⑩  Catch 노드

Catch노드는 플로우에서 발생되는 에러를 감지하는 노드인데요,  모든 플로우를 설계하고서 어떤 예상치 못하는 에러가 발생하는 경우 의도적으로 에러를 발생시켜 플로우를 종료해야 되는 경우가 발생됩니다.  특히, 외부 서비스를 연동하거나 할 때 예를 들어, 외부 DB나 HTTP연동에서 응답이 없는 경우에 대한 처리를 해줄 필요가 있습니다.  이러한 경우 등에 catch 노드를 사용하여 대비하는 플로우를 짜는 것이 좋습니다. 

아래 이미지들은 Function 함수에서 에러를 발생시켜 이를 Catch노드에서 감지하도록 하여 에러 발생 내용을 debug 6 노드로 출력하도록 한 예시입니다. 

Function 노드 내용 :

var msg1 = { payload: "1" };
var msg2 = { payload: "2" };
var msg3 = { payload: "3" };

 

return [msg1, msg2, msg3];
 
function 노드에는 msg3에 대한 리턴이 없고 msg4로 잘못 리턴이 되어 에러가 발생하게 됩니다.

 

Catch노드에서는 에러를 체크할 노드로 "function 1"을 체크해 주세요.   물론 하나의 catch노드에서 플로우에 있는 여러 개의 노드를 동시에 에러 체크할 수 있습니다.

 

그리고 catch 노드와 연결된 메시지로 에러메시지를 출력하기 위해,  대상: msg.error.message  로 입력해 주세요.

 

에러가 나는 부분을 정상정으로 수정 후에는 아래처럼 정상 출력(작동) 되는 것을 볼 수 있습니다. 

 

그럼, 다음 게시글에서 핵심노드 설명 3편으로 이어가도록 하겠습니다.

감사합니다.

반응형