- ์คํ๋ง์ ์๋ฐ๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด
- ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์๋ฐ์ ๋ชฉํ โ ์บก์ํ/์์/๋คํ์ฑ์ ํ์ฉํ๋ ๊ฒ
- ๊ด๊ณํ DB์ ๋ชฉํ โ ๋ฐ์ดํฐ๋ฅผ ์ ๊ตํ๊ฒ ๊ตฌ์ฑํ๋ ๊ฒ
- ์ฆ, ์คํ๋ง ๋ถํธ๋ฅผ ํ์ฉํ๊ธฐ ์ํด CRUD ์ฟผ๋ฆฌ๋ฅผ ๋ค ์ง๊ณ , ์๋ฐ ์ฝ๋๋ฅผ SQL๋ก ๋ฐ๊พธ๊ณ SQL์ฟผ๋ฆฌ๋ฅผ ์๋ฐ๋ก ๋ฐ๊พธ๋ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ด ํ์ํ๋ค
- DB์์ ์กฐํํ ํ ์ด๋ธ ํ์์ ๋ฐ์ดํฐ๋ค์ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ณผ์ ์ด ํ์ํ๊ณ ๋ณ๊ฒฝ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ค์ SQL๋ก ๋ณํํ์ฌ ๊ด๊ณํ DB์ ๋ฐ์ํด์ผ ํ๋ค
- ์๋ฐ ์ง์์์ ORM(๊ฐ์ฒด ๊ด๊ณํ ๋งคํ) ๊ธฐ์ ์ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค์ ๋ชจ์
- ORM : ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค์ ๊ด๊ณํ DB์ ํ ์ด๋ธ์ ๋งคํ(์ฐ๊ฒฐ)ํ๋ ๊ธฐ์
- ์ฆ, JPA๋ฅผ ์ฌ์ฉํจ์ผ๋ก์ ๋ฐ๋ณต์ ์ธ CRUD SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์งค ํ์๊ฐ ์์ด ์๋์ผ๋ก ๋งคํํ์ฌ ๋ ๋ ค์ค๋ค
- ์ธํฐํ์ด์ค์ ๋ชจ์์ธ ๋ง๋ ์ค์ ๋ก ๊ตฌํ๋๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ ํด๋์ค์ ๋งคํ์ ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ์ด๋ค
๋ํ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค
- ํ์ฌ๋ ํจํด ๊ตฌ์กฐ
- ๋๋ฉ์ธํ ๊ตฌ์กฐ
- ๊ณ์ธตํ ๊ตฌ์กฐ
- ํฅ์ฌ๊ณ ๋ ๊ตฌ์กฐ
๊ฐ ๊ตฌ์กฐ์๋ ๋ชจ๋ ๊ฐ์์ ์ฅ๋จ์ ์ด ์กด์ฌํ๋ค. ๊ทธ ์ค ๋๋ฉ์ธํ ๊ตฌ์กฐ๋ ERD๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋ฉ์ธ์ ๋ง๋ค๊ธฐ ์ฝ๊ณ , ํ์ ์ ๋๋ฉ์ธ๋ณ๋ก ์ญํ ์ ๋ถ๋ดํ๊ธฐ๋ ์ฝ๋ค
- ๋ง๋ค์ด์ง DRD์ ๋๋ฉ์ธ์ ์ดํด๋ณด๋ฉด ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋๊ฒ ๋๋ค. ์ฌ์ฉ์, ๋ฏธ์ , ๋ฆฌ๋ทฐ, ๊ฐ๊ฒ์ด๋ค
- ์ด๊ฑธ ๊ธฐ์ค์ผ๋ก ์์ฑ๋ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค
project root
โโโ domain
โ โโโ member
โ โโโ mission
โ โโโ review
โ โโโ store
โ โโโ controller
โ โโโ converter : DTO โ Entity ๊ฐ์ ๋ณํ์ ๋ด๋น (์๋น์ค ๋ ์ด์ด๊ฐ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์๋๋ก ํจ)
โ โโโ dto
โ โโโ entity
โ โโโ repository
โ โโโ service
โโโ global : ์ ์ญ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด(์ค์ , ์์ธ ์ฒ๋ฆฌ ๋ฑ)๋ฅผ ๋ด๋ ๋๋ ํ ๋ฆฌ
์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์ ์ ์๋์ ๊ฐ๋ค
@Entity: ํด๋น ํด๋์ค๊ฐ JPA์ ์ํฐํฐ์์ ์๋ฏธ@Table: DB์ ํ ์ด๋ธ์ ์ ์. (name="member") ๋ฑ์ผ๋ก ํ ์ด๋ธ์ ์ด๋ฆ์ ๋ช ์ํ๋ ๋ฑ์ ์ต์ ์ ์ฌ์ฉํ ์ ์์@Id: ํด๋น ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ํด๋น ์ํฐํฐ์ PK๋ผ๋ ๊ฒ์ ์๋ฏธ@GeneratedValue: ์ฃผ๋ก id ํ๋์ ํจ๊ป ์ฌ์ฉ. ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์๋๋ผ๋ ์๋์ผ๋ก ๋ฒํธ๊ฐ ์์ฑ๋จ@Column: ํด๋น ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ํด๋น ์ํฐํฐ์ ์นผ๋ผ์ด๋ผ๋ ๊ฒ์ ์๋ฏธ. (name="gender") ๋ฑ์ผ๋ก ์นผ๋ผ๋ช ์ ๋ช ์ํ๋ ๋ฑ์ ์ต์ ์ ์ฌ์ฉํ ์ ์์@Enumerated: Enum์ ์ฌ์ฉํ ๋, ๋ฐ์ดํฐ์ ํํ๋ฅผ ๋ช ์ํ@NoArgsConstructor: ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. JPA ์ํฐํฐ๋ ๋ด๋ถ์ ์ผ๋ก ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํ์๋ก ํ๋ฏ๋ก ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ฐ๋์ ์์ฑํด์ผ ํ๋ค. ๋ค๋ง ๊ฐ๋ฐ์๋ ๊ธฐ๋ณธ ์์ฑ์๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ผ์ด ๊ฑฐ์ ์์ผ๋ฏ๋ก (access = AccessLevel.PROTECTED) ์ต์ ์ ์ด์ฉํด ๊ธฐ๋ณธ ์์ฑ์๋ฅผ protected๋ก ์ฒ๋ฆฌํ๋ค
DBMS ๋ด๋ถ์์ ์์ฝ์ด, ํค์๋๋ก ์์ฝ๋ ๋จ์ด(ex. User)๋ฅผ ๋ด ํ๋ก์ ํธ์ ํด๋์ค๋ช ์ด๋ ์นผ๋ผ๋ช ์ผ๋ก ์ฐ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค!
// ์ด๋ฆ ์นผ๋ผ์ 3๊ธ์๋ก ์ ํ๋๋ฉฐ null๊ฐ์ ๋ฃ์ ์ ์๋ค
@Column(length = 3, nullabel = false)
private String name;// ์ด๋ฆ ์นผ๋ผ์ ๋ฌธ์์ด Enum ํด๋์ค์ ๊ฐ์ ๊ฐ๋๋ค
// null๊ฐ์ ๋ฃ์ ์ ์์ผ๋ฉฐ ๊ฐ์ ๋ฃ์ง ์์ ๊ฒฝ์ฐ NONE์ผ๋ก ์ด๊ธฐํ๋๋ค
@Column(nullabel = false)
@Enumerated(EnumType.STRING)
@Builder.Default // lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์
private Gender gender = Gender.NONE;์ด๋ @Buileder.Default๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋จ ํด๋์ค์ @Builder ์ด๋ ธํ ์ด์ ์ ๋ช ์ํด์ผ ํ๋ค
// ์์ฑ ์ผ์
@CreatedDate
@Column(nullabel = false)
private LocalDateTime createAt;// ์์ ์ผ์
@LastModifiedDate
@Column(nullabel = false)
private LocalDateTime updateAt;์ด๋ @CreatedDate์ @LastModifiedDate๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋จ ํด๋์ค์ @EnableJpaAuditing์ @EntityListeners(AuditingEntityListener.class) ์ด๋ ธํ ์ด์ ์ ๋ช ์ํด์ผ ํ๋ค
- ๋ง์ฝ CreatedAt, UpdatedAt์ฒ๋ผ ๋ชจ๋ ์ํฐํฐ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์ฌ์ฉ๋๋ค๋ฉด BaseEntity ์ค์ ์ ์ฌ์ฉํ ์ ์๋ค
- BaseEntity ํด๋์ค๋ฅผ ๋ง๋ค์ด ๊ณตํต๋ ์์ฑ์ ์ ์ํ๊ณ ์ํ๋ ํด๋์ค์์ extends BaseEntity ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค
- ์ผ๋ฐ์ ์ธ ์นผ๋ผ์ ์กฐ์ธ ์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ๋งคํํ๋ ๊ฒ(user_name, shop_name ๋ฑ)์ด ์ผ๋ฐ์ ์ด์ง๋ง BaseEntity์ ๊ณตํต ์ปฌ๋ผ์ ๋ชจ๋ ์ํฐํฐ์์ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฏ๋ก ์ผ๊ด์ฑ์ ์ํด ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํด๋ ๋ฌธ์ ๊ฐ ์๋ค
- ๋ํ created_at์ด๋ updated_at ๊ฐ์ Auditing ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ๋๋ฒ๊น ํ ๋ ์ ์ฉํ ๋ฉํ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์, ๋ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ๋ ์กฐ์ธ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋ ์ผ์ด ์๋ค
- N:M ์ฐ๊ด๊ด๊ณ์ ๊ฒฝ์ฐ ์ค๊ฐ ํ ์ด๋ธ์ ์์ฑํ๊ณ ๊ทธ๊ณณ์์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ง์ ํ๋ค
@OneToOne: 1:1 ์ฐ๊ด๊ด๊ณ ์ค์ @ManyToOne: 1:N ๊ด๊ณ์์ ์ด ์ํฐํฐ๊ฐ N์์ ์ ์ํ๋ค@JoinColumn: ํด๋น ์ด๋ ธํ ์ด์ ์ ๊ฐ์ง ํด๋์ค(ํ ์ด๋ธ)์ด ์ด ์ฐ๊ด ๊ด๊ณ์ ์ฃผ์ธ์์(FK์ ์ฃผ์ธ์์) ์ค์ ํ๋ค- ์ด๋ ~ToOne์ ๊ฒฝ์ฐ @JoinColumn์์ (fatch = FetchType.LAZY)๋ฅผ ๋ช ์ํด ์ง์ฐ ๋ก๋ฉ์ ์ค์ ํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค
- ๋งคํ ๋นํ๋ ์ชฝ์ ๊ฒฝ์ฐ @OneToOne ๋ฑ์ ์ด๋ ธํ ์ด์ ์์ (mappedBy = โreply")๋ฅผ ๋ช ์ํ๋ฉด ๋๋ค
FetchType.EAGER์ ์ค์ ํ๋ฉด, ํด๋น ์ํฐํฐ๋ฅผ ๋ก๋ฉํ ๋ ์ฐ๊ด๋(FK๋ก ๋ฌถ์ธ) ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ด์ฉ๊น์ง ์ฆ์ ํ ๋ฒ์ ๊ฐ์ด ๋ก๋ฉ๋๋ค- ์ด๋ ๊ฐ๋ฐ์๊ฐ ์ํ์ง ์๋ ๋ฐ์ดํฐ๊น์ง ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ฒ ๋ง๋ค์ด ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ํํ๋ค
- ๋ํ ORM(Object-Relational Mapping)์ ์ค๊ณ ์์น ์ค ํ๋์ธ ํ์ํ ๋ ํ์ํ ์ ๋ณด๋ง ๊ฐ์ ธ์จ๋ค๋ ์์น์ ์๋ฐฐํ๋ค
- ๋ฐ๋ผ์ JPA/ํ์ด๋ฒ๋ค์ดํธ์์๋ EAGER ๋์
FetchType.LAZY๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๊ถ์ฅํ๋ค
N+1 ๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก FetchType.LAZY์ผ ๋ ํํ ๋ฐ์ํ์ง๋ง FetchType.EAGER์์๋ ๋ฐ์ํ ์ ์๋ค.
- LAZY์ผ ๋ : ํ์ ๋ชฉ๋ก ํ ์ด๋ธ์ ๊ฐ์ ธ์ค๋ ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค โ ๊ฐ๋ฐ์๊ฐ ํ ์ด๋ธ ๋ด ๋ชจ๋ ํ์์ ์ ๊ทผํ๋ ค ํ๋ฉด JPA๋ ๊ฐ ์ํฐํฐ๋ง๋ค ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด N๋ฒ์ ์ถ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค โ ์ด 1 + N ๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ค
- EAGER์ผ ๋ :
FetchType.EAGER๋ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ก๋ฉํ์ง๋ง JPA ๊ตฌํ์ฒด(ํ์ด๋ฒ๋ค์ดํธ)๋ ์ด ์ฆ์ ๋ก๋ฉ์ ์ฒ๋ฆฌํ ๋ ๋ด๋ถ์ ์ผ๋ก N+1 ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์ฆ, ์์ LAZY์ ์์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค โ FetchType.EAGER์ N+1 ๋ฌธ์ ์ ํด๊ฒฐ์ฑ ์ด ์๋๋ฉฐ, ์คํ๋ ค ๊ฐ๋ฐ์์ ์๋์ ๋ฌ๋ฆฌ ๋๋์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๋ง๋ค ์ ์๋ค!
- FATCH JOIN์ N+1 ๋ฌธ์ ์ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์ง์ JPQL/QueryDSL๋ก JOIN FETCH ๊ตฌ๋ฌธ์ ์์ฑํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ ์ดํ๋ค
- ํ์ํ ํ ์ด๋ธ์ ์ ๋ณด๋ค์ join ํ ๊ฐ์ ธ์ด์ผ๋ก์จ 1๋ฒ์ ์ฟผ๋ฆฌ๋ก ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ฌ ์ ์๋ค
@EntityGraph๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ง์ JPQL์์ JOIN FETCH ๊ตฌ๋ฌธ์ ์์ฑํ์ง ์์๋ JPA ๊ตฌํ์ฒด(ํ์ด๋ฒ๋ค์ดํธ)๊ฐ@EntityGraph์ ์ ์๋ฅผ ๋ณด๊ณ ๊ฐ์ฅ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ(๋๋ถ๋ถ JOIN์ ์ฌ์ฉํ ์ฟผ๋ฆฌ)๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์คํํด์ค๋ค- JPQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ ํ์ ์์ด ๋ฉ์๋ ์ด๋ฆ์ด๋ ์ด๋ ธํ ์ด์ ์ผ๋ก N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ด ์ฝ๋๊ฐ ๊น๋ํด์ง๋ค
- ๊ทธ๋ฌ๋ ๋ณต์กํ ์กฐ๊ฑด ๋ฑ์ ๋์ ์ฟผ๋ฆฌ์์๋ FETCH JOIN์ ์ด์ฉํด ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์์ฑํ๋ ๊ฒ์ด ๋ ์ ํฉํ ์ ์๋ค
๊ฒฐ๋ก : N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋
FetchType.LAZY๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ํน์ ์ํฉ์์ ๋ง์ ์์ ์ฐ๊ด ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ FETCH JOIN ๋๋ @EntityGraph๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ์ฌ์ผ ํ๋ค
- ์๋ฐฉํฅ ๋งคํ์ ํ ๊ฒฝ์ฐ cascade ์ค์ ์ ํ ์ ์๋ค
- cascade๋ ํ ํ ์ด๋ธ์ ์์ , ์ญ์ ํ ๋ ์ฐ๊ด๋ ๋ชจ๋ ํ ์ด๋ธ์ ํจ๊ป ์์ , ์ญ์ ํ๋ ๊ธฐ๋ฅ์ด๋ค
- cascade ์ค์ ์์ ์ ํ ๊ฐ๋ฅํ ์ต์
์ ์๋์ ๊ฐ๋ค
- ALL: ๋ชจ๋ cascade ์์ ์ ํ
- DETACH: ์ํฐํฐ ๋ถ๋ฆฌ ์, ์ฐ๊ด ์ํฐํฐ๋ ๋ถ๋ฆฌ
- MERGE: ์ํฐํฐ ๋ณํฉ ์, ์ฐ๊ด ์ํฐํฐ๋ ๋ณํฉ
- PERSIST: ์ํฐํฐ ์ ์ฅ ์, ์ฐ๊ด ์ํฐํฐ๋ ์ ์ฅ
- REFRESH: ์ํฐํฐ ์๋ก๊ณ ์นจ ์, ์ฐ๊ด ์ํฐํฐ๋ ์๋ก๊ณ ์นจ
- REMOVE: ์ํฐํฐ ์ญ์ ์, ์ฐ๊ด ์ํฐํฐ๋ ์ญ์
- ๋จ๋ฐฉํฅ ๋งคํ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ์๋น์ค ํด๋์ค์์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ค์ ์ง์ ์ง์์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ค
- ๋๋ฉ์ธ, ๋ ํ์งํ ๋ฆฌ, ์๋น์ค, ์ปจํธ๋กค๋ฌ๋ก ๊ณ์ธต์ ๋๋๋ ์ ํต์ ์ธ ๋ฐฉ์
- ์๋ก์ด ๋๋ฉ์ธ ์ถ๊ฐ ์ ๋ชจ๋ ๊ณ์ธต์ ์ถ๊ฐ ํ์ผ์ด ํ์ํ๋ค
- ๊ฐ์ ์ญํ ์ ํ๋ ํ์ผ๋ค์ด ํ ํด๋์ ๋ชจ์ฌ์๋ค
- ๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค
- ์์ ํ๋ก์ ํธ์ ์ ํฉํ๋ค
- ์ดํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ์ ๋ฌด ๋จ์์ธ ๋๋ฉ์ธ, ์ฆ ๋ช ์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๋ ๋ฐฉ์
- ์๋ก์ด ๋๋ฉ์ธ ์ถ๊ฐ ์ ํด๋น ๋๋ฉ์ธ์ ํด๋๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก ๋ชจ๋ํ์ ์ ๋ฆฌํ๋ค
- ํ ๋ใ ๋ฉ์ธ์ ๋ชจ๋ ๊ด๋ จ ํ์ผ๋ค์ด ํ ํด๋์ ๋ชจ์ฌ ์๋ค
- ๊ฒฐํฉ๋๊ฐ ๋ฎ๊ณ ์์ง๋๊ฐ ๋๋ค
- ๋๊ท๋ชจ/๋ณต์ฐนํ ํ๋ก์ ํธ์ ์ ํฉํ๋ค
- ๋ง์ฝ ์ด๋ค ๋๋ฉ์ธ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฑฐ๋ ์์ ์ด ํ์ํ๋ฉด ํด๋น ๋๋ฉ์ธ์ ํด๋๋ง ์ด์ด ๋ชจ๋ ๊ด๋ จ ํ์ผ์ ์ฐพ์ ์ ์๋ค โ ์ ์ง๋ณด์์ ์ฉ์ด