Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

전남대 FE_김다연_1주차 과제 Step1 #41

Open
wants to merge 25 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a7d0be2
docs(README.md): 기능 목록 추가
Da-Yeon-Kim Jun 28, 2024
0be0a3d
feat(kakao-gift): CRA 이용해 TS 프로젝트 생성
Da-Yeon-Kim Jun 28, 2024
c82db98
remove: 불필요한 파일 정리
Da-Yeon-Kim Jun 28, 2024
820a906
feat(Header): 헤더 컴포넌트 추가 및 파일 구조 정리
Da-Yeon-Kim Jun 28, 2024
39e9550
chore: craco 이용해 절대 경로 설정
Da-Yeon-Kim Jun 28, 2024
f4e2746
chore: ESLint와 Prettier 설정
Da-Yeon-Kim Jun 28, 2024
46d8be3
chore: emotion 라이브러리 이용해 reset CSS 적용
Da-Yeon-Kim Jun 28, 2024
d57fb54
docs(README.md): 세부 설명 추가
Da-Yeon-Kim Jun 28, 2024
c49f1c7
chore: Storybook 설치
Da-Yeon-Kim Jun 28, 2024
7b8215a
docs(README.md): 1단계 보충 및 2단계 기능 목록 추가
Da-Yeon-Kim Jun 28, 2024
5d6184c
feat(Button): Theme Props에 따른 버튼 디자인 변화
Da-Yeon-Kim Jun 28, 2024
df178ba
feat(Button): Size Props에 따른 버튼 크기 변화
Da-Yeon-Kim Jun 28, 2024
a14b77c
feat(Button): Button 요소의 기본 속성 사용
Da-Yeon-Kim Jun 28, 2024
ce96a51
feat(Input): disable Props에 따라 Input 변경
Da-Yeon-Kim Jun 28, 2024
d184e08
feat(Input): invalid Props에 따른 Input 디자인 변화
Da-Yeon-Kim Jun 28, 2024
4b2ccff
feat(Input): Input 요소의 기본 속성 추
Da-Yeon-Kim Jun 28, 2024
4f6bac6
feat(Image): Image 컴포넌트 생성
Da-Yeon-Kim Jun 28, 2024
30331ee
feat(Image): ratio Props에 따른 이미지 비율 변화
Da-Yeon-Kim Jun 28, 2024
2122df3
feat(Image): radius Props에 따른 모서리, 속성 추가
Da-Yeon-Kim Jun 28, 2024
cfe9e5f
feat(GoodsItem): GoodsItem 생성 및 Props 설정
Da-Yeon-Kim Jun 28, 2024
f8da7bd
feat(GoodsItem): Ranking 형태 구현
Da-Yeon-Kim Jun 28, 2024
8b99f93
refactor: 컴포넌트 폴더 구조 정리
Da-Yeon-Kim Jun 28, 2024
bb7a1a0
feat(Grid): Grid 컴포넌트 구현
Da-Yeon-Kim Jun 28, 2024
64ace13
feat(Container): Container 컴포넌트 구현
Da-Yeon-Kim Jun 28, 2024
bd2b87d
docs(README.md): 3단계 답변 작성
Da-Yeon-Kim Jun 28, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,74 @@
# react-gift-react-foundation

FE 카카오 선물하기 1주차 과제: React 기초

## 1단계 기능 목록

- [x] TS 프로젝트 생성 (CRA 이용)
- [x] alias 설정
- [x] tsconfig 설정
- [x] Prettier 설정
- [x] ESLint 설정
- [x] emotion 스타일 라이브러리 설치
- [x] reset css 적용
- [x] .gitignore 추가
- [x] 불필요한 코드/파일 정리
- [x] 폴더 구조 생성

## 1단계 설명

- Craco 라이브러리를 사용해 절대 경로를 설정하였습니다.
- 절대 경로 관련 설정을 tsconfig.paths.json으로 별도로 분리하였습니다.
- 절대 경로 및 reset CSS 적용을 확인하기 위해 Header 컴포넌트를 만들었습니다.
- ESLint와 Prettier의 충돌을 방지하였습니다.
- 폴더 구조는 평소에 기능별로 나누어서 썼던 것 중에 어떤 프로젝트든 기본적으로 사용할 것 같은 것들만 우선 추가해보았습니다. components는 리액트의 UI 컴포넌트를 담는 폴더이고, styles는 reset CSS 같이 스타일링을 담당하는 파일을 담는 폴더, utils는 API 호출 함수 등 재사용 가능한 유틸리티 함수를 담는 폴더입니다.

## 2단계 기능 목록

- [x] Storybook를 설치한다.

### Button 컴포넌트 구현

- [x] Theme Props에 따라 버튼 컬러 및 디자인이 다르게 보인다.
- [x] Size Props에 따라 버튼의 크기가 다르게 보인다. (responsive라면 미디어 쿼리에 따라 사이즈가 다르다)
- [x] Button Element의 기본 속성을 모두 사용한다.

### Input 컴포넌트 구현

- [x] disabled Props에 따라 Input이 비활성화되고, 이를 UI에서 인지한다.
- [x] invalid Props에 따라 Input 값이 잘못됨을 UI에서 인지한다.
- [x] Input Element의 기본 속성을 모두 사용한다.

### Image 컴포넌트 구현

