개발 + 2
React Hooks - useState, useRef , useEffect

React hook

React hook 규칙

1. 반드시 컴포넌트 최상단에서 선언해야 한다.
2. ‘함수형’ 컴포넌트 내부에서만 호출해야 한다.

useState

가장 기본적인 훅이라고 할 수 있다.
리액트에서 컴포넌트를 만들면서 ‘상태’를 관리해야 하는 경우가 많다.

그냥 변수를 만들면 어떤 함수나 이벤트에 의해 값이 변경되었을 때, 화면에 바로 반영되지 않는다.
대신 useState를 사용하면 변수의 상태를 관리하고 상태가 변경되었을 때마다 재렌더링한다.

const [ state, state 변경 함수 ] = useState(초깃값)
setState = (state + 1)


이런 식으로 사용한다. 만든 state를 변경하고 싶으면 state를 직접 건드리는 것이 아니라 배열의 두번째 값인 state변경 함수를 사용해 변경해야 한다.

const [ name , setName ] = useState(“박초은“)
const [ age , setAge ] = useState(18)
const [ birth , setBirth ] = useState(0303)


하나의 컴포넌트에 여러 개의 useState를 사용하는 것이 나쁜 것은 아니지만 관련된 정보라면 하나의 객체로 표현할 수도 있다.

const [ human , setHuman ] = useState({
	name : “박초은“,
	age : 18,
	birth : 0303,
});


이렇게 하면 name, age, birth를 각각 관리하는 것이 아니라 human에 접근해서 한번만 변경해주면 된다.

하지만 객체로 state를 이용하면 useState가 새로운 객체로 바꾸기 때문에 기존 객체를 spread문법으로 가져온 다음 변경해야 한다.
왜냐하면 js에서 배열, 객체 등은 변수에 값을 저장하는 것이 아니라 값이 저장된 메모리의 주소를 저장하기 때문에 값이 같아도 저장된 공간이 다르면 다른 변수라고 인식하기 때문이다.

setHuman({
	…human,
	name : ”김철수“,
	age : 35,
	birth : 1225,
});


자바스크립트 es6 에서는 비구조화 할당이라는 것이 있는데, 이를 활용해 state 와 변경 함수를 배열에 쓰지 않고 변수처럼 사용할 수 있다.

const numberState = useState(0);
const number = numberState[0];
const setNumber = numberState[1];

const onIncrease = () => {
	setNumberr(preNum => preNum + 1);
}


useRef

함수형 컴포넌트를 사용할 때 useState를 쓰면 state가 변경될 때마다 컴포넌트가 재렌더링 되면서 컴포넌트 내부 함수나 변수가 전부 초기화된다. 이를 방지하기 위해 useRef를 사용하는 게 성능 향상에 더 좋을 때가 있다.
즉, 컴포넌트가 계속 렌더링 되어도 컴포넌트가 언마운트되기 전까지 값을 그대로 유지한다.
그래서 useRef는 어떤 값의 변화를 감지해야 하지만 변화했을 때 렌더링을 발생시키면 안되는 경우 사용하면 좋다.

const number = useRef(1)


변수명과 초기값을 설정하면 결과값으로 { current : 초기값 } 이라는 객체가 반환된다.
따라서 변수의 값을 변경하기 위해서는 number.current.value에 접근해야 한다.
current 속성에 접근해 값을 변경해도 state를 변경했을 때처럼 컴포넌트가 재렌더링 되지 않는다.

cosnt inputRef = useRef(null)

useEffect(() => {
	inputRef.current.focus()
}, []);

<input ref={inputRef} />

useRef를 이용해서 요소에 접근해 더 편리한 기능을 구현할 수도 있다.
input 요소에 inputRef로 접근한 다음 useEffect로 컴포넌트가 마운트되었을 때 input 요소를 클릭하지 않아도 focus가 되어있도록 할 수 있다.

const [ count, setCount ] = useState(0)
const number = useRef(0)

function increaseState() {
	setCount(count + 1);
	console.log(“state는“, count);
}

function increaseRef() {
	++number.current;
	console.log(“ref는“, number);
}

return (
	<div>
		<p>{count}</p>
		<button onClick={increaseState}>State 증가</button>
		<p>{number}</p>
		<button onClick={increaseRef}>Ref 증가</button>
	</div>
);


