참고문서
우선 API는 Application Programming Interface로 프로그램과 프로그램이 서로 상호작용 할 수 있도록 도와주는 매개체 입니다. 프로그램과 프로그램을 연결하는 다리 역할이라고 볼 수 있는데요 이 상호작용에는 사용 규칙이 있으며 API는 이를 제공하는 추상적인 개념입니다.
REST API는 REST 기반으로 서비스 API를 구현한 것입니다.
즉, HTTP 요청을 보낼 때, 어떤 URI에 어떤 메소드를 사용할지 개발자들 사이에 널리 지켜지는 약속입니다.
REST는 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일 입니다.
REST는
REST에는 6가지 특징이 있습니다.
REST API를 설계할 때 가장 중요한 항목은
useMemo와 useCallback은 React에서 사용하는 Hook 입니다.
먼저 "메모이제이션"에 대해 알아야 왜 이 두 Hooks를 사용하는지 이해할 수 있습니다.
메모이제이션이란 동일한 값을 반환하는 함수를 반복적으로 호출해야 한다면 맨 처음 계산된 값을 메모리에 저장해서 필요할 때마다 다시 계산하지 않고 메모리에서 값을 꺼내 쓰는 기법입니다.
기존에 수행한 연산의 결과값을 어딘가에 저장해두고 동일한 입력이 들어오면 재활용하는 프로그래밍 기법을 말합니다. 이는 중복 연산을 피해 메모리를 덜 쓰며 성능을 최적화할 수 있습니다.
또한 리액트의 특징으로 자신의 state, 부모로부터 받은 props가 변경되거나 부모 컴포넌트가 리렌더링 될 때 UI를 업데이트 합니다. 즉, 함수형 컴포넌트에서는 함수를 다시 호출하게 된다는 의미죠.
만약 복잡하거나 비용이 드는 코드를 포함한 불필요한 렌더링이 위의 특징으로 계속된다면 어떨까요? 리렌더링을 최대한 줄여야 하겠죠?
따라서 useMemo와 useCallback을 사용합니다.
useMemo는 메모이제이션 된 값을 반환합니다.
useMemo는 두개의 인자를 받습니다. 첫 번째로 callback 함수, 두 번째로 배열입니다.
callback 함수는 메모이제이션 할 값을 계산해서 리턴합니다. 두 번째 인자인 배열은 의존성 배열이며 배열 안에 요소의 값이 업데이트 될 때만 callback 함수를 다시 호출합니다. 메모이제이션된 값을 업데이트해서 다시 메모이제이션된 값을 반환합니다.
예를 들어, 쉬운 함수를 호출하여 state1을 업데이트 시키려고 합니다. 하지만 그 위에 복잡합 함수가 정의되어 있으며 state2를 업데이트 시킵니다. 쉬운 함수만 호출하고 싶어도 state1의 값이 바뀌기 때문에 함수형 컴포넌트의 모든 변수와 함수는 초기화됩니다. 따라서 복잡한 함수도 같이 초기화 되기 때문에 쉬운 함수만 호출한다고 해도 시간이 오래 걸리게 됩니다. 이때 복잡함 함수를 useMemo를 활용하여 작성하면 state2의 값이 업데이트 되기 전까지 복잡한 메모는 초기화 되지 않고 메모이제이션된 값을 가지고 있게 됩니다.
const value = useMemo(()=>{
return calculate();
},[item])
useCallback은 메모이제이션된 함수를 반환합니다.
인자로 전달한 callback 한 함수 자체를 메모이제이션 합니다. 함수가 필요할 때마다 새로 생성하는 것이 아니라 메모리에서 가져와서 재사용합니다.
const calculate = useCallback((num)=>{
return num + 1
},[item])
//calculate 안에는 callback 함수가 담긴다.
먼저 HTTP 특징에 대해서 이해해야 합니다.
HTTP는 클라이언트가 서버에 요청을 하면 서버에서 요청에 대한 응답을 하고 접속을 종료합니다. 통신이 끝나면 상태 정보를 유지하지 않기 때문에 자원 낭비가 줄어들지만 통신을 할 때마다 새로 연결을 하여 클라이언트는 그때마다 인증을 해야합니다. 로그인을 해도 페이지를 이동할 때마다 로그인을 계속해야 하는 불편함이 있습니다. 이렇게 로그인에 대한 정보를 브라우저에 저장하면 문제를 해결할 수 있습니다.
바로 브라우저 스토리지 입니다. 이는 정보를 저장하는 저장소이며 쿠키와 웹 스토리지가 있습니다.
쿠키와 웹 스토리지 모두 해당 도메인에 대한 데이터를 브라우저에 저장합니다.
쿠키는 서버가 클라이언트에게 전달하는 작은 데이터 파일입니다. 이름, 값, 도메인정보, 만료일자 등이 있습니다.
매번 서버에 전송이 되며 용량이 작고 보안이 취약합니다.
웹스토리지는 쿠키와 기능이 유사하지만 클라이언트에 저장만 할뿐 서버에 전송되지 않습니다. 키와 벨류 값의 형태로 데이터를 저장합니다.
웹 스토리지는 지속성에 따라 로컬 스토리지와 세션 스토리지로 나뉩니다.
로컬 스토리지는 브라우저 자체에 반영구적으로 데이터를 저장을 하고 브라우저가 종료되어도 데이터를 유지하고 있습니다.
세션 스토리지는 탭 윈도우 단위로 생성이 되며 탭 윈도우를 닫을 때 데이터를 삭제합니다.
자동 로그인 기능은 로컬 스토리지, 장바구니 구현은 세션 스토리지, 다시보지않기 팝업 창은 쿠키에 저장하면 됩니다.
세션은 일정 시간동안 같은 브라우저로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술입니다.
클라이언트가 Request 를 보내면 Response 에 Set-Cookie 를 통해 클라이언트의 유일한 ID값을 생성해 부여하고 이를 통해 사용자 정보는 안전한 서버에 존재하며 클라이언트와 서버 간에는 ID 값만을 전달해 보안 위협을 감소시켜 줍니다.
이 때 클라이언트에 저장되는 쿠키는 세션 종료 시 함께 소멸되는 "Memory Cookie" 타입을 가져 브라우저가 종료되면 세션과 관련된 쿠키도 삭제됩니다.
자바스크립트는 동기적으로 실행됩니다. 한번에 하나의 동작만 처리하는 싱글 스레드 방식이죠. 하지만 한번에 여러가지 일을 발생할 수 있는 비동기 방식을 처리할 수 있는 함수들이 있습니다. callback, promise, async, await 등이 그 예시 입니다.
callback은 특정함수에 매개변수로 전달된 함수를 의미합니다.즉, 나중에 호출될 함수들이라고 볼 수 있습니다.
callback 함수1을 실행하고 다음에 callback함수2를 수행하기 등을 작성하면 callback 지옥에 빠지게 됩니다. 가독성에 좋지 않죠.
따라서 promise 함수가 등장했습니다. then을 사용하여 어떤 함수가 끝나면 then, 이 함수를 실행하라는 약속을 하게 되는 거죠. 하지만 promise 또한 callback 지옥과 다를바가 없습니다. promise chainig으로 가독성이 떨어지죠.
기존 callback과 promise의 단점을 보완하기 위해 async, await가 등장했습니다.
우선 사용할 함수 앞에 async라는 키워드를 붙여 사용해야 하며 선언된 async 함수 안에서만 await 키워드를 사용할 수 있습니다.
먼저 함수의 앞에 async라는 예약어를 씁니다.그리고 해당 함수 내에서 비동기 처리 로직을 수행하는 메서드 앞에 await 예약어를 붙여줍니다.