json에서 키값으로 접근하여 remove하고 싶을때가 생긴다.

왜 난 delete 문법을 모르고 지금까지

for문을 돌며 key값 뽑아내고 key값으로 다시 접근해서 remove하고 있던걸까...

 

단, 배열에서는 delete를 해도 해당 인덱스의 값이 empty로 되지만 배열의 길이는 그대로 3이다.

let json = {
    "key1" : "value1",
    "key2" : "value2",
    "key3" : "value3"
}


delete json["key1"];

console.log(json);
// {key2: "value2", key3: "value3"}
console.log(Object.keys(json).length);
// 2

//단, 배열에서는
let arr = [0,1,2]
delete arr[0]; 
console.log(arr) 
// [1,2]
console.log(arr.length) 
// 3

 

일반적인 컴포넌트 렌더링으로 변수(props)를 넘길때

<DashboardView param1={parameter}/>

 이런식으로 넘긴다.

<컴포넌트이름 파라미터이름={값}> 과 같은 형태 !!

그런데 Router 를통해 라우팅할때는 

<Route path="/admin/DashboardView" exact component={DashboardView} />

이런 형태로 component를 호출한다.
그럼 변수는 어떻게 넘긴단 말인가?

<Route path="/admin/DashboardView" exact component={() => <DashboardView param1={parameter} />}/>

이런식으로 넘기면 넘길 수 있다.

그리고 해당 컴포넌트에서는 

// DahboardVeiw.js
export default function DashboardView(props) {
	console.log(props.param1);
	render(<div>리액트 배워보자</div>)
}

이와 같이 기존 props를 전달받듯이 받으면 된다.

 

사내 신규 프로젝트를 맡게 되어 React를 사내 서비스에 최초 도입하고자 한다.

 

Front : React 

Back-End : SpringBoot

DB : HSQLDB

 


(node 및 npm 선행 설치는 필수이다.) 

 

설치

먼저 React를 시작하기 위해서는 

npx create-react-app react-todo

을 실행한다.

해당 명령어는 react를 바로 사용할 수 있도록 초기 설정을 모두 진행해준다.

 

명령어를 실행하고 잠시 기다리면

"your project name"
  README.md
  node_modules/
  package.json
  public/
    index.html
    favicon.ico
  src/
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg

과 같은 구조로 파일들이 생성될 것 이다.

README.md : React 앱에 대한 설명 파일

node_modules : npm install ~ 로 설치한 모듈들 모여있는 폴더

package.json : 프로젝트에 의존성 관리

 

index.html : 최초 로딩되는 html 파일 , 해당 파일의 <div id="root"></div> 주목!