위와 같은 컴포넌트를 만들어보면 state 와 ref 의 차이를 알기 쉽다.
버튼으로 state를 증가시키면 state가 변했기 때문에 컴포넌트를 다시 렌더링한다.
Ref를 증가시키면 콘솔에 찍히는 값은 변하지만 화면에 나타나는 숫자는 그대로이다. 이 상태에서 state를 증가시켜보면 재렌더링이 되면서 ref의 값도 화면에 반영되는데, 0으로 초기화되는 것이 아니라 마지막에 변화시킨 값이 그대로 나타난다. 그리고 state를 계속 증가시켜도 ref의 값이 변하지 않는다.

useEffect

리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 Hook 이다.
리액트에서 컴포넌트는 생성(mounting) -> 업데이트(updating) -> 제거(unmounting) 의 생애주기를 갖는다.
useEffect는 컴포넌트가 mount 됐을 때, unmount 됐을 때, update 됐을 때 실행할 수 있다.

useEffect(() => {
	//실행할 기능
}, []);


useEffect 는 첫번째 인자로 콜백 함수를 받고 두번째 인자로 Dependency Array 라고 하는 의존성 배열을 받는다.
의존성 배열에 들어가는 값이 변경될 때만 실행되게 설정하거나, 빈 배열을 넘기면 컴포넌트가 마운트 될 때 한 번만 실행한다. 의존성 배열이 없다면 컴포넌트가 재렌더링될 때마다 실행한다.

useEffect(() => {
	// 실행할 코드
	return () => {
		// 실행할코드
	}
}, []);


useEffect 내부에서 타이머 등 setInteval을 사용하거나 구독 처리 같은 작업을 실행한다면 더이상 타이머를 사용하지 않거나 구독을 해지할 때를 위한 코드를 작성해야 한다. cleanup function 이라고 하는데, useEffect 안에 return 뒤에 작성해 준다. 의존성 배열이 빈 배열이면 컴포넌트가 언마운트 될 때만 실행되고, 값이 있다면 그 값이 업데이트되기 직전에 실행한다.

useEffect 를 사용할 때 주의점은 useEffect 내에서 어떤 state를 변경한다면 useState는 state가 변경될 때마다 재렌더링이 되고, 컴포넌트가 새로 마운트 되었으므로 useEffect 가 실행된다. 그러면 useEffect 안에서 또 state가 변경되어 다시 렌더링이 되고 … 무한루프가 발생하기 때문에 꼭 의존성 배열을 넣어줘야 한다.

다음은 최적화 훅 써야지

데이터베이스 개념, 관리 시스템, 모델링

데이터베이스

데이터베이스 개념

특정 조직의 여러 사용자가 공유해 사용할 수 있도록 통합해서 저장한 운영 데이터의 집합

정보 시스템이란 조직 운영에 필요한 데이터를 수집해 저장했다가 의사 결정이 필요할 때 처리해 유용한 정보를 만들어주는 수단이다.

데이터베이스는 정보시스템 안에서 데이터를 저장하고 있다가 처리가 필요할 때 데이터를 제공하는 핵심 역할을 한다.

 

데이터베이스 정의

  • 공유 데이터 : 특정 조직의 여러 사용자가 함께 소유하고 이용할 수 있는 데이터
  • 통합 데이터 : 데이터의 중복을 최소화하고 통제가 가능한 중복만 허용하는 데이터
  • 저장 데이터 : 컴퓨터가 접근할 수 있는 매체에 저장된 데이터
  • 운영 데이터 : 조직을 운영하고 조직의 주요 기능을 수행하기 위해 지속적으로 유지해야 하는 데이터

 

데이터베이스 특징

  • 실시간 접근 가능 : 사용자의 데이터 요청에 실시간으로 응답
  • 계속 변화 : 데이터의 계속적인 삽입, 삭제, 수정을 통해 현재의 정확한 데이터 유지
  • 내용 기반 참조 : 데이터가 저장된 주소나 위치가 아닌 내용으로 참조
  • 동시 공유 : 서로 다른 데이터의 동시 사용과 같은 데이터의 동시 사용 지원

 

