재귀는 특정 시점까지 자기 자신을 계속해서 호출하는데 주로, 반복문을 구현할 때 사용합니다.
for
문 이나while
문으로 구현 가능한 로직은 모두 재귀함수로 가능합니다. 이 때 현재 상태를 저장해야 할 경우 변수를 만들기 보단 상태를 재귀적으로 호출하면서 변경된 상태를 전달함으로써변수
의 수를 줄일 수 있습니다. 또한while
문이나for
문 같은 반복문을 사용하지 않아도 되기에 코드가 간결해집니다.
재귀를 활용하기 좋은 상황은 크게 두 가지가 있습니다.
- 첫 번째는 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우입니다.
예시로는 피보나치 수열의 n번째 수를 구하는 문제가 있습니다. 피보나치 수열의 n번째 수는 n-1번째 수와 n-2번
째 수를 합한 값입니다. 몇 번째 수를 구하든 동일한 구조의 작은 문제로 나눌 수 있는 구조인 것입니다. 이런 상황에서 재귀를 활용하면 간결한 코드로 문제를 해결할 수 있습니다.- 두 번째는 중첩된 반복문이 많거나 반복문의 중첩 횟수를 예측하기 어려운 경우입니다. 예시로는 객체를 문자열로 바꾸는 함수가 있습니다. 객체는 배열이나 객체도 담을 수 있으며, 얼마나 중첩되어 있을지 예측하기 어렵기 때문에 반복문을 사용하기에는 적합하지 않습니다. 이럴 때 재귀를 활용하면 가장 깊은곳에 있는 배열이나 객체까지 확인할 수 있습니다
UI
는 사용자가 서비스를 이용할 때 마주하게 되는 면입니다. 즉, 사용자가 서비스와 상호작용 할 수 있도록 만들어진 시각적인 디자인 매개체 입니다.UX
는 사용자 경험의 약자로, 사용자가 서비스를 직간접적으로 이용하면서 느끼는 종합적인 만족을 의미합니다. 따라서UX
디자인은 사용자에게 만족스러운 경험을 제공하는UI
를 디자인하는 것입니다.UI
는 ux를 포함합니다. 또한 좋은 ux가 좋은UI
를 의미하거나, 좋은UI
가 항상 좋은 ux를 보장하지는 않습니다. 하지만 나쁜UI
는 보통 나쁜 ux를 유발합니다.
프론트엔드 개발자는UI
를 개선 함으로써UX
를 개선할 수 있이며,UX
가 좋지 않은 곳에서UI
의 개선점을 찾아낼 수 있습니다.
Styled Components는 CSS 파일을 따로 작성할 필요 없이 컴포넌트 단위로 스타일 속성을 작성할 수 있게 해주는 라이브러리입니다.
CSS 파일을 따로 작성할 필요가 없기 때문에 크게 세 가지 장점을 느낄 수 있습니다.
- 첫째,
class
,id
이름을 짓느라 고민할 필요가 없습니다.CSS
파일을 따로 작성해야 할 때에는 스타일을 적용할 요소를 특정하기 위해서class
와id
를 작성해야 했습니다. 하지만Styled Components
를 사용하면CSS
코드가 작성된 컴포넌트가 곧 스타일을 적용할 컴포넌트이기 때문에class
와id
를 사용해서 요소를 특정하지 않아도 됩니다.- 둘째,
CSS
파일에서 제가 원하는 부분을 찾기위해 시간을 쓰거나 길어진CSS
파일을 쪼개서 관리할 필요가 없어졌습니다.Styled Components
를 사용하면 애초에CSS
파일을 작성할 필요가 없기 때문에CSS
파일을 관리할 필요도 없어졌습니다.- 셋째, 스타일 속성이 겹쳐서 제가 원하는 결과가 나오지 않는 일이 줄어들었습니다.
CSS
파일을 작성하다보면 같은 종류의 요소에 같은 종류의 스타일 속성을 작성하게 되는 일도 생겼고, 이럴 때에는 뒤에서 작성된 속성이 적용되면서 제가 의도한 바와는 다른 화면이 나오기도 했습니다. 하지만Styled Components
는 컴포넌트 단위로 스타일 속성을 작성하기 때문에 속성이 겹치는 일이없었습니다.
useRef
는 특정 요소의DOM
주소값을 가져오는React Hook
입니다.
React
는 가상DOM
을 사용해서SPA
를 구현하기 때문에,DOM
을 직접 조작하는 것은 React의 작동 방식과도 맞지 않고,
원하는 결과가 나오지 않을 수도 있기 때문에React
는 기본적으로DOM
에 직접 접근하는 것을 금지하고 있습니다.- 그럼에도
DOM
에 직접 접근해야하는 예외 상황들이 있습니다. 바로DOM
엘리먼트의 주소값을 활용해야 하는 경우로, 가장 대표적인 예시는 특정 요소에 포커스를 설정해야하는 상황이 있습니다.
이럴 때useRef
를 사용해서DOM
주소 값을 받아와 사용할 수 있습니다.- 하지만 앞서 말했듯
DOM
에 직접 접근하는 것은React
의 작동 방식과 맞지 않기 때문에, 이런 예외적인 상황을 제외하고는useRef
를 사용하거나DOM
에 직접 접근해서는 안 됩니다. "
Redux
와 같은 상태관리 라이브러리는 전역 상태 저장소를 제공해줍니다.
- 기존의
React
에서는 자식 컴포넌트에props
를 내려줘서 상태를 전달해줬습니다. 이 경우에는 해당 상태를 사용하지 않는 컴포넌트들도 오로지 상태를 전달해주기 위해서props를 받아야 했고, 이를props drilling
이라고 합니다.- 상태 관리 라이브러리는 전역 상태 저장소를 제공해줌으로써
이props drilling
문제를 해결해줍니다. 전역 상태 저장소가 있다면props
를 내려줄 필요없이 바로 이 저장소에 접근해서 필요한 상태
를 가져다 사용하면 되기 때문입니다.
Redux의 주요 개념으로는
Action
,Dispatch
,Reducer
,Store
가 있으며,Action
→Dispatch
→Reducer
→Store
순서로 데이터가 단방향으로 흐르게 됩니다.
Action
은 말 그대로 어떤 액션을 취할 것인지 정의해 놓은 객체입니다. 해당Action
객체가 어떤 동작을 하는지 명시해주는type
속성을 가집니다.Dispatch
는Reducer
로Action
을 전달해주는 함수입니다.Dispatch
의 전달인자로Action
객체가 전달되며.Action
객체를 전달받은Dispatch
함수는Reducer
를 호출합니다.Reducer
는Dispatch
에게서 전달받은Action
객체의type
값에 따라서 상태를 변경시키는 함수로,Reducer
가 리턴하는 값이 새로운 상태가 됩니다. 이 때,Reducer
는 순수함수여야 합니다. 외부 요인으로 인해 기대한 값이 아닌 엉뚱한 값으로 상태가 변경되는 일이 없어야하기 때문입니다.Store
는Redux
의 전역 저장소로,Redux
앱의state
가 저장되어 있는 오직 하나뿐인 저장소의 역할을 합니다.
Semantic HTML
은 구조를 만드는 것을 넘어 의미를 갖게 만드는데 필요합니다. 시맨틱 요소의 예시로는header
,main
,nav
,footer
tag 등이 있습니다.
HTML
에는 많은 종류의 요소가 있지만,div
와span
tag 두 가지 요소만 알아도 충분히 화면의 구조를 만들 수 있지만, 이 두 요소의 이름에는 의미가 없기 때문에 요소의 이름으로는 각 요소가 어떤 역할을 하는지 알 수 없습니다.- 하지만 시맨틱 요소를 사용하면 요소의 이름만 보고도 해당 요소가 어떤 역할을 하는지, 요소가 가진 의미를 통해 파악할 수 있게 됩니다. 시맨틱한 요소의 이름만 봐도 의미를 파악할 수 있기 때문에 그만큼 의미를 전달하기 위한 시간과
id
,class
작성에 필요한 시간 소모도 줄어들고 개발자간 소통이 원활해집니다. 또한 검색 엔진은HTML
코드를 보고 문서의 구조를 파악하기 때문에 시맨틱 요소를 사용함으로써HTML
에 의미를 부여하는 것만으로도 검색 효율성을 높일 수 있습니다.
마지막으로 시맨틱 요소를 사용하면 화면의 구조를 짜는 것을 넘어 구조에 대한 정보를 전달할 수 있어 요소에 담긴 콘텐츠도 더 명확하게 전달할 수 있으므로 웹 접근성을 향상시킬 수 있습니다.
IP 프로토콜
은 두 사용자가 패킷 교환 방식으로 정보를 주고 받을 때 사용하는 통신 규약입니다.
IP 프로토콜
의 한계로는비연결성
,비신뢰성
이 있습니다.
인터넷 프로토콜(IP)
는패킷
단위로 통신하며,IP 패킷
은 소포처럼 출발지 IP 주소, 목적지 IP 주소 정보를 포함하고 있습니다.패킷
은 한 번 전송되면 목적지에 도착할 때까지 인터넷 망의 수 많은노드
를 지나게 됩니다.- 이 때,
패킷
을 받을 대상이 없거나 서비스 불능 상태여도 클라이언트는 서버의 상태를 파악할 방법이 없기 때문에 패킷을 그대로 전송하게 됩니다. 이걸비연결성
이라고 합니다.- 또한 데이터를 전달하던 중 장애가 생겨
패킷
이 중간에 소실되더라도 클라이언트는 이를 파악할 방법이 없습니다. 목적지에서도패킷
의 순서가 바뀌거나 소실된 상태로 도착할 수 있습니다. 이걸비신뢰성
이라고 합니다.
HTTP
는 클라이언트가 서버에 요청을 보내면 서버는 그에 대한 응답을 보내는 클라이언트 서버 구조로 이루어져 있으며,무상태성
,비연결성
이라는 특징을 갖습니다.
무상태성
은 서버가 클라이언트의 상태를 기억하지 않는다는 뜻입니다. 즉, 상태 기억의 주체가 클라이언트가 된다는 말이며, 중간에 요청을 처리하는 서버가 바뀌어도 클라이언트가 상태를 잘 담아서 요청을 보내면 응답을 제대로 받을 수 있습니다. 서버가 바뀌어도 응답에 문제가 없다는 뜻은, 필요에 따라 서버를 무한히 증설할 수 있다는 의미입니다. 즉, 무상태성이라는 특성 덕에 서버의 무한한 증설이 가능해집니다.비연결성
은 요청과 응답을 주고 받은 후에 서버와의 연결을 끊는 것을 의미합니다. 서버와의 연결을 지속하지 않고 필요할 때에만 연결하기 때문에 최소한의 자원만 사용하게 된다는 장점이 있습니다. 하지만HTTP 1.0
버전은 여러 요청을 보내야 할 때에도 매 요청마다 서버 연결과 종료를 반복하는 비효율성이 발생한다는 한계가 있습니다. 이러한 한계점을HTTP 1.1
버전에서는 지속 연결을 활용해서 해결합니다.
Cookie
는HTTP
프로토콜의 비상태성을 보완하기 위한 수단으로,
브라우저에 데이터를 저장할 때 사용합니다.Cookie
의MaxAge
옵션은 쿠키를 얼마나 유지할 것인지,Expires
옵션은 언제 폐기할 것인지 지정하는 옵션입니다.
두 옵션을 동시에 설정하면MaxAge
가 더 높은 우선 순위로 적용됩니다.
- 이 두 옵션중 하나라도 설정하지 않으면, 해당 쿠키는 브라우저가 닫힐 때 폐기 됩니다. 따라서
Cookie
를 빠르게 폐기하고 싶다면 옵션을 설정하지 않는 것이 좋고,Cookie
를 계속 사용하고 싶다면 두 옵션 중에 하나라도 설정해주는 것이 좋습니다.- 이 때, 브라우저를 종료하면 삭제되는 임시 쿠키를
세션 쿠키
(Session Cookie)라고 하고, 설정한 옵션만큼 사용가능한 쿠키를영속성 쿠키
(Persistent Cookie)라고 합니다."