- [x] ratio Props에 따라 이미지 비율을 설정한다. (number가 16/9라면 16:9 비율, circle이라면 원형)
- [x] radius Props에 따라 모서리 둥글게 한다. (number만큼 모서리 둥글게, circle이라면 원형)
- [x] Img Element의 기본 속성을 모두 사용한다.

### GoodsItem 컴포넌트 구현

- [x] Default 형태와 Ranking 형태를 각각 구현한다.
- [x] 공통으로 imageSrc, subtitle, title, amount Props를 넘겨받는다.
- [x] Ranking 컴포넌트의 경우, rankingIndex Props를 추가로 넘겨받는다. (1~3까지는 분홍색, 나머지는 회색의 랭킹 뱃지)

### Grid 컴포넌트 구현

- [x] Grid 컴포넌트를 구현한다.

### Container 컴포넌트 구현

- [x] Container 컴포넌트를 구현한다.

## 3단계

### Q1. webpack은 무엇이고, 어떤 역학을 하고 있나요?

webpack은 오픈 소스 JS 모듈 번들러로, 여러 개로 나누어진 파일을 하나의 JS 코드로 압축하고 최적화하는 라이브러리입니다. JS 모듈과 그 의존성 파일들을 하나의 파일로 묶어서 배포할 수 있게끔 해줍니다. 또한, 코드 분할을 통해서 앱의 특정 부분을 필요할 때만 로드할 수 있게 합니다.

### Q2. 브라우저는 어떻게 JSX 파일을 읽을 수 있나요?

브라우저 단독으로는 JSX 문법을 읽을 수 없기 때문에 Babel 같은 라이브러리를 사용해 JSX를 일반적인 JS 문법으로 변환해야 합니다. 개발자가 JSX 문법을 사용해서 React 컴포넌트를 작성하면, Babel이 JSX 코드를 일반 JS 코드로 변환하고, webpack 같은 번들러가 변환된 JS 코드를 번들링하여 브라우저에서 실행합니다. 이때, Babel은 최신 JS 문법을 지원하지 않는 구형 브라우저에서도 코드가 작동하게끔 변환해주는 라이브러리이기도 합니다.

### Q3. React에서 상태 변화가 생겼을 때 어떻게 변화를 알아챌 수 있나요?

React에서 상태 변화는 컴포넌트의 상태(state)나 속성(props)가 변경될 때 발생합니다. React는 `setState` 혹은 `useState`를 통해 상태 변화를 감지하여 업데이트하고, 상태가 업데이트 되면 해당 컴포넌트를 다시 렌더링합니다. 이때, 렌더링하는 것은 가상 DOM으로, 이전 가상 DOM과 렌더링한 현재 DOM을 비교하여 변화한 부분만 실제 DOM에 적용합니다. (Reconciliation)
25 changes: 25 additions & 0 deletions kakao-gift/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

*storybook.log
6 changes: 6 additions & 0 deletions kakao-gift/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 120,
"semi": false
}
19 changes: 19 additions & 0 deletions kakao-gift/.storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { StorybookConfig } from '@storybook/react-webpack5'

const config: StorybookConfig = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: [
'@storybook/preset-create-react-app',
'@storybook/addon-onboarding',
'@storybook/addon-links',
'@storybook/addon-essentials',
'@chromatic-com/storybook',
'@storybook/addon-interactions',
],
framework: {
name: '@storybook/react-webpack5',
options: {},
},
staticDirs: ['..\\public'],
}
export default config
14 changes: 14 additions & 0 deletions kakao-gift/.storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Preview } from '@storybook/react'

const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
}

export default preview
13 changes: 13 additions & 0 deletions kakao-gift/craco.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const path = require('path')

module.exports = {
webpack: {
alias: {
'@src': path.resolve(__dirname, 'src'),
'@styles': path.resolve(__dirname, 'src/styles'),
'@components': path.resolve(__dirname, 'src/components'),
'@utils': path.resolve(__dirname, 'src/utils'),
'@stories': path.resolve(__dirname, 'src/stories'),
},
},
}
58 changes: 58 additions & 0 deletions kakao-gift/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import globals from 'globals'
import js from '@eslint/js'
import tseslint from '@typescript-eslint/eslint-plugin'
import tsParser from '@typescript-eslint/parser'
import react from 'eslint-plugin-react'
import reactHooks from 'eslint-plugin-react-hooks'
import jsxA11y from 'eslint-plugin-jsx-a11y'
import importPlugin from 'eslint-plugin-import'
import prettier from 'eslint-plugin-prettier'
import airbnb from 'eslint-config-airbnb'
import prettierConfig from 'eslint-config-prettier'

export default [
{
files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'],
ignores: ['node_modules', 'eslint.config.mjs'],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
project: './tsconfig.json',
},
globals: globals.browser,
},
settings: {
react: {
version: 'detect',
},
},
plugins: {
react,
'react-hooks': reactHooks,
'jsx-a11y': jsxA11y,
import: importPlugin,
'@typescript-eslint': tseslint,
prettier,
},
rules: {
...js.configs.recommended.rules,
...tseslint.configs.recommended.rules,
...react.configs.recommended.rules,
...reactHooks.configs.recommended.rules,
...jsxA11y.configs.recommended.rules,
...importPlugin.configs.recommended.rules,
...airbnb.rules,
...prettierConfig.rules,
'prettier/prettier': 'error',
'@typescript-eslint/explicit-function-return-type': 'off',
'import/no-named-as-default': 'off',
'import/no-named-as-default-member': 'off',
'import/no-unresolved': 'off',
},
},
]
Loading