- PM(Project Manager)
- ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ํฌํจํ๋ ํ๋ก์ ํธ ์ ์ฒด๋ฅผ ๋ฆฌ๋
- ํ๋ก์ ํธ์ ๋ํ ๋ชจ๋ ์ฑ ์
- ๋ฐฑ์๋ ๊ฐ๋ฐ์
- ๋ฐฑ์๋ ํํธ ๊ตฌํ
- ๋ฐฑ์๋ ์ฝ๋ ์ทจํฉ
- ์๋ฒ ๊ด๋ฆฌ
- README
-
ํ๋ก ํธ์๋ PL(Proejct Leader)
- ํ๋ก ํธ์๋ ํํธ ๋ฅผ ๋ฆฌ๋ํ๊ณ ๋ฐฑ์๋์์ ํ์ ์ ์ํ ์ํต์ ๋ด๋น
- ํ๋ก ํธ์๋ ํํธ์ ์ ๋ฌด ์กฐ์จ
-
ํ๋ก ํธ ๊ฐ๋ฐ์
- ํ๋ก ํธ์๋ ํํธ ๊ตฌํ
- UI/UX ๊ณ ์ ํ ๊ตฌํ
- CTO (Chief Technology Officer)
- API, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ๋ฑ์ ๊ฒฐ์
- ์๋กญ๊ฒ ๋์ ๋ ์ ๋ณด์ ์ง์์ ๋ค๋ฅธ ํ์๋ค์๊ฒ ์ ํ
- ํ๋ก ํธ ๊ฐ๋ฐ์
- ํ๋ก ํธ์๋ ํํธ ๊ตฌํ
- UI/UX ๊ณ ์ ํ ๊ตฌํ
- README
- ๋ง์ค์ฝํธ
- YUM? YUM! ์ฟผ์นด ์ด๋ฏธ์ง ๋ชจํฐ๋ธ ์ ๊ณต
- ํ๋ก ํธ ๊ฐ๋ฐ์
- ํ๋ก ํธ์๋ ํํธ ๊ตฌํ
- ์ธ๋ถ API(์นด์นด์ค์ง๋)
- UI/UX ๊ณ ์ ํ ๊ตฌํ
- README
-
๋ฐฑ์๋ PL(Proejct Leader)
- ๋ฐฑ์๋ ํํธ๋ฅผ ๋ฆฌ๋ํ๊ณ ํ๋ก ํธ์๋์์ ํ์ ์ ์ํ ์ํต์ ๋ด๋น
- ๋ฐฑ์๋ ํํธ์ ์ ๋ฌด ์กฐ์จ
-
๋ฐฑ์๋ ๊ฐ๋ฐ์
- ๋ฐฑ์๋ ํํธ ๊ตฌํ
- DB ์คํค๋ง ์ค๊ณ
-
๋ชฉํ : ์ฐจ์ฃผ ํํ๋ก์ ํธ ์ค๋น(๊ธฐํ, ํ๋ก์ ํธ ๊ท์น ๋ฑ)
์์ธํ
- ํ ํ๋ก์ ํธ๋ฅผ ์ํ ๋๊ตฌ ์ฐ์ต. Gitlab, Jira ๋ฑ
- ๊ฐ์ธํ๋ก์ ํธ์ด์ง๋ง ํ์ผ๋ก ๋์!! (์ด์ ๋ฐ์ ์ ํ์ ๊ณต์ )
- ํํ๋ก์ ํธ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ
- React์ ๋ํ ์ ๋ฐ์ ์ธ ํ์ต(๊ฐ์ ์์ค!)
-
๋ชฉํ : ๋ณธ๊ฒฉ์ ์ธ ํ๋ก ํธ์๋, ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์งํ
์์ธํ
- ๊ฐ์ ํํธ ๋ด์ ์ฌ๋๋ค๊ณผ ์ํํ ํ์ ๊ณผ ์ํต
- ๊ฐ ํํธ๋ณ๋ก ์ฌ์ฉํ๋ ํ๋ ์์ํฌ์ ๋ํ ์๋ จ๋ ์์น
- ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ REST API ํต์ ์ ๋ํ ์ดํด
- ๊ตฌํ ์๋น์ค์ ๋ง๋ ์์ด์ดํ๋ ์, ๋ชฉ์ , DB ์คํค๋ง ์ ์
-
๋ชฉํ : ๋ฐฑ์๋, ํ๋ก ํธ์๋ ๋ฐฐํฌ ์ฃผ์๊ธฐ๋ฅ ์์ฑ
์์ธํ
- ๋ฉ์ธ์์ํผ๋, ์ง๋, ์ ๋ ์นด ๊ธฐ๋ฅ ์์ฑ
- ์ค๋งํธํฐ ํด์๋์ ๋ง๊ฒ CSS ๋ฐ์ํ์ผ๋ก ๊ตฌํ
- ์ค์ ๋ฐ์ดํฐ๋ก ๊ธฐ๋ฅ์ด ์ ํ์ด ๋์ํ๋์ง ํ์ธ
- UCC์ ์ ๋ฐ README.md ์์ฑ
- 1์ผ 1์ปค๋ฐ, 1์ฃผ 1MR(Merge Request) 1์ธ ํ๋ก์ ํธ๋ผ๋ master ๋ธ๋์น์์ ์์ ํ์ง ๋ง์(์ฐ์ต)
- Jira ์ด์ ๊ด๋ฆฌ
- ์คํ ๋ฆฌ ํฌ์ธํธ๋ ์ ๊ทน์ ์ผ๋ก ํ์ฉ
- ๊ณต๋ถํ ๋ด์ฉ์ด๋ ๋งํ ์ด์๋ฅผ README.md๋ก ์ ๋ฆฌ!!!
- ์๋๋ฐฉ์๊ฒ ์ํฅ์ ๋ผ์น ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ฐ๋ก ๋ณด๊ณ
- ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- URL
- ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ ํ์
- ์๋๋ฐฉ์ด ๊ตฌํํ๊ธฐ๋ก ์ ํ ํ์ผ์์ ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ
- ์ง๋ผ๋ฅผ ํตํด ์ด์ ํ ์ผ, ์ค๋ ํ ์ผ ๋ฐ์.
- ์ด์ ํ ์ผ ์ค์ ์๋๋ฐฉ์๊ฒ ์ํฅ์ ๋ผ์น ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๊ฒฝ์ฐ ๋ณด๊ณ
- URL
- ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ ํ์
- ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ ์งํ
- ํ์ํ๋ค๋ฉด ๊ฐ์ ๊ธฐ์ ์คํ ์ฌ๋๋ผ๋ฆฌ ์ฝ๋ ๋ฆฌ๋ทฐ ์งํ
- ์ง๋ผ์ ์ค๋ ํ ์ผ ๋ฐ์
- ์ค๋ ํ ์ผ ์ค์ ์ฌ๋๋ค์๊ฒ ๋ณด๊ณ ํ ๋งํ ๋ด์ฉ ์ ๋ฆฌ
- 1์ผ 1์ปค๋ฐ ์ํ (์ปค๋ฐ ๋ฉ์์ง ์ปจ๋ฒค์ ์งํฌ ๊ฒ)
ํ๋ก ํธ ์๋ ์ฝ๋ฉ ์ปจ๋ฒค์ [์ ๊ธฐ/ํผ์น๊ธฐ]
-
์ปดํฌ๋ํธ๋
ํจ์ํ
์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค. -
ํ๋์ ํ์ผ์๋ ํ๋์ React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
๊ทธ๋ฌ๋, ๋ค์ค ์คํ ์ดํธ๊ฐ ์๋(Stateless) ๋๋ ์์ํ ํจ์๋ ์ปดํฌ๋ํธ๋ ํ์ฉ๋ฉ๋๋ค.
-
์คํ์ผ๋ง์
Prettier-Code formatter
ํ๋ฌ๊ทธ์ธ์ ํตํด ํต์ผํฉ๋๋ค.
// ๊ตฌ์ฑ์์๋ ๋ ์ฐพ์๋ณด๊ณ ํฉ์ํด๋ด
์๋น
{
"useTabs": false,
"printWidth": 100,
"tabWidth": 2,
"trailingComma": "all",
"semi": true,
"singleQuote": true
}
- ๊ธฐ๋ฅ๊ณผ ์ญํ ์ ๋ฐ๋ผ์ ํด๋๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- ํ๋ฉด ๊ตฌ์ฑ์์๊ฐ ์๋
๊ธฐ๋ฅ์์
๋ ํด๋๋ช ์์ ์ธ๋๋ฐ(_
)์ ๋ถ์ฌ์ ๊ตฌ๋ถํฉ๋๋ค.
- ๋ณ์๋ ๊ฐ๋ฅํ๋ฉด ๋ถ๋ณ๋ณ์๋
const
์ฌ์ฉํฉ๋๋ค.
-
ํ์ผ๋ช ์
PascalCase
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ex) LoginPage.jsx -
ํ์ผ์ด๋ฆ๊ณผ ์ปดํฌ๋ํธ์ด๋ฆ์ ํต์ผํฉ๋๋ค.
-
๊ตฌ์ฑ์์์ ํ์ฅ์๋
.jsx
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
prop์ ์ด๋ฆ์ ํญ์
camelCase
๋ฅผ ์ฌ์ฉํฉ๋๋ค. -
props๋
์ฝ๊ธฐ์ ์ฉ
์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค. ์์ ๋๋ฉด ์๋๋ค. (์์ ์ด ํ์ํ ์ ๋ณด๋ state!) -
React ์ปดํฌ๋ํธ๋ props๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋์
์์ํจ์
์ฒ๋ผ ์ฌ์ฉํด์ผํ๋ค.- ์์ํจ์?
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ธ๋ถ ์ํ (๋ฐ์ดํฐ๋ฒ ์ด์ค, DOM ๋๋ ์ ์ญ ๋ณ์์ ๊ฐ์)์ ์์กดํ์ง ์์ผ๋ฉฐ ๋์ผํ ์ ๋ ฅ๊ฐ์ ๋ํด ๋์ผํ ์ถ๋ ฅ๊ฐ์ ์ผ๊ด๋๊ฒ ์ ๊ณตํ๋ ํจ์๋ฅผ โ์์(pure)โ ํจ์๋ผ๊ณ ํ๋ค.
-
ํ๋กํผํฐ(
props
)๋ก ๊ฐ์ ์ ๋ฌํ ๋์๋ ๋ฌธ์์ด์ ํฐ๋ฐ์ดํ(""
) , ์ด์ธ์ ๊ฐ์ ์ค๊ดํธ({}
)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// ์์
class App extends React.Component {
render() {
// ์ ๋ฌํ ๋ ์ง์ ๋ถํ ์์๋ค์ ๋ณ์์ ํ ๋น ํ ๋๊ฒจ์ค๋๋น
const array = [1,2,3];
const obj = {name: "YUM", age:"3000"}
const node = <h1>์๋
ํ์ธ์</h1>;
const func = () => {console.log('์๋
ํ์ธ์'); };
return (
<ChildComponent
stringValue="string"
boolValue //boolean์ ๊ฒฝ์ฐ ๋ณด๋ด๋ฉด true ์๋ณด๋ด๋ฉด false๊ฐ ์์์ ํ ๋น๋ฉ๋๋น.
numValue={1}
arrayValue={array}
objValue={obj}
nodeValue={node}
funcValue={func}
/>
);
}
}
export default App;
- ํ๋กํผํฐ๋ฅผ ๋ฐ์์จ ๊ฒฝ์ฐ, ์๋ฃํ์ ํ๋จ์ ์ ์ธํด ์ค๋๋ค.
// ํด๋น ๋ด์ฉ์ด ํจ์ํ์๋ ์ ์ฉ๋๋์ง ๋ชฐ๊ฒ !
import PropTypes from 'prop-types'
...
PropsComponent.propTypes = {
stringValue: PropTypes.string,
boolValue: PropTypes.bool,
numValue: PropTypes.number,
arrayValue: PropTypes.arrayOf(PropTypes.number),
objValue: PropTypes.shape({
name: PropTypes.string,
age: PropTypes.number,
}),
nodeValue: PropTypes.node,
funcValue: PropTypes.func,
}
- ์์์ ๊ฐ์ง์ง ์์ผ๋ฉด, ํญ์ ์์ ์ ๋ซ๋(
self-close
) ํ๊ทธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. - self-closing์๋ ํ์นธ์ ๊ณต๋ฐฑ๋ง ์ฌ์ฉํฉ๋๋ค.
// DO NOT
<sample className="sample"></sample>
// DO
// self-closing์๋ ํ์นธ์ ๊ณต๋ฐฑ๋ง ์ฌ์ฉํฉ๋๋ค.
<sample className="sample" />
- ๋ฉํฐ๋ผ์ธ์ ๊ฒฝ์ฐ, ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ๋ฅผ ๋ค๋ฅธ ์ค์ ์์นํ๋ค.
// DO NOT
<sample className="sample"
type="YUM" />
// DO
<sample
className="sample"
type="YUM"
/>
-
์ก์
Type
์ ์ด๋ค ์์ ์ ์ํ ๊ฒ์ธ์ง ๋ช ํํ๊ฒ ๋ช ๋ช ํฉ๋๋ค.Type
์๋๋ฌธ์
์์ธ๋๋ฐ
๋ก ๊ตฌ์ฑํฉ๋๋ค.
-
๋ฆฌ๋์
-
๋ฆฌ๋์๊ฐ ๋ฐํํ๋ ๊ฐ์
์๋ฃํ
์ ์ด์ ๋ฐ์ดํฐ์ ๋์ผํด์ผ ํฉ๋๋ค.(
์ฝฉ์ฌ์๋ฐ ์ฝฉ๋๊ณ ํฅ์ฌ์ ๋ฐ ํฅ๋๋ค)
-
-
If๋ฌธ
- ์ค๊ดํธ ๋ด์ ๋
ผ๋ฆฌ์ฐ์ฐ์
&&
์ ์ฌ์ฉํด ํํํฉ๋๋ค.
// ์์ <div> <h1>Hello!</h1> {unreadMessages.length > 0 && <h2>You have {unreadMessages.length} unread messages.</h2> } </div>
- ์ค๊ดํธ ๋ด์ ๋
ผ๋ฆฌ์ฐ์ฐ์
-
If-else๋ฌธ
condition ? true: false
ํํ๋ฅผ ์ฌ์ฉํด ํํํฉ๋๋ค.
render() { const isLoggedIn = this.state.isLoggedIn; return ( <div> The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in. </div> ); }
- ๋์ผํ์ง ์๋๋ผ๋, ํ๋ก์ ํธ์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํด ๊ตฌ์ฑํ์ต๋๋ค.
- ํ์ด์ง์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๊ณ , UI๋ฅผ ์ปดํฌ๋ํธ
๊ณ์ธต ๊ตฌ์กฐ
๋ก ๋๋๊ธฐ - UI๋ ์์ง๋ง ๊ธฐ๋ฅ์ ์๋
์ ์ ์ธ ๋ฒ์
๋ง๋ค๊ธฐ - ์ต์ํ์ state ํ์ ๋ฐ ์ค๊ณ
- ์ญ๋ฐฉํฅ ๋ฐ์ดํฐ ์ด๋ ์ค๊ณ
- ํ์ด์ง์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๊ณ , UI๋ฅผ ์ปดํฌ๋ํธ
- ๋์์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, Material-UI ๋ก ํต์ผํ๋ค.
๋ฐฑ์๋ ์ฝ๋ฉ ์ปจ๋ฒค์ [์ ๊ธฐ/ํผ์น๊ธฐ]
๊น ์ปค๋ฐ ๋ฉ์์ง ์ปจ๋ฒค์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฐ ๋ช ๋ช ๊ท์น๋ ์ฒ์ ๋ณด๋ ์ฌ๋๋ค์ด ์ฝ๊ธฐ ์ฝ๊ฒ๋ ๋ชจ๋๊ฐ ๊ณต์ ํ๊ธฐ ์ฌ์ด ์ปจ๋ฒค์ ์ ๊ฐ์ง๊ณ ์ด๋ฆ์ ์ง์ด์ผ ํ๋ค.
-
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด๋ฐ์ ๋๊ตฌ๋ ์ ์ ์๋ ์ฌ์ด ๋จ์ด๋ฅผ ์ ํํ๋ค.
- ์ฐ๋ฆฌ๋ ์ธ๊ตญ์ธ์ด ์๋๋ค. ์ธ๋ฐ์์ด ์ด๋ ค์ด ๊ณ ๊ธ ์ดํ๋ฅผ ํผํ๋ค.
-
๋ณ์๋ CamelCase๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
- private String secondName = "William"
-
URL, ํ์ผ๋ช ๋ฑ์ kebab-case๋ฅผ ์ฌ์ฉํ๋ค.
- /user-email-page ...
-
ํจํค์ง๋ช ์ ๋จ์ด๊ฐ ๋ฌ๋ผ์ง๋๋ผ๋ ๋ฌด์กฐ๊ฑด ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
- frontend, useremail ...
-
ENUM์ด๋ ์์๋ ๋๋ฌธ์๋ก ๋ค์ด๋ฐํ๋ค.
- public String NAME = "June" ...
-
ํจ์๋ช ์ ์๋ฌธ์๋ก ์์ํ๊ณ ๋์ฌ๋ก ๋ค์ด๋ฐํ๋ค.
- getUserId(), isNormal() ...
-
ํด๋์ค๋ช ์ ๋ช ์ฌ๋ก ์์ฑํ๊ณ UpperCamelCase๋ฅผ ์ฌ์ฉํ๋ค.
- UserEmail, Address ...
-
๊ฐ์ฒด ์ด๋ฆ์ ํจ์ ์ด๋ฆ์ ์ค๋ณตํด์ ๋ฃ์ง ์๋๋ค. (= ์์ ์ด๋ฆ์ ํ์ ์ด๋ฆ์ ์ค๋ณต์ํค์ง ์๋๋ค.)
- line.getLength() (O) / line.getLineLength() (X)
-
์ปฌ๋ ์ ์ ๋ณต์ํ์ ์ฌ์ฉํ๊ฑฐ๋ ์ปฌ๋ ์ ์ ๋ช ์ํด์ค๋ค.
- List ids, Map<User, Int> userToIdMap ...
-
์ด์ค์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๋จ์ด๋ ์ง์ํ๋ค.
- event, design ...
-
์๋๊ฐ ๋๋ฌ๋๋ค๋ฉด ๋๋๋ก ์งง์ ์ด๋ฆ์ ์ ํํ๋ค.
- retreiveUser() (X) / getUser() (O)
- ๋จ, ์ถ์ฝํ์ ์ ํํ๋ ๊ฒฝ์ฐ๋ ๊ฐ๋ฐ์์ ์๋๊ฐ ๋ช ๋ฐฑํ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ์ด๋ค. ๋ช ๋ฐฑํ ์ ๋ฌ์ด ์๋๋ค๋ฉด ์ถ์ฝํ๋ณด๋ค ์์ ํ์ด ๋ ์ข๋ค.
-
ํจ์์ ๋ถ์ํจ๊ณผ๋ฅผ ์ค๋ช ํ๋ค.
-
ํจ์๋ ํ๊ฐ์ง ๋์๋ง ์ํํ๋ ๊ฒ์ด ์ข์ง๋ง, ๋์ ๋ฐ๋ผ ๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํฌ ์๋ ์๋ค.
fun getOrder() { if (order == null) { order = Order() } return order }
-
์ ํจ์๋ ๋จ์ํ order๋ง ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ, ์์ผ๋ฉด ์์ฑํด์ ๋ฆฌํดํ๋ค.
-
๊ทธ๋ฌ๋ฏ๋ก getOrder() (X) / getOrCreateOrder() (O)
-
-
LocalDateTime -> xxxAt, LocalDate -> xxxDt๋ก ๋ค์ด๋ฐ
-
๊ฐ์ฒด๋ฅผ ์กฐํํ๋ ํจ์๋ JPA Repository์์ findXxx ํ์์ ๋ค์ด๋ฐ ์ฟผ๋ฆฌ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ์์ฑํ๋ Service๋จ์์๋ ๋๋๋ก์ด๋ฉด getXxx๋ฅผ ์ฌ์ฉํ์.
๊ตฌ์กฐ ์ค๊ณ์ ๋ํ ๊ณ ๋ฏผ์ ํญ์ํ๊ธฐ ๋ง๋ จ์ด๋ค. ์ข์ ์ค๊ณ๋ฅผ ์ํด ๊พธ์คํ ๊ณ ๋ฏผํ๊ณ ๋ฆฌํฉํ ๋ง ์์ ํ๋ ๊ฒ์ ์งํฅํ๋ค.
- ํจํค์ง๋ ๋ชฉ์ ๋ณ๋ก ๋ฌถ๋๋ค.
- user(User ๊ด๋ จ ํจํค์ง), coupon(์ฟ ํฐ ๊ด๋ จ ํจํค์ง)
- Controller์์๋ ์ต๋ํ ์ด๋ค Service๋ฅผ ํธ์ถํ ์ง ๊ฒฐ์ ํ๋ ์ญํ ๊ณผ Exception์ฒ๋ฆฌ๋ง์ ๋ด๋นํ์.
- Controller ๋จ์์ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ ์ง์ํ๋ค.
- Controller์ ์ฝ๋ ๋ผ์ธ ์๋ฅผ ์ค์ด์๋ ๋ป์ ์ ๋ ์๋๋ค.
- ํ๋์ ๋ฉ์๋์ ํด๋์ค๋ ํ๋์ ๋ชฉ์ ๋ง ์ํํ๊ฒ ๋ง๋ ๋ค.
- ํ๋์ ๋ฉ์๋ ์์์๋ ํ ๊ฐ์ง ์ผ๋ง ํด์ผํ๋ค.
- ํ๋์ ํด๋์ค ์์์๋ ๊ฐ์ ๋ชฉ์ ์ ๋ ์ฝ๋๋ค์ ์งํฉ์ด์ฌ์ผํ๋ค.
- ๋ฉ์๋์ ํด๋์ค๋ ์ต๋ํ ์๊ฒ ๋ง๋ ๋ค.
- ๋ฉ์๋์ ํด๋์ค๊ฐ ์ปค์ง๋ค๋ฉด ํ๋์ ํด๋์ค๋ ๋ฉ์๋ ์์์ ์ฌ๋ฌ ๋์์ ํ๊ณ ์์ ํ๋ฅ ์ด ํฌ๋ค.
- ์๋ง์ ์ฑ ์์ ๋ ์์ ํด๋์ค๋ฅผ ํผํ๋ค. ํฐ ํด๋์ค ๋ช ๊ฐ๊ฐ ์๋๋ผ ์์ ํด๋์ค ์ฌ๋ฟ์ผ๋ก ์ด๋ค์ง ์์คํ ์ด ๋์ฑ ๋ฐ๋์งํ๋ค.
- ํด๋์ค ๋๋๋ ๊ฒ์ ๋๋ ค์ํ์ง ๋ง์.
- ๋๋ฉ์ธ ์๋น์ค๋ฅผ ๋ง๋ค์ด์ง๋ ๊ฒ์ ํผํ์.
- User๋ผ๋ ๋๋ฉ์ธ์ด ์์ ๋, UserService๋ก ๋ง๋๋ ๊ฒ์ ํผํ๋ค.
- ์ด๋ ๊ฒ ๋๋ฉ์ธ ๋ค์ด๋ฐ์ ๋ด ์๋น์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด ์์ฐ์ค๋ ์๋ง์ ์ฑ ์์ ๋ ์์ ํฐ ํด๋์ค๋ก ๋ฐ์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ๊ธฐ๋ฅ ๋ณ๋ก ์ธ๋ถํํด์ ๋ง๋ค์ด๋ณด์. (UserRegisterService, UserEmailService ๋ฑ...)
-
๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ค.
- ๋จ, ํ ์คํธ์ฝ๋๋ ์์ธ๋ก ํ๋ค.
-
๋ณ์๋ ์ต๋ํ ์ฌ์ฉํ๋ ์์น์ ๊ฐ๊น๊ฒ ์ฌ์ฉํ๋ค.
-
ํ๋ผ๋ฏธํฐ ๋ณ์์ ๋ด๋ถ ๋ณ์๋ฅผ ๊ตฌ๋ณํ ๋ ์ธ๋๋ฐ๊ฐ ์๋ this๋ก ๊ตฌ๋ณํ๋ค.
- this.name = name (O) / name = _name (X)
- ์ถ๊ฐ์ ์ผ๋ก ์ธ๋๋ฐ๋ฅผ prefix๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํ์.
-
์ฝ๋์ ๊ธธ์ด๊ฐ ์งง๊ณ ๋ช ๋ฃํ ๊ฒ๋ ์ข์ง๋ง, ๊ฐ๋ ์ฑ์ด ํ์ ํ ๋จ์ด์ง๋ค๋ฉด ์ฝ๋๋ฅผ ์ข ๋ ํ์ด์ด๋ค.
- ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ฝ๋๊ฐ ์งง์ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ง ์๋๋ค. ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ณธ๋ค๋ฉด ๊ฐ๋ ์ฑ์ด ํ์ ํ ๋จ์ด์ง๋ค.
- ํนํ๋ ์ต์ ์ธ์ด(kotlin ๋ฑ)์ ๊ฒฝ์ฐ ์ฝ๋์ ๊ธธ์ด๋ฅผ ํ์ ํ ์ค์ผ ์๋ ์์ง๋ง, ์ 3์์ ์ ์ฅ์์ ๋ด๋ ์ด๋์ ๋ ๊ฐ๋ ์ฑ์ด ์๋์ง ๋ค์ ํ๋ฒ ํ์ธํ๋ ์์ ์ ํ์.
-
๋ชจ๋ ์์ธ๋ ๋ฌด์ํ์ง๋ง๊ณ ์ฒ๋ฆฌํ๋ค. ๋ง์ฝ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์๊ฑฐ๋ผ๋ฉด ๊ทธ ์ด์ ์ ๋ํด์ ๋ช ํํ๊ฒ ์ฃผ์์ ๋จ๊ธด๋ค.
-
์์ธ๋ฅผ ๋์ง ๋๋ ์ต๋ํ ์ธ๋ถ์ ์ธ Exception(= Custom Exception)์ ๋์ง๋ค.
- ์คํจํ ์ฝ๋์ ์๋๋ฅผ ํ์ ํ๋ ค๋ฉด ํธ์ถ ์คํํธ๋ ์ด์ค๋ง์ผ๋ก ๋ถ์กฑํ๋ค.
- ์ค๋ฅ ๋ฉ์ธ์ง์ ์ ํ ์ํฉ์ ์ ๋ณด๋ฅผ ๋ด์ ์์ธ์ ํจ๊ป ๋์ง๋ค.
-
์์ธ ์ผ์ด์ค๊ฐ ๋ฐ์ํ ํ๋ฅ ์ด ์๋ ๊ฒฝ์ฐ, ๊ฐ๋ฅํ ๋นจ๋ฆฌ ๋ฆฌํด ๋๋ ์์ธ๋ฅผ ๋์ง๋๋ก ์์ฑํ๋ค.
-
์ธ๋ฐ์์ด ์ ์๋ก์ง์ ํ์ธ ํ์๊ฐ ์๊ฒํ๋ค.
if(!์ ์) { throw err; } ์ ์ ๋ก์ง }
-
-
์กฐ๊ฑด์ด ๋ณต์กํ ๊ฒฝ์ฐ ์์ boolean ๋ณ์๋ฅผ ๋ง๋ค์ด ๋จ์ํํ๋ค.
-
์กฐ๊ฑด๋ฌธ์ ๋ถ์ ์กฐ๊ฑด์ ๋ฃ๋ ๊ฒ์ ํผํ๋ค.
- if(status.isNormal()) (O) / if(!status.isAbnormal()) (X)
-
์ต๋ํ ๊ฐ์ฒด ํ์ ๋์ ๊ธฐ๋ณธ ์๋ฃํ์ ์ ํํ๊ณ , ์๊ฐ์ง๋ ๋ชปํ Autoboxing์ด ๋ฐ์ํ์ง ์๋๋ก ์ ์ํ๋ค.
์ปค๋ฐ ๋ฉ์์ง ์ปจ๋ฒค์ [์ ๊ธฐ/ํผ์น๊ธฐ]
์ฌ์ค ์ง๊ธ๊ป ํผ์์ ํ๋ก์ ํธ๋ฅผ ์งํํด์ค๋ ์ผ์ด ๋ง์์ ๊น ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๋๋ง ์์๋ณด๋ฉด ๋๋ฏ๋ก ์ค๊ตฌ๋๋ฐฉ์ผ๋ก ์ ๋ ์ผ์ด ๋ง์๋ค.
๊ทธ๋ฌ๋ ์ค ์ต๊ทผ์ ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋จ์ด ์์๋ณด๊ธฐ ์ฝ๊ฒ๋ ์ ๊ฒฝ์จ์ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํด์ผํ ์ผ์ด ์๊ฒผ๋ค.
๊ทธ๋ฐ๋ฐ ํ ํ์ ์ด ์๋๋๋ผ๋ ๋ช ๊ฐ์ ๋ค์ ๋ด๊ฐ ์ด ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๋ณด๊ฒ ๋๋ฉด ์ด ๋น์์ ๋ด๊ฐ ๋ฌด์จ ์๊ฐ์ผ๋ก ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ๋์ง ์ ์๊ฐ ์๋ค....(๋๋ฅผ ์ํด์ ๋ผ๋ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์ ๊ฒฝ์จ์ ์ ๋๋ก ํ์.)
์ ๋ฆฌํ์๋ฉด, ํฌ๊ฒ 3๊ฐ์ง ์ด์ ๋ก ์ข์ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํด์ผ ํ ๊ฒ์ด๋ค.
- ๋ ์ข์ ์ปค๋ฐ ๋ก๊ทธ ๊ฐ๋ ์ฑ
- ๋ ๋์ ํ์ ๊ณผ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค
- ๋ ์ฌ์ด ์ฝ๋ ์ ์ง ๋ณด์
์ปค๋ฐ ๋ฉ์์ง ๊ตฌ์กฐ๋ ์ ๋ชฉ(subject) / ๋ณธ๋ฌธ(body) / ๊ผฌ๋ฆฌ๋ง(footer)๋ก ๊ตฌ์ฑ๋๋ค.
๋ณธ๋ฌธ๊ณผ ๊ผฌ๋ฆฌ๋ง์ ๋ฐ๋์ ํฌํจ๋ ํ์๋ ์๋ค.
type : subject (์ด ๊ณณ์ ์ ๋ชฉ์ด ๋ค์ด๊ฐ ์๋ฆฌ์
๋๋ค.)
body (์ด ๊ณณ์ ๋ณธ๋ฌธ ๋ด์ฉ์ด ๋ค์ด๊ฐ ์๋ฆฌ์
๋๋ค.)
footer (์ด ๊ณณ์ ๊ผฌ๋ฆฌ๋ง์ด ๋ค์ด๊ฐ ์๋ฆฌ์
๋๋ค.)
- feat : ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
- fix : ๋ฒ๊ทธ ์์
- docs : ๋ฌธ์ ์์
- style : ์ฝ๋ ํฌ๋งทํ , ์ธ๋ฏธ์ฝ๋ก ๋๋ฝ, ์ฝ๋ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ
- refactor : ์ฝ๋ ๋ฆฌํฉํ ๋ง
- test : ํ ์คํธ ์ฝ๋, ๋ฆฌํฉํ ๋ง ํ ์คํธ ์ฝ๋ ์ถ๊ฐ
- chore : ๋น๋ ์ ๋ฌด ์์ , ํจํค์ง ๋งค๋์ ์์
- ์ปค๋ฐ ๋ฉ์์ง ์ ๋ชฉ์ ์ ์ผ ์์ ์ ๋ชฉ์ ํ์ ์ ๋ถ์ฌ์ค๋ค. ์ปค๋ฐ ํ์ ์ ์ข ๋ฅ๋ ์ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ค.
- ์ ๋ชฉ์ 50์๋ฅผ ๋๊ธฐ์ง ์๊ณ , ๋๋ฌธ์๋ก ์์ฑํ๊ณ ๋ง์นจํ๋ฅผ ๋ถ์ด์ง ์๋๋ค.
- ๊ณผ๊ฑฐ ์์ ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ช ๋ น์ด๋ก ์์ฑํ๋ค.
- ์ปค๋ฐ ์ ํ๋ค์ด ๋ณตํฉ์ ์ธ ๊ฒฝ์ฐ์๋ ์ต๋ํ ๋ถ๋ฆฌํ์ฌ ์ปค๋ฐํ๋ค.
- ์ ํ ์ฌํญ์ด๋ฏ๋ก ์์ฑํ์ง ์์๋ ๋ฌด๋ฐฉํ๋ค.
- ๋ถ์ฐ์ค๋ช ์ด ํ์ํ๊ฑฐ๋ ์ปค๋ฐ์ ์ด์ ๋ฅผ ์ ๋ฌํด์ผํ ๊ฒฝ์ฐ ์์ฑํ๋ค.
- ๋ด์ฉ์ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ์๋์ง ๋ณด๋ค ๋ฌด์์, ์ ๋ณ๊ฒฝํ์๋์ง๋ฅผ ์ค๋ช ํ๋ ์์ฃผ๋ก ์์ฑํ๋ค.
- ํ ์ค์ด 72์๋ฅผ ๋๊ธฐ์ง ์๊ณ ์ ๋ชฉ๊ณผ ๊ตฌ๋ถ๋๊ฒ ํ ์ค์ ๋์ฐ๊ณ ์์ฑํ๋ค.
- ์ ํ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ์์ฑํ์ง ์์๋ ๋ฌด๋ฐฉํ๋ค
- ๋ณดํต ์ด์๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์ด์ ํธ๋์ปค ID๋ฅผ ๋ฃ์ด์ฃผ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
feat: Summarize changes in around 50 characters or less
More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of the commit and the rest of the text as the body. The
blank line separating the summary from the body is critical (unless
you omit the body entirely); various tools like `log`, `shortlog`
and `rebase` can get confused if you run the two together.
Explain the problem that this commit is solving. Focus on why you
are making this change as opposed to how (the code explains that).
Are there side effects or other unintuitive consequenses of this
change? Here's the place to explain them.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Typically a hyphen or asterisk is used for the bullet, preceded
by a single space, with blank lines in between, but conventions
vary here
If you use an issue tracker, put references to them at the bottom,
like this:
Resolves: #123
See also: #456, #789
-
frontend ํด๋๋ก ๋ค์ด์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
yarn
-
frontend app์ ์คํํฉ๋๋ค.
yarn start
- Java (Open JDK 14)๋ฅผ ์ค์นํฉ๋๋ค.
- Maven์ ์ค์นํฉ๋๋ค.
- VSCode์์ Maven ํ๋จ์ webcuration์์ ์ฐํด๋ฆญ ํ install
- VS Code์์ Spring Boot Extension Pack ์ค์นํฉ๋๋ค.
- Docker๋ฅผ ์ค์นํฉ๋๋ค.
Maria DB ์ปจํ ์ด๋ ์คํ
docker run --name-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD={ํจ์ค์๋} -d mariddb
- ํจ์ค์๋๋ฅผ ์น ๋๋, ๋๊ดํธ๋ฅผ ์ง์ฐ๊ณ ์นฉ๋๋ค.
docker exec -it maria-db mysql -u root -p
- docker๋ฅผ ์ผ๊ณ , maria-db๋ฅผ ์คํํ๊ธฐ ์ํ ์ฝ๋์ ๋๋ค.
DB ํ ์ด๋ธ ์์ฑ
- DB ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
backend ์ฑ์ ์คํํฉ๋๋ค.
./mvnw spring-boot:run
์์ํ ๊ธฐ์ต์ด ๋ด๊ธด ํผ๋(Feed)
-
๋ง์๋ ์์์ ๋จน์๋ ๊ธฐ์ต์ ์์๊ณผ ํจ๊ป ์์ํ๊ฒ ๊ธฐ๋กํ ์ ์์ต๋๋ค.
-
๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฑํ ํผ๋๋ฅผ ํ๋์ ๋ณผ ์ ์๊ณ ์๋ก ๊ณต์ ํ ์ ์์ต๋๋ค.
์ธ์์ ํ๋๋ฟ์ธ ๋ง์ง ์ง๋
- ๋ณธ์ธ์ด ์ฐํ ์๋น๋ค๋ง ๋ชจ์ ์ง๋์์ ํ์ธํ์ธ์.
- ๋ค๋ฅธ์ฌ๋๋ค์ด ๋ค๋ ๊ฐ ์ฃผ๋ณ์ ๋ง์ง๋ค๋ ํ์ธ ํ ์ ์์ด์.
๋ง์ง ์ ๋ ์นด๋ฅผ ์ธ์น์ธ์!!!
- ๋ง์ง์ ๋ฐ๊ฒฌํ ๊ธฐ์จ์ ์ฃผ๋ณ ์ฌ์ฉ์๋ค์๊ฒ ์ ํํ ์ ์์ด์.
๋ชฉ์ ํด์ ํ์ฉํ๊ธฐ ์ ์ ์ ํฌ๊ฐ ์๊ฐํ ๊ธฐ๋ฅ๋ค์ ํํํ๊ธฐ ์ํด ๊ฐ๋จํ ๊ตฌ์กฐ์ ์ปจํ ์ธ ๋ฅผ ์ค์ผ์น!
ํ์ฌ ๊ธฐํ๋ ์๋น์ค ๋ด์์ ํ์ํ ์คํค๋ง๋ ์ ๋ถ ๊ตฌํ๋์ด์๋ ์ํฉ์ ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํ์ํ Column์ด ์๊ธฐ๊ฒ ๋๋ฉด ์๋กญ๊ฒ ์คํค๋ง๋ฅผ ์์ ํด๋๊ฐ๋ฉด์ ๋ง์ถฐ๋๊ฐ ๊ณํ์ ๋๋ค.
์ ์ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค
- ํ์ ๊ฐ์
- ์ด๋ฉ์ผ, ์ด๋ฆ, ๋น๋ฐ๋ฒํธ๋ก ๊ฐ์ ๊ฐ๋ฅ
- ๊ฐ์ ํ์ ํญ๋ชฉ ๋ชจ๋ ์ ๋ ฅ ์์๋ง ๊ฐ์ ๋๋๋ก ๋ณ๊ฒฝ
- ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ ๋ฑ ์ ๋ ฅ ๊ธฐ์ค์ด ์ถฉ์กฑ๋์ง ๋ชปํ ์ ์ค๋ฅ ๋ฉ์์ง ๋ ธ์ถ
- ๋ก๊ทธ์ธ
- ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ ์ค๋ฅ์ ์ค๋ฅ ๋ฉ์ธ์ง ๋ ธ์ถ
- ๋ก๊ทธ์ธ ์คํจ ์ ์ฌ์ฉ์์๊ฒ ์คํจ ์ฌ์ ์ค๋ฅ๋ฉ์์ง ๋ ธ์ถ
- JWT Token ํ์ฉ ๋ณด์์ฑ ๊ฐํ
๋ง์๋ ์์ ์์๊ณผ ํจ๊ป ๋ง์ง ์ ๋ณด์ ํ๊ฐ๋ฅผ ๋ด์ ๊ฒ์๊ธ
-
ํผ๋ ์์ฑ ํ์ด์ง
- ํด๋ํฐ์ผ๋ก ์ฐ์ ์์์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ์๋ฒ์ ์ ์ฅ
- ์ง๋ API๋ฅผ ํ์ฉํด์ ์ ํํ ๊ฐ๊ฒ ์์น ์ ๋ณด๋ฅผ ์ ๋ ฅ
- ์์์ ๊ณผ ์ง์ ํด๋จน์ ์์์ ๋ถ๋ฅํ์ฌ ์ ์ฅ
- ๋จน์ ์์์ ์ ๋ชฉ์ผ๋ก ์ง์ ํ๊ณ ๋ณ์ ๊ณผ ๋ด์ฉ์ ์ ๋ ฅ
-
ํผ๋ ํ๋ฆฝ ํ์ด์ง
- ํผ๋ ํ์ด์ง์ ๋ฐฐ๊ฒฝ์ผ๋ก ์์์ ์๋ ๋ฐ๋ณต ์ฌ์
- ํผ๋ CRUD ๊ตฌํ
- ๋ค๋ฅธ ์ ์ ๊ฐ ์์ฑํ ํผ๋๋ฅผ ์ ํ ์ ์๋ ํ์ด์ง
- ๋๋ค์ ํด๋ฆญ์ ๋ค๋ฅธ ์ ์ ์ ๋ง์ดํ์ด์ง ์ ๊ทผ ๊ฐ๋ฅ
- ์ข์์ ํญ๋ชฉ์ ์ง๋์์ ํ์ธ ๊ฐ๋ฅ
- ์ธํผ๋ํฐ ์คํฌ๋กค์ ํตํด ์์์ด ๋๊ธฐ์ง ์๋๋ก ๊ตฌ์ฑ
ํผ๋๋ก ์ ์ฅ๋ ์ฅ์๋ฅผ ์ง๋์ ๋ง์ปค์ ํํ๋ก ํ์ฉ ๊ฐ๋ฅ
-
๋ฆฌ๋ทฐ ์ง๋
- ์ข์์ ํ ๋ฆฌ๋ทฐ๋ ๋ํ ๋ฆฌ๋ก, ์ ์ฒด ๋ฆฌ๋ทฐ๋ ๊ธฐ๋ณธ๋ง์ปค๋ก ์ง์ ํ์ฌ ๋ถ๋ฅํ์ฌ ํ์
- ์ข์์ ํ ๋ฆฌ๋ทฐ๋ฅผ ๋ชฉ๋ก์ผ๋ก ํ์ธํ ์ ์์.
- ๋ง์ปคํด๋ฆญ์ ์์์ ์ ๊ฐ๋จ ์ ๋ณด๋ฅผ ๋ฐํ ์ํธ์ ํ๊ธฐ
- ๋ฐํ ์ํธ์์ ๋ฆฌ๋ทฐ๋ณด๊ธฐ ํด๋ฆญ ์ ํด๋น ์์์ ์ ์์ฑ๋ ๋ชจ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋๋ก ํ๊ธฐ
- ์ธ๋ค์ผ์ ๋๋ฅด๊ณ ์์์ ์์ ์์ ์๋ ์ฌ์
- ์ธ๋ค์ผ ํด๋ฆญ์ ํด๋น ๋ํ ์ผ ๋ฆฌ๋ทฐ ํ์ด์ง๋ก ์ด๋
- ์ง๋ ์ถ์์ ๋ง์ปค๋ฅผ ํด๋ฌ์คํฐ ๊ฐฏ์๋ก ๋ชจ์ ํ๊ธฐ
-
๊ฒ์ ์ง๋
- ๋ด ์์น ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ๊ฐ๊น์ด ์์์ ์ ๊ฒ์ํ์ฌ ์ง๋์์ ๋ง์ปค์ ๋ฆฌ์คํธ๋ก ํ๊ธฐ
- ๋ฆฌ์คํธ๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ๋ง์ปค๋ฅผ ํด๋ฆญํ๋ฉด ํด๋น ์์์ ์ ์ฅ์ ๋ฐ ์ ๋ณด๋ฅผ ์ ์ฅ
๋ด๊ฐ ์์ฑํ ๋ฆฌ๋ทฐ๋ฅผ ์ต์ ์, ๋ฉ๋ด๋ณ๋ก ํ์ธ
-
์ ์ ํ์ด์ง
- ์์ฑํ ๋ฆฌ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋๋ก ๋ณด๊ธฐ ํธํ๊ฒ ๊ตฌํ
- ์ธ๋ค์ผ์ ๋๋ฅด๊ณ ์์์ ์์ ์์ ์๋ ์ฌ์
- ์ธ๋ค์ผ ํด๋ฆญ์ ํด๋น ๋ํ ์ผ ๋ฆฌ๋ทฐ ํ์ด์ง๋ก ์ด๋
-
์ ์ ์ ๋ณด ๋ณ๊ฒฝ
-
๊ณ์ ์ค์ ์์ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์ธ์ง ๋ ธ์ถ
-
๋๋ค์, ํ์ค ์๊ฐ, ์ ์ ํ๋กํ ์๋ฐํ ๋ณ๊ฒฝ
-
๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ๊ธฐ๋ฅ
-
์๋ก์ด ๋ง์ง์ ์ฐพ๊ฒ ๋ ๊ธฐ์จ์ ๋๋๊ฑฐ๋ ๋๋ง ์๊ณ ์๋ ๋ง์ง์ ์ฃผ๋ณ์ ๊ณต์ ํ๊ณ ์ถ์ ๋ ์ธ์น์ธ์!
- ๋ง์๋ ์๋น์ ์ฃผ๋ณ์ ์ค์๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ
- ์ ๋ ์นด
- ์ข์์, ์ซ์ด์ ๋ฐ์ ๋๋ง๋ค ํผ๋ ๊ฒ์ ์๊ฐ ์ฆ๊ฐ, ๊ฐ์
- ์ ๊ธฐ๋ฅ๋ค์ ํ๋ฃจ์ ์ ํด์ง ์ถฉ์ ๋์ ์๋ชจ์ํค๋ฉด์ ์ํ ๊ฐ๋ฅ
- 4๊ฐ์ง ๋ฉ์ธ์ง๋ฅผ ์ ํํด์ ๋ค๋ฅธ ์ ์ ์ ์ํต
- ํ์ฌ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฃผ๋ณ 1km์ ์ ์ ์ ์ํต ๊ฐ๋ฅ
์์ ์์๊ณผ ๊ฐ๋จ ๋ฆฌ๋ทฐ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