형태에 따른 데이터 분류

  • 정형 데이터 : 미리 정해진 구조가 있는 데이터      ex) 스프레드시트
  • 반정형 데이터 : 내용 안에 구조에 대한 설명이 있는 데이터      ex) HTML, JSON 문서
  • 비정형 데이터 : 정해진 구조가 없는 데이터      ex) 영상, 이미지, 음성

 

특성에 따른 데이터 분류

  • 범주형 데이터 : 종류를 나타내는 값
    •  명목형 데이터 : 서열이 없다.     ex) 성별, 거주지, 학과명
    •  순서형 데이터 : 서열이 있다.     ex) 학년, 학점, 회원 등급
  • 수치형 데이터 : 크기 비교와 연산이 가능한 값
    •  이산형 데이터 : 개수를 세어야 한다.     ex) 고객수, 판매량
    •  연속형 데이터 : 측정을 해야 한다.        ex) 키, 몸무게, 온도

 

데이터베이스 관리 시스템

파일 시스템 문제점

  • 같은 내용의 데이터가 여러 파일에 중복 저장된다.
  • 응용 프로그램이 데이터 파일에 종속적이다.
  • 데이터 파일에 대한 동시 공유, 보안 회복 기능이 부족하다.
  • 응용 프로그램을 개발하기 어렵다.

데이터베이스 관리 시스템

DataBase Management System을 줄여서 DBMS라고 한다.

데이터베이스에 접근하여 정의, 조작, 제어 등의 관리를 지원하는 소프트웨어이다.

데이터베이스에 적재된 데이터 작업을 수행하고, 데이터베이스를 보호하며, 보안을 제공한다.

기능

  • 구성(정의) : 데이터베이스에 저장될 자료의 구조와 응용프로그램이 이 구조를 이용하는 방식을 정의
  • 조작 : 사용자의 요구에 따라 데이터베이스에 접근해 저장된 자료를 검색, 갱신, 삽입, 삭제할 수 있도록 한다. 데이터 언어로 조작
  • 제어 : 사용자가 조작하려는 작업이 데이터 무결성을 파괴하지 않도록 요청을 제어. 사용자의 권한을 검사하여 보안을 유지하고, 동시 접근하여 처리 시 처리 결과가 항상 정확성을 유지하도록 한다.

장단점

장점 단점
데이터 중복 통제 가능 비용이 많이 든다.
데이터 독립성 확보 백업과 회복 방법이 복잡하다.
데이터 동시 공유 가능 중앙 집중 관릴로 인한 취약점 존재
데이터 보안 향상  
데이터 무결성 유지 가능
표준화 가능
장애 발생 시 회복 가능
응용 프로그램 개발 비용 감소

 

발전 과정

~ 1960년 : 파일 시스템

1960년~1세대 : 네트워크 dbms(노드와 간선으로 그래프 형태를 구성해 데이터베이스를 만들어낸다.), 계층 dbms(네트워크형보다 간단하게 트리 형태로만 표현)

1~2세대 : 관계 dbms(테이블 형태)

2~3세대 : 객체 dbms(객체 지향 프로그래밍에서 객체라는 개념을 데이터 베이스에 사용한 형태), 객체관계 dbms(관계형 데이터 모델에 객체 지향 개념을 도입)

3~4세대 : NoSQL dbms(데이터베이스가 주는 안정성과 일관성 유지의 장점을 포기하고, 비정형 데이터 처리에 초점), NewSQL dbms(NoSQL 이 관계형을 완전히 대체하지 못해 등장)

 

데이터베이스 시스템

데이터베이스 스키마, database schema

데이터베이스에서 데이터 구조와 표현법, 자료 간의 관계를 형식 언어로 정의한 것이다.

데이터베이스의 논리적인 구조를 표현하는 것으로, 데이터가 어떤 구조로 저장되는지 나타낸다.

 

  • 외부 스키마 : 사용자 관점의 스키마. 사용자 또는 프로그램 입장에서의 논리적 구조로 여러 개가 존재
  • 개념 스키마 : 사용자와 관리자 관점의 스키마. 실제로 어떤 데이터가 저장되었으며, 데이터 간의 관계는 어떻게 되는지를 정의하는 스키마로, 전체 관점으로 하나만 존재. 접근권한, 보안 및 무결성 등에 관한 정의를 포함
  • 내부 스키마 : 저장 장치와 데이터베이스 설계자 및 개발자 관점의 스키마. 개념 스키마를 물리적 장치에 구현하는 방법을 정의, 물리적 구조나 내부 레코드의 물리적 순서 등을 표현

