폴더 구조

frontend/.
├── public
│   ├── favicon.ico
│   ├── next.svg
│   └── vercel.svg
├── src
│   ├── api
│   ├── components
│   ├── pages
│   │   ├── _app.tsx
│   │   ├── _document.tsx
│   │   └── index.tsx
│   ├── stories
│   ├── utils
│   ├── hooks
│   ├── constants
│   ├── assets
│   ├── types
│   └── styles
└── tsconfig.json

컴포넌트 폴더 구조

├── src
│   ├── components
│   │   ├── common
│   │   │   ├── Button
│   │   │   │   ├── Button.css.ts
│   │   │   │   └── Button.tsx
│   │   │   └── index.ts   
│   │   └── problem      # 도메인별로 나눈다
│   │       ├── ProblemContent
│   │       │   ├── ProblemContent.css.ts
│   │       │   └── ProblemContent.tsx
│   │       ├── CommandAccordion
│   │       │   ├── CommandAccordion.css.ts
│   │       │   └── CommandAccordion.tsx
│   │       └── index.ts
│   └── pages
│       ├── _app.tsx
│       ├── _document.tsx
│       └── index.tsx 

코드 컨벤션

function Form({ onSubmit }) {

	const handleSubmit = () => {
		onSubmit();
	};
	
	return (<form>
		<button type="submit" onClick={handleSubmit}></button>
	</form>);
}
function List({ data, onClick }) {
	const genClickHandler = (id) => () => onClick(id);
	
	return (<ul>
		{data.map((id) => <li onClick={genClickHandler(id)}></li>)}
	</ul>);
}