index.js : ReactDOM.render(JSX 태그, document.getElementById("root") : 바로 위 설명한 root에 jsx 태그들이 렌더링 된다고생각하면 된다.

App.js : 보통 기본 react 프로젝트는 jsx 태그 내용에 <App></App>이 들어가 있을 것이다.

App.js의 파일 이름이 (정확히 말하면 import한 이름이) 태그 안에 들어간 것이다. 

즉 App.js는 하나의 컴포넌트이고, 이 컴포넌트가 사용된 것이다.

즉 App.js 의 내용이 root부분에 들어가(?) 렌더링 된다고 생각하면 된다.

 

컴포넌트

앞서 말한 컴포넌트에 대해 전문적인 글을 인용한뒤 필자의 설명을 붙이겠다.

 

컴포넌트는 우리가 UI를 독립적이고 재사용 가능하게 나눌 수 있게 해줍니다. 그리고 각각을 독립적으로 생각할 수 있게도 만들어줍니다. 
개념적으로, 컴포넌트는 자바스크립트 함수입니다. 컴포넌트는 임의의 props라 불리는 인풋을 받아서 화면에 무엇이 보여질지 기술(describing)하는 리액트 엘리먼트를 반환합니다.

 

무슨 말인지,, 너무 어렵다.

역시 개발자는 코드로 이야기해야 빠르지 않은가

바로 코드를 보자

import React from 'react';

function Hello() {
  return <div>안녕하세요</div>
}

export default Hello;

------------------------------------

import React from 'react';

class Hello extends Component {
  render() {
  	return <div>안녕하세요</div>
  }
}

export default App;

어찌됬건 React도 java script 이기때문에 js를 다뤄봤다면 익숙하면서도 이상한 문법을 볼 수 있을 것이다.

점선으로 구분된 두 코드는 동일한 코드이다. 

첫번째로 작성된 함수형 컴포넌트가 추천된다고하니 함수형으로 진행하겠다.

(함수형 컴포넌트 vs 클래스형 컴포넌트가 궁금하신 분들은 직접 검색을 해보시길..

기회가 되면 필자도 글을 통해 다뤄보겠다)

 

위와 같은 js 파일 하나가 하나의 컴포넌트가 되고,

앞서 index.js에서 <App></App> 으로 불러온 것 처럼

Hello.js를 임포트 후 <Hello></Hello>로 집어넣으면

Hello파일의 return 부분에 있는 태그가 렌더링 되는 것이다.

 

기초적인 리액트 시작 방법을 알아보았다.

다음 글에 계속

 

Javascript에서 JSON을 사용하다보면 key값이 아닌 index로 접근해야할 경우가 종종 생긴다.

필자는 JSON의 key값에 넘버링이 되어 있고, 특정 체크박스가 체크되면

해당 넘버링된 key값의 값을 바꾸어야 하는 상황이었다.

let JSON = {
        Rule1 : "N",
        Rule2 : "N",
        Rule3 : "N",
 };
 
 let index = [];
 for (let x in JSON) { 
 	index.push(x); 
 }
 index.sort(function (a, b) {
 	return a == b ? 0 : (a > b ? 1 : -1);
 });

for(let i = 0; i<3; i++){
	console.log(JSON[index[i]]);
}
		

javascript의 경우 ===와 ==라는 연산자가 존재한다. 

==는 Equal Operator이고,  ===는 Strict Equal Operator이다. 

 

기본

1004 == '1004'   // true를 리턴
1004 === '1004'  // false를 리턴

 

 

객체

var a = [1,2,3];   
var b = [1,2,3];   
a == b // false를 리턴
a === b // false를 리턴

배열(객체)의 경우 메모리 주소가 다르기 때문에 두경우 모두 false를 리턴한다.

(두 배열이 같은지 비교하기 위해서는 루프를 돌려 배열의 값이 같은지 확인하면 되려나?)

 

 

javascript에서는 type을 변수 생성시 type을 설정하지 않지만 (typescipt를 사용하는게 아니라면) 

=== 와 ==는 type까지 확인하는 엄격함의 차이라고 생각하면 될 듯 하다.

사내 솔루션 개발 중 실시간데이터와 DB에 쌓인 과거 데이터를 그래프 (chart)로 표현해야 하는 경우가 생겼다.

Highchart는 데이터를 series라는 배열에 넣어 차트를 그릴 수 있는 javascipt 라이브러리다.

 

사용법은 생각보다 간단하다. 미리 정의된 option 값들을 설정한뒤 코드 한줄이면 그래프를 알아서 그려준다.

 

예시를 보자.

let chartdata = (JSON.parse(data))['sensordataforchart'];    // data 는 ajax를 통해 서버에서 가져온 데이터이다.
if(chartdata.length==0){
	alert("No data");
	return ;
}
let seriesArr =[];
var arr = [];

for (let i = 0; i<chartdata.length;i++){
	if(!Number.isNaN(parseInt(chartdata[i].cnt_data))){
		arr.push([
			new Date(parseInt(chartdata[i].cnt_time)  ).getTime(),
			parseInt(chartdata[i].cnt_data)
		]);	
	}
}

let Options = {

        chart: {
        	zoomType: 'x',
        },
        plotOptions: {
        	series: {
        		dataLabels: {
        			enabled: false,       //y축의 값이 그래프에 표시될지 말지 설정
        		},
         	}
        },
        title: {
        	text: document.getElementsByName('listThingId')[0].innerText
        },

        xAxis: {
        	type: 'datetime',
        	//max : new Date()
        },
        tooltip: {
        	valueDecimals: 2,
        	crosshairs: true
        },

        series: [{
        	data: arr,
        	name:document.getElementsByName('listThingId')[0].innerText,
        	lineWidth: 0.5,
        }],

};

Highcharts.chart('collectiondataChrt',Options);    //collectiondataChrt는 html의 id값이다. 해당 id의 태그안에 그래프를 그린다.

필자의 경우 ajax 통신을 통해 서버에서 data를 가져와 해당 데이터를 처리하여 series에 넣어서 그래프를 그렸다.

option 안에 있는 series라는 배열은 그래프를 그릴 데이터가 들어가는데,

series 배열안에 json 형태로 데이터가 들어간다.

 

series 배열안에 data는 배열안에 y값만 들어가면 되는데, 필자의 경우 x값에 unixtimestamp를 함께 넣었다.

 

일반적인 series의 data =>  data : [ 10, 20, 30]

필자의 series의 data => data :  [[1607475599955,50] , [1607475599955, 60]]

 

option의 xAxis type이 'datetime'이므로 x축은 시간축이 되어 그려진다.

 

완성된 그래프는 아래와 같다.

 

Highchart에는 수많은 옵션들이 존재한다. 

필요에 따라 API 문서를 찾아보며 필요한 옵션들을 설정하면 상당히 그럴싸한 그래프를 그릴 수 있다.

 

다음 포스팅에서는 실시간으로 들어오는 데이터를 

addpoint라는 Highcart 펑션을 이용해 그려보는 내용을 다루겠다.

+ Recent posts