스키마는 데이터베이스의 논리적 구조나 물리적 구조가 변해도 응용 프로그램과 데이터가 서로 영향을 주지 않고 종속되지 ㅇ낳도록 데이터 독립성을 보장한다.
  • 논리적 독립성 : 외부 스키마와 개념 스키마 사이의 독립성. 응용프로그램에 영향을 주지 않고 논리적 구조를 변경
  • 물리적 독립성 : 개념 스키마와 내부 스키마 사이의 독립성. 논리적 구조에 영향을 주지 않고 물리적 구조를 변경하고 관리

데이터베이스 사용자

  • 데이터베이스 관리자 : 데이터 언어인 DDL, DCL을 이용해 데이터베이스를 정의, 제어
    데이터베이스를 설계, 관리, 운용 및 통제하며 효율성과 경제적인 효용성을 높이기 위해 시스템 감시 및 성능 분석
  • 최종 사용자(일반 사용자) : 질의어(쿼리 언어)를 통해 데이터베이스 관리 시스템에 접근
    데이터 삽입, 삭제, 갱신, 검색 등의 목적으로 데이터베이스 관리 시스템 이용
  • 응용 프로그래머 : C, Visual Basic 같은 호스트 프로그래밍 언어에 DML을 삽입하여 데이터베이스에 접근
 

데이터 언어

  • 데이터 정의어(DDL) : 데이터베이스 구조, 데이터 형식, 접근 방식 등 데이터베이스를 구축하거나 수정할 목적으로 사용
    논리적 데이터 구조와 물리적 데이터 구조의 사상을 정의하고 데이터베이스 관리자나 설계자가 사용
    CREATE, DROP, ALTER 명령어
  • 데이터 조작어(DML) : 사용자가 데이터를 처리할 수 있게 해주는 도구로써 응용 프로그램과 dbms 간의 인터페이스 제공
    SELECT, INSERT, DELETE, UPDATE 명령어
  • 데이터 제어어(DCL) : 데이터 무결성, 보안 및 권한 제어, 회복 등을 하기 위한 언어
    데이터를 보호하고 관리하는 목적으로 사용
    COMMIT, ROLLBACK, GRANT, REVOKE 명령어

데이터 모델링

데이터 모델링

주어진 개념으로부터 논리적인 데이터 모델을 구성하는 작업으로, 일반적으로 이를 물리적인 데이터베이스 모델로 환원하여 사용자의 요구에 따라 특정 정보 시스템의 데이터베이스에 반영하는 작업을 포함한다.

데이터 모델

현실 세계의 정보들을 컴퓨터에 표현하기 위해 단순화, 추상화하여 체계적으로 표현한 개념적 모형

데이터, 데이터의 관계, 데이터의 의미 및 일관성, 제약 조건 등을 기술하기 위한 개념적 도구들로 구성

구성 요소 : 개체, 속성, 관계

종류 : 개념적 데이터 모델, 논리적 데이터 모델, 물리적 데이터 모델

  • 연산 : 데이터베이스에 저장된 실제 데이터를 처리하는 작업에 대한 명세로서 데이터베이스를 조작하는 기본 도구
  • 데이터 구조 : 논리적으로 표현된 개체 타입들 간의 관계로서 데이터 구조 및 정적 성질 표현
  • 제약조건 : 데이터베이스에 저장될 수 있는 실제 데이터의 논리적인 제약 조건

관계 데이터 모델

하나의 개체에 관한 데이터를 릴레이션 하나에 담아 데이터베이스에 저장

 

릴레이션의 열을 속성 또는 애트리뷰트(attribute)라고 부름

릴레이션의 행을 투플(tuple)이라 부름

속성 하나가 가질 수 있는 모든 값의 집합을 해당 속성의 도메인(domain)이라고 함
관계 데이터 모델에서는 속성 값으로 더는 분해할 수 없는 원자 값만 사용

하나의 릴레이션에서 투플의 전체 개수를 릴레이션의 카디널리티(cardinality)라고 함

myoskin