Solog
React에서 SOLID 원칙 SRP

React에서 SOLID 원칙 SRP

2023년 11월 17일

React
OOP

Single Responsibility Principle

클래스는 단 하나의 책임만 가져야 한다. 함수는 단 하나의 기능만 수행해야 한다.

function Page() { const [value, setValue] = useState('') const [data, setData] = useState() async function handleSubmit() { const nextData = await fetchData(value) setData(nextData) } return ( <> <header>{/** header inner */}</header> <input type='text' value={value} onChange={(e) => setValue(e.target.value)} /> <button type='button' onClick={handleSubmit}> 제출 </button> {data?.type === 'A' && <p>A Type: {data}</p>} {data?.type === 'B' && <p>B Type: {data}</p>} </> ) }

위 코드에서는

  • header 렌더링
  • input 상태 관리
  • data fetching
  • data rendering

위 4가지 기능이 이 한 군데에 몰려있다.

이렇게 뭉쳐있는 기능들을 각자 역할에 충실할 수 있도록 컴포넌트로 분리해보려 한다.

import { useState } from 'react' function Page() { const [data, setData] = useState() async function handleSubmit(value: string) { const nextData = await fetchData(value) setData(nextData) } return ( <> <Header /> <Form handleSubmit={handleSubmit} /> <Data data={data} /> </> ) } function Header() { return <header>{/** header inner */}</header> } function Form({ handleSubmit }) { const [value, setValue] = useState<string>('') return ( <> <input type='text' value={value} onChange={(e) => setValue(e.target.value)} /> <button type='button' onClick={() => handleSubmit(value)}> 제출 </button> </> ) } function Data({data}) { return ( <> {data?.type === 'A' && <p>A Type: {data}</p>} {data?.type === 'B' && <p>B Type: {data}</p>} </> ) }

header 렌더링 분리

첫 번째로는 header 렌더링을 Header 라는 컴포넌트 내부에 모두 몰아 넣음으로써

header 렌더링 부분에서 처리할 역할은 Header 컴포넌트가 전적으로 책임지게 된다.

input 상태 관리 분리

두 번째로는 input 상태가 변경되고 handleSubmit 에 사용되는 부분을 Form 이라는 컴포넌트로 분리하였다.

이로 인해 input 의 상태 관리 및 사용되는 시점은 Form 컴포넌트가 전적으로 책임지게 된다.

data rendering 분리

fetchData 함수로 얻어온 데이터를 렌더링 하는 부분은 Data 컴포넌트로 분리하였다.

이로 인해 data 값에 따른 렌더링 식은 Data 컴포넌트가 전적으로 책임지게 된다.

data fetching 분리

사실 data fetching 은 분리되었다고 볼 수 는 없지만 위 3가지 역할 들이 분리됨에 따라

알아서 분리되었다.

이전 아티클

렉시컬 스코프

다음 아티클

React에서 SOLID 원칙 OCP