반응형

문제

해당 라이브러리의 카카오맵을 생성하기위해서는 width, height 를 입력받아야한다. docs 에서 width, height 의 type 이 String, Number 로 작성되어있어 숫자 혹은 숫자와 단위를 포함한 문자열을 입력할 수 있다는 것을 알 수 있다. 하지만, 예상외로 로컬 환경에서 문자열 값이 적용되지 않는 문제를 발견했다.

문제코드

const r = S(() => ({
      width: isFinite(+i.width) ? i.width + "px" : i.width,
      height: isFinite(+i.height) ? i.height + "px" : i.height
}));

해당 코드는 얼핏보면 문자열과 숫자를 모두 입력받는 것을 의도하지만 정작 문자열값이 적용이 되지 않았다.

<KakaoMap
    :width="`${50}vw`"
    :height="`${90}vh`"
    :lat="37.566826"
    :lng="126.9786567"
    @onLoadKakaoMap="onLoadKakaoMap"
/>
  • 추후에 알게 된 것이지만 width, height 값에 문자열을 삽입하려면 위와 같은 작업을 거쳐야 했다. 이러한 설명이 docs에는 준비되어있지않아 애초에 문자열로 받도록 한다면 문제가 없을것이라 판단했다.

멍청 비용 발생

<KakaoMap
    :width="'50vw'"
    :height="'90vh'"
    :lat="37.566826"
    :lng="126.9786567"
    @onLoadKakaoMap="onLoadKakaoMap"
/>
  • 작은 따옴표로 감싸면 된다 ^^;
  • 멍청비용 한시간 발생
반응형
반응형

1. 컴포넌트 기반 아키텍처

React는 UI를 독립적이고 재사용 가능한 컴포넌트로 나누어 개발할 수 있습니다. 이렇게 나누어진 컴포넌트는 서로 독립적으로 관리되며, 부모-자식 관계로 데이터를 주고받습니다.

예제: 컴포넌트 분리

const Button =({ label, onClick })=> {
  return (
    <button onClick={onClick}>
      {label}
    </button>
  );
}
function App() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <h1>Count: {count}</h1>
      <Button label="Increment" onClick={() => setCount(count + 1)} />
      <Button label="Decrement" onClick={() => setCount(count - 1)} />
    </div>
  );
}
  • App 컴포넌트는 Button 컴포넌트를 사용해 label, onClick props를 전달 후, 생성한다.
  • Button 컴포넌트는 서로 다른 버튼이지만 하나의 컴포넌트 코드로 재사용할 수 있다.

2. Virtual DOM을 활용한 고성능 렌더링

React는 Virtual DOM을 사용하여 변경 사항을 추적하고, 실제 DOM 조작을 최소화하여 성능을 최적화한다.

예제: Virtual DOM에서의 렌더링 비교

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  console.log('Rendered with count:', count); // Virtual DOM에서 변경 사항 확인

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default Counter;

설명:

  • 상태 변경 시 Virtual DOM에서 새 상태를 반영한 컴포넌트를 생성하고, 이전 Virtual DOM과 비교.
  • 변경된 부분만 실제 DOM에 업데이트하므로 성능이 최적화.
  • 브라우저 콘솔에서 상태 변경 시마다 컴포넌트가 다시 렌더링되는 것을 확인 가.

3. 단방향 데이터 흐름

React는 상위 컴포넌트에서 하위 컴포넌트로만 데이터를 전달합니다. 이를 통해 데이터 흐름이 명확해지고 관리가 쉬워집니다.

예제: 부모-자식 간 데이터 전달

// Child.js: 하위 컴포넌트
import React from 'react';

function Child({ message }) {
  return <h2>{message}</h2>;
}

export default Child;

// App.js: 상위 컴포넌트
import React, { useState } from 'react';
import Child from './Child';

function App() {
  const [message, setMessage] = useState('Hello, React!');

  return (
    <div>
      <Child message={message} />
      <button onClick={() => setMessage('Data Flow Updated!')}>
        Update Message
      </button>
    </div>
  );
}

export default App;

설명:

  • App 컴포넌트가 Child 컴포넌트로 message를 전달한다.
  • 단방향 데이터 흐름으로 인해, 데이터는 항상 부모에서 자식으로만 흐릅니다.
  • Child 컴포넌트로 넘어온 message를 변경하고 싶다면, 부모의 setMessage 를 props로 받아와 실행하면된다.

React의 단점

단점 1: 초기 로딩 시간 해결 (코드 스플리팅)

React 애플리케이션은 초기 로딩 시간 증가 문제가 있지만, 코드 스플리팅을 통해 이를 해결할 수 있습니다.

