๋ฐ๋ณต COUNT ์ฟผ๋ฆฌ์ ์ง์ฐ ๋ก๋ฉ ์ถ๊ฐ ์กฐํ๋ฅผ ์ต์ ํํ ๊ณผ์
๋ชฉ์ฐจ
1. ์์ ๋ฐฐ๊ฒฝ
์ด ์์ ์ ์ปค๋ฎค๋ํฐ ์๋น์ค ํ๋ก์ ํธ์ ์กฐํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ ์งํํ๋ค. ์ฌ์ฉ์๋ ๊ฒ์ํ ๋ชฉ๋ก์์ ๊ฐ ๊ฒ์ํ์ ๊ฒ์๊ธ ์๋ฅผ ํ์ธํ ์ ์๊ณ , ๊ฒ์๊ธ ์์ธ ํ๋ฉด์์๋ ๋ณธ๋ฌธ๊ณผ ํจ๊ป ๊ฒ์ํ, ์นดํ ๊ณ ๋ฆฌ, ์์ฑ์, ๋๊ธ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋๋ก ๊ตฌํํ๋ค.
๋์ ๊ธฐ๋ฅ์ GET /boards ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ์ GET /posts/{postId} ๊ฒ์๊ธ ์์ธ ์กฐํ์๋ค. ๊ธฐ๋ฅ ๊ตฌํ ํ SQL ์คํ ๊ตฌ์กฐ๋ฅผ ์ ๊ฒํ ๊ฒฐ๊ณผ, ์กฐํ ๊ฒฐ๊ณผ๋ฅผ DTO๋ก ์กฐ๋ฆฝํ๋ ๊ณผ์ ์์ ๋์ผํ ๋ชฉ์ ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ๋ณต๋๊ฑฐ๋ ์ง์ฐ ๋ก๋ฉ๋ ์ฐ๊ด ์ํฐํฐ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์กฐํํ๋ ๋ฌธ์ ๊ฐ ํ์ธ๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ๊ฒ์ํ ๋ชฉ๋ก์์๋ ๊ฐ ๊ฒ์ํ์ ๊ฒ์๊ธ ์๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ๊ฒ์ํ๋ง๋ค COUNT ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ์์๋ค. ๊ฒ์๊ธ ์์ธ ์กฐํ์์๋ Post๋ฅผ ๋จผ์ ์กฐํํ ๋ค Board, Category, Author์ ์ ๊ทผํ๋ฉด์ ์ถ๊ฐ ์กฐํ๊ฐ ๋ฐ์ํ๋ค. ๋ ์กฐํ ๊ธฐ๋ฅ์ ๋ฌธ์ ์์ธ์ด ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ ์ผ๊ด ์ง๊ณ์ ์ฐ๊ด ์ํฐํฐ ๋์ ์กฐํ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ๋ค.
์๋ SQL์ ๋น์ ๋จ๊ฒจ ๋ ์ฟผ๋ฆฌ ์์ ์คํ ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ๋จ์ํํ ์์๋ค. ์ค์ Hibernate SQL ๋ก๊ทธ์ ์ ์ฒด ์ปฌ๋ผ๊ณผ ๋ณ์นญ์ ๊ทธ๋๋ก ์ฎ๊ธด ๊ฒ์ ์๋๋ค.
2. ๊ฒ์ํ ๋ชฉ๋ก์ COUNT ์ฟผ๋ฆฌ N+1
GET /boards๋ ์ญ์ ๋์ง ์์ ๊ฒ์ํ ๋ชฉ๋ก๊ณผ ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ์๋ฅผ ํจ๊ป ๋ฐํํ๋ API๋ค. ์ด๊ธฐ ๊ตฌํ์์๋ ๊ฒ์ํ ๋ชฉ๋ก์ ๋จผ์ ์กฐํํ ๋ค, ๊ฐ ๊ฒ์ํ์ DTO๋ก ๋ณํํ๋ฉด์ ๊ฒ์๊ธ ์๋ฅผ ๊ฐ๋ณ ์กฐํํ๋ค.
// BoardService
public List<BoardResponse> getAllBoards() {
return boardRepository.findAllByIsDeletedFalse()
.stream()
.map(board -> BoardResponse.from(
board,
postRepository.countByBoardIdAndIsDeletedFalse(
board.getId()
)
))
.toList();
}
๊ฒ์ํ์ด 3๊ฐ๋ผ๋ฉด ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ 1ํ์ ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ์ ์กฐํ 3ํ๊ฐ ์คํ๋๋ค. ๊ฒ์ํ ์๋ฅผ N์ด๋ผ๊ณ ํ๋ฉด ์ ์ฒด ์ฟผ๋ฆฌ ์๋ 1 + Nํ๊ฐ ๋๋ค.
-- ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ
SELECT *
FROM boards
WHERE is_deleted = false;
-- ๊ฐ ๊ฒ์ํ์ ๊ฒ์๊ธ ์๋ฅผ ๊ฐ๋ณ ์กฐํ
SELECT COUNT(*)
FROM post
WHERE board_id = 1
AND is_deleted = false;
SELECT COUNT(*)
FROM post
WHERE board_id = 2
AND is_deleted = false;
SELECT COUNT(*)
FROM post
WHERE board_id = 3
AND is_deleted = false;
| ๊ฒ์ํ ์ | ๋ชฉ๋ก ์กฐํ | COUNT ์กฐํ | ์ ์ฒด ์ฟผ๋ฆฌ ์ |
|---|---|---|---|
| 3๊ฐ | 1ํ | 3ํ | 4ํ |
| N๊ฐ | 1ํ | Nํ | 1 + Nํ |
์ด ๊ตฌ์กฐ๋ ๊ฒ์ํ ์๊ฐ ์ฆ๊ฐํ ์๋ก COUNT ์ฟผ๋ฆฌ๋ ๊ฐ์ ๋น์จ๋ก ์ฆ๊ฐํ๋ค. ๊ฐ๋ณ ๊ฒ์ํ์ ๊ฒ์๊ธ ์๋ฅผ ์กฐํํ๋ ๊ธฐ๋ฅ ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ชฉ๋ก API์์ ๋ฐ๋ณต ํธ์ถํ๋ ๋ฐฉ์์ด ๋นํจ์จ์ ์ด์๋ค.
3. GROUP BY ๊ธฐ๋ฐ ์ผ๊ด ์ง๊ณ๋ก ๊ฐ์
๊ฒ์ํ๋ง๋ค ๊ฒ์๊ธ ์๋ฅผ ๋ฐ๋ก ๊ณ์ฐํ๋ ๋์ , ์ ์ฒด ๊ฒ์ํ์ ๊ฒ์๊ธ ์๋ฅผ ํ ๋ฒ์ ์ง๊ณ ์ฟผ๋ฆฌ๋ก ์กฐํํ๋๋ก ๋ณ๊ฒฝํ๋ค.
// PostRepository
@Query("""
SELECT p.board.id, COUNT(p)
FROM Post p
WHERE p.isDeleted = false
GROUP BY p.board.id
""")
List<Object[]> countByBoardGrouped();
Repository๋ ๊ฒ์ํ ID์ ๊ฒ์๊ธ ์๋ฅผ ํ ๋ฒ์ ๋ฐํํ๋ค. Service์์๋ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ Map<Long, Long>์ผ๋ก ๋ณํํ ๋ค, ๊ฒ์ํ DTO๋ฅผ ์์ฑํ ๋ ๊ฒ์ํ ID๋ก ๊ฒ์๊ธ ์๋ฅผ ์กฐํํ๋๋ก ๊ตฌ์ฑํ๋ค.
// BoardService
public List<BoardResponse> getAllBoards() {
List<Board> boards =
boardRepository.findAllByIsDeletedFalse();
Map<Long, Long> postCountMap =
postRepository.countByBoardGrouped()
.stream()
.collect(Collectors.toMap(
row -> (Long) row[0],
row -> (Long) row[1]
));
return boards.stream()
.map(board -> BoardResponse.from(
board,
postCountMap.getOrDefault(
board.getId(),
0L
)
))
.toList();
}
๋ณ๊ฒฝ ํ์๋ ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ 1ํ์ ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ์ ์ง๊ณ 1ํ๋ง ์คํ๋๋ค. ๊ฒ์ํ ์์ ๊ด๊ณ์์ด ์ฟผ๋ฆฌ ์๊ฐ 2ํ๋ก ๊ณ ์ ๋๋ค.
-- ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ
SELECT *
FROM boards
WHERE is_deleted = false;
-- ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ์๋ฅผ ํ ๋ฒ์ ์ง๊ณ
SELECT board_id, COUNT(id)
FROM post
WHERE is_deleted = false
GROUP BY board_id;
- ๋ณ๊ฒฝ ์ : ๊ฒ์ํ 3๊ฐ ๊ธฐ์ค 4ํ ์กฐํ
- ๋ณ๊ฒฝ ํ: ๊ฒ์ํ ์์ ๊ด๊ณ์์ด 2ํ ์กฐํ
- ์ฟผ๋ฆฌ ์ฆ๊ฐ ๊ตฌ์กฐ:
1 + Nํ์์ ๊ณ ์ 2ํ๋ก ๋ณ๊ฒฝ - ๊ฒ์๊ธ์ด ์๋ ๊ฒ์ํ์
getOrDefault(..., 0L)๋ก ์ฒ๋ฆฌ
4. ๊ฒ์๊ธ ์์ธ ์กฐํ์ ์ง์ฐ ๋ก๋ฉ ์ถ๊ฐ ์ฟผ๋ฆฌ
GET /posts/{postId}๋ ๊ฒ์๊ธ ๋ณธ๋ฌธ๋ฟ ์๋๋ผ ๊ฒ์ํ, ์นดํ
๊ณ ๋ฆฌ, ์์ฑ์ ์ ๋ณด์ ๋๊ธ ๋ชฉ๋ก์ ํจ๊ป ๋ฐํํ๋ค. ์ด๊ธฐ ๊ตฌํ์์๋ findById()๋ก ๊ฒ์๊ธ๋ง ์กฐํํ ๋ค DTO ์์ฑ ๊ณผ์ ์์ ์ฐ๊ด ์ํฐํฐ์ ์ ๊ทผํ๋ค.
// PostService
public PostDetailResponseDto getPostById(
Long postId,
String email
) {
Post post = postRepository.findById(postId)
.orElseThrow(() ->
new EntityNotFoundException(
"์กด์ฌํ์ง ์๋ ๊ฒ์๊ธ์
๋๋ค."
)
);
// DTO ์์ฑ ๊ณผ์ ์์ board, category, author ์ ๊ทผ
...
}
board, category, author๊ฐ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฉด ์ค์ ์ ๊ทผ ์์ ์ ๋ณ๋ ์กฐํ๊ฐ ๋ฐ์ํ๋ค. ๋น์ ๊ธฐ๋ก์ ๊ฒ์๊ธ ์์ธ ์กฐํ๋ ์ ์ฒด 5ํ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
-- Post ์กฐํ
SELECT *
FROM post
WHERE id = 1;
-- Board ์ง์ฐ ๋ก๋ฉ
SELECT *
FROM boards
WHERE id = 1;
-- Category ์ง์ฐ ๋ก๋ฉ
SELECT *
FROM category
WHERE id = 1;
-- ๋ฃจํธ ๋๊ธ ์กฐํ
SELECT *
FROM comments
WHERE post_id = 1
AND parent_id IS NULL;
-- ๋๋๊ธ ์ผ๊ด ์กฐํ
SELECT *
FROM comments
WHERE parent_id IN (?, ?, ?);
๊ฒ์๊ธ ํ ๊ฑด์ ์กฐํํ๋ API์ด๋ฏ๋ก ์ด ์ฌ๋ก๋ฅผ ๋ชฉ๋ก ๊ธฐ๋ฐ์ ์ ํ์ ์ธ N+1 ๋ฌธ์ ๋ผ๊ณ ํํํ๊ธฐ๋ ์ด๋ ต๋ค. ๋ค๋ง ์์ธ ์๋ต์ ๋ฐ๋์ ํ์ํ ์ฐ๊ด ์ํฐํฐ๋ฅผ ๊ฐ๋ณ ์ฟผ๋ฆฌ๋ก ์กฐํํ๊ณ ์์๊ธฐ ๋๋ฌธ์, ํ ๋ฒ์ ์กฐํ๋ก ํตํฉํ ์ ์๋ ์ถ๊ฐ ๋น์ฉ์ด ๋ฐ์ํ๊ณ ์์๋ค.
5. EntityGraph๋ฅผ ์ด์ฉํ ์ฐ๊ด ์ํฐํฐ ๋์ ์กฐํ
์์ธ ์๋ต์ ํญ์ ํ์ํ board, category, author๋ฅผ ํ ๋ฒ์ ์กฐํํ๊ธฐ ์ํด Repository ๋ฉ์๋์ @EntityGraph๋ฅผ ์ ์ฉํ๋ค.
// PostRepository
@EntityGraph(
attributePaths = {
"board",
"category",
"author"
}
)
Optional<Post> findWithDetailsById(Long id);
Service์์๋ ๊ธฐ์กด์ findById() ๋์ findWithDetailsById()๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ๋ค.
// PostService
public PostDetailResponseDto getPostById(
Long postId,
String email
) {
Post post =
postRepository.findWithDetailsById(postId)
.orElseThrow(() ->
new EntityNotFoundException(
"์กด์ฌํ์ง ์๋ ๊ฒ์๊ธ์
๋๋ค."
)
);
...
}
์ ์ฉ ํ์๋ Post, Board, Category, Author๊ฐ ์กฐ์ธ๋ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ์กฐํ๋๋ค. ๋๊ธ ํธ๋ฆฌ ์กฐํ๋ ๋ณ๋ ์กฐํ ์ ๋ต์ ์ ์งํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ฟผ๋ฆฌ ์๋ 5ํ์์ 3ํ๋ก ์ค์๋ค.
-- Post์ ์์ธ ์๋ต์ ํ์ํ ์ฐ๊ด ์ํฐํฐ ๋์ ์กฐํ
SELECT ...
FROM post p
LEFT JOIN users u
ON u.id = p.author_id
LEFT JOIN boards b
ON b.id = p.board_id
LEFT JOIN category c
ON c.id = p.category_id
WHERE p.id = 1;
-- ๋ฃจํธ ๋๊ธ ์กฐํ
SELECT *
FROM comments
WHERE post_id = 1
AND parent_id IS NULL;
-- ๋๋๊ธ ์ผ๊ด ์กฐํ
SELECT *
FROM comments
WHERE parent_id IN (?, ?, ?);
๊ฒ์๊ธ์ ๋ค๋์ผ ์ฐ๊ด๊ด๊ณ์ ๋๊ธ ์ปฌ๋ ์ ์ ํ ์ฟผ๋ฆฌ์์ ๋ชจ๋ ์กฐ์ธํ๋ฉด ๊ฒฐ๊ณผ ํ์ด ์ค๋ณต๋ ์ ์๊ณ , ๋๊ธ ํธ๋ฆฌ ๊ตฌ์ฑ๋ ๋ณต์กํด์ง ์ ์๋ค. ์ด๋ฒ ์์ ์์๋ ๊ฒ์๊ธ์ ๋จ๊ฑด ์ฐ๊ด ์ํฐํฐ ์กฐํ๋ง ํตํฉํ๊ณ , ๋ฃจํธ ๋๊ธ๊ณผ ๋๋๊ธ ์กฐํ๋ ๊ธฐ์กด์ ๋ ๋จ๊ณ ์กฐํ๋ฅผ ์ ์งํ๋ค.
6. ๋ณ๊ฒฝ ์ ํ ๊ฒฐ๊ณผ
| API | ๋ฌธ์ | ๊ฐ์ ๋ฐฉ์ | ๋ณ๊ฒฝ ์ | ๋ณ๊ฒฝ ํ |
|---|---|---|---|---|
GET /boards |
๊ฒ์ํ๋ง๋ค ๊ฒ์๊ธ ์ ๊ฐ๋ณ ์กฐํ | GROUP BY ์ผ๊ด ์ง๊ณ |
๊ฒ์ํ 3๊ฐ ๊ธฐ์ค 4ํ | 2ํ |
GET /posts/1 |
์ง์ฐ ๋ก๋ฉ๋ ์ฐ๊ด ์ํฐํฐ ์ถ๊ฐ ์กฐํ | @EntityGraph ์ ์ฉ |
5ํ | 3ํ |
๊ฒ์ํ ๋ชฉ๋ก์ ๋ฐ์ดํฐ ๊ฐ์์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๊ฐ ์ฆ๊ฐํ๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ฑฐํ๋ค๋ ์ ์ด ํต์ฌ์ด๋ค. ๊ฒ์ํ์ด ๋์ด๋๋ ๊ฒ์ํ ๋ชฉ๋ก๊ณผ ์ง๊ณ ์ฟผ๋ฆฌ ๋ ๋ฒ๋ง ์คํ๋๋ค.
๊ฒ์๊ธ ์์ธ ์กฐํ๋ ์์ธ ์๋ต์์ ํญ์ ์ฌ์ฉํ๋ ๋จ๊ฑด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋ฏธ๋ฆฌ ์กฐํํ๋๋ก ๋ณ๊ฒฝํ๋ค. ๊ฒ์๊ธ๊ณผ ๊ฒ์ํ, ์นดํ ๊ณ ๋ฆฌ, ์์ฑ์๋ฅผ ํ๋์ ์ฟผ๋ฆฌ๋ก ๊ฐ์ ธ์ค๋ฉด์ ๋ถํ์ํ ์ถ๊ฐ ์กฐํ๋ฅผ ์ค์๋ค.
- ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ์ ์กฐํ๋ฅผ
1 + Nํ์์ ๊ณ ์ 2ํ๋ก ์ถ์ํ๋ค. - ๊ฒ์๊ธ ์์ธ ์กฐํ๋ฅผ 5ํ์์ 3ํ๋ก ์ถ์ํ๋ค.
- ๋ชฉ๋ก ์ง๊ณ์ ๋จ๊ฑด ์ฐ๊ด ์กฐํ์ ๋ฌธ์ ์ฑ๊ฒฉ์ ๊ตฌ๋ถํด ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค.
- ๋๊ธ ํธ๋ฆฌ ์กฐํ๋ ๋ณ๋ ์ ๋ต์ ์ ์งํด ์กฐ์ธ ์ค๋ณต๊ณผ ์๋ต ์กฐ๋ฆฝ ๋ณต์ก๋๋ฅผ ํผํ๋ค.
7. ์ ๋ฆฌ ๋ฐ ๋ฐฐ์ด ์
์ด๋ฒ ์์ ์ ํตํด N+1 ๋ฌธ์ ๋ ์ฐ๊ด๊ด๊ณ ์ง์ฐ ๋ก๋ฉ์์๋ง ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ, ๋ชฉ๋ก์ ์ํํ๋ฉด์ Repository ๋ฉ์๋๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ ์๋น์ค ๋ก์ง์์๋ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ํ์ธํ๋ค.
๊ฒ์ํ ๋ชฉ๋ก์์๋ ๊ฐ ๊ฒ์ํ์ ๊ฒ์๊ธ ์๋ฅผ ๊ฐ๋ณ ์กฐํํ๋ ์ฝ๋๊ฐ ์ง์ ์ ์ธ ์์ธ์ด์๋ค. ๋จ์ํ ์ฐ๊ด๊ด๊ณ์ fetch ์ ๋ต์ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก๋ ํด๊ฒฐํ ์ ์์๊ณ , ํ์ํ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ GROUP BY๋ก ํ ๋ฒ์ ์กฐํํ๋ ๋ฐฉ์์ด ์ ์ ํ๋ค.
๋ฐ๋ฉด ๊ฒ์๊ธ ์์ธ ์กฐํ์์๋ ์๋ต์ ํ์ํ ์ฐ๊ด ์ํฐํฐ๊ฐ ๋ช
ํํ๊ธฐ ๋๋ฌธ์ @EntityGraph๋ฅผ ์ด์ฉํด ์กฐํ ์์ ์ ํจ๊ป ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด ์ ํฉํ๋ค. ๋ชจ๋ ์ฐ๊ด๊ด๊ณ๋ฅผ ํญ์ ์ฆ์ ๋ก๋ฉํ๋๋ก ๋ณ๊ฒฝํ์ง ์๊ณ , ํน์ ์กฐํ ๋ฉ์๋์๋ง ๋ก๋ฉ ์ ๋ต์ ์ ์ฉํด ์ฌ์ฉ ๋ฒ์๋ฅผ ์ ํํ๋ค.
๋ํ ์ฟผ๋ฆฌ ์๊ฐ ๋ง๋ค๊ณ ํด์ ๋ชจ๋ ์กฐํ๋ฅผ ํ๋์ ์ฟผ๋ฆฌ๋ก ํฉ์น๋ ๊ฒ์ด ํญ์ ์ ์ ํ ๊ฒ์ ์๋๋ค. ํนํ ์ปฌ๋ ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ํจ๊ป ์กฐ์ธํ๋ฉด ์ค๋ณต ํ๊ณผ ํ์ด์ง ์ ์ฝ์ด ๋ฐ์ํ ์ ์๋ค. ์ด๋ฒ ์์ ์์๋ ๋จ๊ฑด ์ฐ๊ด๊ด๊ณ์ ๋๊ธ ํธ๋ฆฌ ์กฐํ๋ฅผ ๋ถ๋ฆฌํด, ํ์ํ ๋ฒ์์์๋ง ์ฟผ๋ฆฌ๋ฅผ ํตํฉํ๋ค.
์ ๋ฆฌํ๋ฉด ์ด๋ฒ ์ต์ ํ๋ ๊ฒ์ํ๋ณ ๋ฐ๋ณต ์ง๊ณ๋ฅผ ์ผ๊ด ์ง๊ณ๋ก ๋ณ๊ฒฝํ๊ณ , ์์ธ ์กฐํ์ ํ์ํ ๋จ๊ฑด ์ฐ๊ด๊ด๊ณ๋ง ์ ํ์ ์ผ๋ก ํจ๊ป ์กฐํํ ์์ ์ด์๋ค. ์ฟผ๋ฆฌ ์๋ฅผ ์ค์ด๋ ๊ฒ๋ฟ ์๋๋ผ ์กฐํ ๋ชฉ์ ๊ณผ ์ฐ๊ด๊ด๊ณ ํํ์ ๋ง๋ ํด๊ฒฐ ๋ฐฉ์์ ์ ํํ๋ ๊ณผ์ ์ด ์ค์ํ๋ค.