-
Notifications
You must be signed in to change notification settings - Fork 0
๐ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๋ฌธ์
- ๋ฆฌ์กํธ
- ํ์ ์คํฌ๋ฆฝํธ
- ์นํฉ
- ts-loader
- styled-components
- props๋ฅผ ๋ฐ์ ๋์ ์คํ์ผ๋ง ๊ฐ๋ฅ
- ์คํ์ผ๊ณผ ๋งํฌ์ ์ด ๊ฐ์ด ์กด์ฌํด์ UI๋ณต์ก๋๊ฐ ๋์์ ธ๋ ์ฝ๊ฒ CSS๋ฅผ ์ฐพ์ ์ ์์ โ ๊ฐ๋ ์ฑ ๋์+์ ์ง๋ณด์ ์ฌ์
- ๋ฐํ์์ CSS ์ฝ๋๋ฅผ ์์ฑํ๋ฏ๋ก CSS in CSS์ ๋น๊ตํ์ฌ ์๋๊ฐ ๋๋ฆฌ์ง๋ง ์์ง ์๋น์ค ํฌ๊ธฐ์ ์ ์๋ฏธํ ์ฐจ์ด๋ ๋ณด์ด์ง ์์ ๊ฒ์ด๋ผ ํ๋จ
ํธ์์ ์ผ๋ก ์ด๋ํ๋ฉด์ ๊ฐํธํ๊ฒ ๋ณผ ์ ์๊ฒํ๊ธฐ ์ํด ๋ชจ๋ฐ์ผ์ ์ฐ์ ์ ์ผ๋ก ์ง์ํ๊ธฐ๋ก ๊ฒฐ์
๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์
- ์ปดํฌ๋ํธ๋ export default
- hook์ exportํด์ index.ts์ ์ ์ํ๊ธฐ
//correct
const Component=()=> {...};
export default Component;
export const func =()=>{...};
export const useHook=()=>{...};
//incorrect
export const Component=()=> {...};
- ์ด๋ค ๋์์ ํ๋์ง ๋ช ์์ ์ผ๋ก ์์ฑํ๊ธฐ
- ๋ค์ด๋ฐ:
handle+๋์(๋์ฌ)
- ex) handleLogin, handleRegisterForm
์ปดํฌ๋ํธ ์ด๋ฆ+Props
//correct
interface HeaderProps {};
//incorrect
interface Props {};
- ์ ๋์จ ํ์ ์ type
- ๋๋จธ์ง interface
//correct
type T = 'type' | 'example';
interface I {};
//incorrect
type T = {};
display
align-items
justify-contents
position
top right bottom left
float
width
height
margin
padding
border
background
font
color
text-decoration
text-align / vertical-align
white-space
other text
content
๊ฐ์ ์ ํ์
- eslint๋ฅผ ํตํด ์ ํ ์์
- ํ ํ์ผ์์ ๋งํฌ์ +์คํ์ผ ์ ์
- ๊ฐ์ฅ ํฐ ๋ฌถ์์
XXContainer
, ์์ํ ๊ฒ๋ค์XXWrapper
- ํ ์ค ์ด๋๋ผ๋ ์ค๊ดํธ ํ์
//correct
if (ok) {
return true;
}
//incorrect
if (ok) return true;
const Component = ({ color, children, ...props }) => { ... }
const dividerSizeStyles = {
'default' : css ``,
}
const dividerColorStyles = { ... };
์์ ํ์ผ๋ก ์ฐ๊ธฐ
color: {
description: '์ปดํฌ๋ํธ์ ์์์
๋๋ค.'
}
export default Component;
const Container=styled.div``;
interface Props {
/**
* ์ปดํฌ๋ํธ์ ์์์
๋๋ค.
*/
color?: Colors
/**
* ์ปดํฌ๋ํธ์ ๊ธธ์ด๋ฅผ ๋ํ๋
๋๋ค.
*/
length?: string
}
interface Component {
variant: 'outlined' | 'filled'
}
const meta:Meta<typeof Comonent> = { ... }
๋ณธ์ธ์ด ์ํ๋ ์คํ์ผ ํ์ ์ด ์์ ๋ ์ปดํฌ๋ํธ๋ฅผ ์ด๋ ๊ฒ ํ์ฅํด ์ธ ์ ์๋ค.
<Box
css={`
font-size: 16px;
`}
/>;
interface ComponentProps {
variant:
border:
color:
}
type StyleProps = Pick<ComponentProps, 'variant'| 'border' | 'color'>;
๐ฆsrc
โฃ ๐apis
โฃ ๐assets
โฃ ๐components
โฃ ๐constants
โฃ ๐hooks
โฃ ๐mocks
โฃ ๐pages
โฃ ๐router
โฃ ๐styles
โฃ ๐types
โฃ ๐utils
โฃ ๐App.tsx
โ ๐index.tsx
์ต๋ํ ํ์ ์ถ๋ก ์ ์ฌ์ฉํ๊ธฐ ์ค๋ณต๋๋ ํ์ ์ ์ค์ด๊ธฐ ์ํด ์ ํธ๋ฆฌํฐ ํ์ ์ฌ์ฉํ๊ธฐ
์ ์ธ๋ฐฉ์ - ํจ์ ํํ์
//correct
const Component = () => {...};
Props - ์ปดํฌ๋ํธ ์ด๋ฆ+Props
//correct
interface HeaderProps {};
//incorrect
interface Props {};
Props๋ก ๋ช ์ํ์ ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ Props๊ฐ ๊ฒ์๋์ด ์ฐพ๊ธฐ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ์ปดํฌ๋ํธ ์ด๋ฆ+Props๋ก ์ ์ํด ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ๋ช ์ํ๋ค.
type vs interface - ์ ๋์จ ํ์ ์ type, ๋๋จธ์ง๋ interface ์ฌ์ฉ
//correct
type T = 'type' | 'example';
interface SomeThing {};
//incorrect
type T = {};
interface์ ๊ฒฝ์ฐ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค.
Component with Children / Component without Children
์ปดํฌ๋ํธ ๋ง๋ค ๋ ComponentPropsWithoutRef
children ๋ฐ์ ๋ PropsWithChildren
๋ฆฌ์กํธ ํ์ค์ผ๋ก ์ ๊ณตํด์ฃผ๊ณ ์๊ณ ๊ฐํธํ๊ฒ ์ธ ์ ์๋ค.
// correct
const handleClick: MouseEventHandler<HTMLButtonElement> = (event) => { /*...*/ };
// incorrect
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => { /*...*/ };
์ด๋ฒคํธ ์์ฒด์ ํ์ ๋ณด๋ค๋ ํจ์์ ํ์ ์ ์ง์ ํด ๋ช ์์ ์ผ๋ก ์ฐ๊ณ ์ถ์ด์ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ ํ
const [data, setUser] = useState<User>();
ํ์ฌ๊น์ง๋ ์์ ๋ฐฉ์์ผ๋ก ์ฐ๊ณ ์์ง๋ง ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด ๋ณ๊ฒฝํ ์์ Ref
const ref = useRef<HTMLElement>(null);
ํ์ฌ๊น์ง ref๋ ๋๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ null๋ก ์ด๊ธฐํ
type ๊ด๋ฆฌ ๋ฐฉ์ types ํด๋ ์๋์ common, products, review ๋ฑ์ ํด๋๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ ๋ค๋ฅธ ํ์ ๋ค์ ๋ํด์๋ ๋ฑํ prefix๋ suffix๋ฅผ ์ฌ์ฉํ์ง ์์
type import/export
//correct
import type { Type } from '@/types/common';
//incorrect
import { Type } from '@/types/commmon';
lint๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก type import๊ฐ ๋๊ฒ๋ ์ค์
Request / Response Type
api response์ ๊ฒฝ์ฐ CategoryProductResponse์ ๊ฐ์ด ๋ค์ด๋ฐ์ ์ง์
const useCategoryProducts = (categoryId: number, sort: string = PRODUCT_SORT_OPTIONS[0].value) => {
return useGet<CategoryProductResponse>(
() => categoryApi.get({ params: `/${categoryId}/products`, queries: `?page=1&sort=${sort}` }),
[categoryId, sort]
);
};
loader
ts-loader ์ฌ์ฉ
babel-loader๊ฐ ์๋๋ ๋ ๋น ๋ฅด์ง๋ง ํ์ ์ฒดํน์ ํ์ง ์๋๋ค๋ ์ ๊ณผ ํด๋ฆฌํ์ด ํ์ํ IE๊ฐ ์ง์ ์ข ๋ฃ๋์๋ค๋ ์ ์ ๊ณ ๋ คํ์ฌ ts-loader๋ก ๊ฒฐ์ ํจ
{
"compilerOptions": {
"target": "esnext",
"lib": ["dom", "dom.iterable", "esnext"], //์ปดํ์ผ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ JS API์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์
"esModuleInterop": true,
"module": "esnext", //์ปดํ์ผ์ ๋ง์น ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ด ์ด๋ค ๋ชจ๋ ์์คํ
์ ์ฌ์ฉํ ์ง
"moduleResolution": "node", //node์ ๋ต์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ์
"resolveJsonModule": true, //json ํ์ผ import ํ์ฉ
"forceConsistentCasingInFileNames": true, //ํ์ผ ์ด๋ฆ์ ๋์๋ฌธ์ ๊ตฌ๋ถ
"strict": true,
"skipLibCheck": true, //๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ํ์
์ฒดํนx (์ปดํ์ผ ์๊ฐ ์ค์ผ ์ ์์)
"jsx": "react-jsx", //tsx๋ฅผ ์ด๋ป๊ฒ ์ปดํ์ผ ํ ์ง ๋ฐฉ์์ ์ ํจ
"outDir": "./dist",
"typeRoots": ["node_modules/@types", "src/types"], //ํ์
์ ์์น ์ง์
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src"], //์ปดํ์ผ์ ํฌํจ
"exclude": ["node_modules", "dist"] //์ปดํ์ผ์ ์ ์ธ
}
- ๐ฅณ ์๋น์ค ์๊ฐ
- ๐คธ ํฅ์คํ ๋ฏธํ
- ๐ ์ฐ๋ฆฌ ์ฌ์ฉ ์ค๋ช ์
- โค๏ธโ๐ฅ ํ๋ฌธํ
- ๐ ๊ธฐ๋ฅ ๋ช ์ธ์
- ๐ณ git ๋ธ๋์น ์ ๋ต
- ๐ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๋ฌธ์
- ๐ ๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์
- ๐งช ํ๋ก ํธ์๋ ํ ์คํธ ์ ๋ต
- [์น ์ ๊ทผ์ฑ] a tag์ button์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
- multipart
- SvgSprite ์ปดํฌ๋ํธ ์ฌ์ฉํ๊ธฐ
- [INFRA] ํ๋ก ํธ์๋ CI/CD ๊ตฌ์ถ
- [๊ธฐ์ ๊ฒํ ] ๋ฆฌ์กํธ ์ฟผ๋ฆฌ ๋์ ์ด์
- [๊ธฐ์ ] ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๋์ ๊ธฐ
- ๐ S3 ๋ฐฐํฌ ์บ์ฑ ์ค๋ฅ
- ์ด๋ฏธ์ง๋ฅผ ์ํ S3์ Cloudfront ์ค์ ํ๊ธฐ
- ๐ ์ฑ๋ฅ๋ฆฌํฌํธ โ ํ์ ์๋น์ค ์ต์ ํํ๊ธฐ
- ํ์ SEO ๊ฐ์ ํ๊ธฐ
- ๐ ๋ฐฑ์๋ ๊ฐ๋ฐ ๋ฌธ์
- intellij์์ private DB ์ฐ๊ฒฐํ๊ธฐ
- [INFRA 0] ์ ์ฒด infra ๊ตฌ์กฐ - ver1
- [INFRA 1] infra ์๋ฒ ์ธํ
- [INFRA 2] ๋ฐฑ์๋ CI/CD ๊ตฌ์ถ
- [INFRA 3] ๋ฐฑ์๋ DB ์ฐ๊ฒฐ
- [INFRA 4] ๊นํ๋ธ PR ๋ผ๋ฒจ์ ๊ธฐ์ค์ผ๋ก ์ ํจ์ค ๋น๋ํ๊ธฐ
- [LOG] ๋ก๊ทธ ์ธํ
- [Trouble Shooting] ์ผ๊ด๋ ํ ์คํธ ๊ฒฉ๋ฆฌ ์ ์ฉํ๊ธฐ
- [Trouble Shooting] ํ๋ก์๋ก ๋์ํ๋ @Transactional, ์ ํ ์ต์ ๊ด๋ฆฌ
- [2023โ07โ18] 1์ฐจ ์ ๊ธฐ ํ์
- [2023โ07โ25] 2์ฐจ ์ ๊ธฐ ํ์
- [2023โ08โ01] 3์ฐจ ์ ๊ธฐ ํ์
- [2023โ08โ08] 4์ฐจ ์ ๊ธฐ ํ์
- [2023โ08โ16] 5์ฐจ ์ ๊ธฐ ํ์
- [2023-08-31] 6์ฐจ ์ ๊ธฐ ํ์
- [2023-09-05] 7์ฐจ ์ ๊ธฐ ํ์
- [2023-09-12] 8์ฐจ ์ ๊ธฐ ํ์
- [2023-09-19] 9์ฐจ ์ ๊ธฐ ํ์
- [2023-09-26] 10์ฐจ ์ ๊ธฐ ํ์