예제: React의 코드 스플리팅

import React, { Suspense, lazy } from 'react';

const HeavyComponent = lazy(() => import('./HeavyComponent'));

function App() {
  return (
    <div>
      <h1>Welcome to My App</h1>
      <Suspense fallback={<div>Loading...</div>}>
        <HeavyComponent />
      </Suspense>
    </div>
  );
}

export default App;

설명:

  • lazy 를 통해 HeavyComponent는 사용될 때만 로드된다.
  • Suspense를 사용하여 로드 중인 상태를 처리할 수 있다.
  • 이를 통해 초기 로딩 시간을 줄이고 성능을 개선할 수 있다.

단점 2: SEO 문제 해결 1(ReactDOMServer)

리액트의 ReactDOMServer 라이브러리를 통해 SSR을 직접 구현.

import express from 'express';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './App';

const app = express();

app.get('*', (req, res) => {
  const appHtml = ReactDOMServer.renderToString(<App />);
  const html = `
    <!DOCTYPE html>
    <html>
      <head><title>React SSR</title></head>
      <body>
        <div id="root">${appHtml}</div>
        <script src="/bundle.js"></script>
      </body>
    </html>
  `;
  res.send(html);
});

app.listen(3000, () => console.log('Server is running on http://localhost:3000'));
  • 서버에서 리액트 컴포넌트를 해석하는 라이브러리 ReactDOMServer 을 이용해 HTML 파일로 변경한다.

단점 2: SEO 문제 해결 2(Next.js 활용)

CSR 방식에서 발생하는 SEO 문제는 Next.js를 사용하여 서버 사이드 렌더링(SSR)을 도입함으로써 해결 가능합니다.

예제: Next.js에서 SSR 사용

// pages/index.js
import React from 'react';

export default function Home({ message }) {
  return (
    <div>
      <h1>{message}</h1>
    </div>
  );
}

export async function getServerSideProps() {
  return {
    props: {
      message: 'This page is rendered on the server!',
    },
  };
}

설명:

  • getServerSideProps를 사용해 서버에서 데이터를 가져와 페이지를 렌더링한다.
  • HTML 콘텐츠가 완전히 생성되어 클라이언트에 전달되므로 SEO와 초기 로딩 문제를 동시에 해결할 수 있다.

반응형

'Web > React' 카테고리의 다른 글

[React] useRef, useMemo, useCallback  (1) 2024.12.13
React 번들링  (1) 2024.12.01
반응형

프론트엔드 개발자는 가끔 자바스크립트로 문제를 풀어야한다. 하지만, 애처롭게도 c++에는 내장 라이브러리로 존재하는 binary_search, lower_bound, upper_bound가 존재하지 않느다. 따라서, 우리는 이분탐색을 "직접" 만들어야한다. 이분탐색에 대해 알아보자

 

Binary Search

const binarySearch =(arr, target)=>{
    let left = 0;
    let right = arr.length - 1;

    while(left <= right){
        let mid = Math.floor((left+right)/2);

        if(arr[mid] === target){
            return mid;
        }else if(arr[mid] < target){
            left = mid + 1;
        }else{
            right = mid - 1;
        }
    }

    return -1;
}

 

Lower Bound

const lowerBound =(arr, target)=>{
    let left = 0;
    let right = arr.length - 1;

    while(left < right){
        let mid = Math.floor((left+right)/2);

        if(arr[mid] < target){
            left = mid + 1;
        }else{
            right = mid;
        }
    }
    return left;
}
  • lower bound 는 배열에서 타겟값 이상이 처음으로 나타나는 위치를 찾는다.
  • 이분탐색 하다가 target 값 이상인 left 값이 타겟값을 넘는 첫 위치다.

Upper  Bound

const upperBound =(arr, target)=>{
    let left = 0;
    let right = arr.length - 1;

    while(left < right){
        let mid = Math.floor((left+right)/2);

        if(arr[mid] <= target){
            left = mid + 1;
        }else{
            right = mid;
        }
    }
    return left;
}
  • upper bound 는 배열에서 타겟값보다 큰 값이 나타나는 첫 위치를 찾는다.
  • 타겟값을 초과하는 인덱스를 반환한다.

이분탐색 vs lower, upper

  • 이분탐색은 탐색값을 찾는것 이므로 while의 조건이 left<=right다.
  • lower, upper 는 탐색값의 바운더리를 찾는 것 이므로 while의 조건이 left < right다.
반응형

'Language > Javascript' 카테고리의 다른 글

코딩테스트를 위한 PriorityQueue  (1) 2024.10.31
[JS] 프로토타입  (0) 2024.09.29

+ Recent posts