10. ๐ก๏ธ ๊ฒฌ๊ณ ํ ์ฝ๋๋ฅผ ์ํ ํ ์คํธ ์ ๋ต๊ณผ ์๋ํ
๐ ๊ฐ์
๋จ์ ํ ์คํธ๋ถํฐ E2E ํ ์คํธ๊น์ง, ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ ํ ์คํธ ์ ๋ต๊ณผ ์๋ํ ํ๊ฒฝ์ ๋ง์คํฐํฉ๋๋ค.
๐ ์ด ๋ฉด์ ํญ๋ชฉ์ ๋ชฉํ
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 22๋ถ (ํต์ฌ ์์ฝ: 11๋ถ)
๐บ๏ธ ์ด ์ฑํฐ์ ํ๋ฆ
[๊ฐ๋
์ฌ์ ] โ [์ง๋ฌธ 1: ํ
์คํธ ํผ๋ผ๋ฏธ๋ & ์ ๋ต] โ [์ง๋ฌธ 2: ์ปดํฌ๋ํธ ํ
์คํธ (RTL)] โ [์ค์ ๋ณํ ์ง๋ฌธ]
๐ฏ ์ด ์ฑํฐ๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ์ ์ฐจ์ด์ ๊ฐ๊ฐ์ ์ ์ ํ ๋น์จ์ ๊ฒฐ์ ํฉ๋๋ค.
- '์ฌ์ฉ์ ์ค์ฌ'์ ํ
์คํธ๋ฅผ ์ํด
React Testing Library๋ฅผ ํ์ฉํ๋ ๋ฒ์ ์ตํ๋๋ค. - ํ๊ท ํ ์คํธ(Regression Test)๊ฐ ์ ์ง๋ณด์ ๋น์ฉ์ ์ด๋ป๊ฒ ์ค์ฌ์ฃผ๋์ง ์ดํดํฉ๋๋ค.
๐ ํต์ฌ ๊ฐ๋ ์ฌ์ (Concept Glossary)
1. ํ ์คํธ ํผ๋ผ๋ฏธ๋ (Testing Pyramid)
ํ๋จ(Unit)์ ๋ง๊ณ ์๋จ(E2E)์ ์ ์ ๊ตฌ์กฐ์ ํ ์คํธ ์ ๋ต์ ๋๋ค. ๋น์ฉ์ด ์ธ๊ณ ๋น ๋ฅธ ๋จ์ ํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ , ๋ณต์กํ๊ณ ๋๋ฆฐ ํตํฉ/E2E ํ ์คํธ๋ ํต์ฌ ํ๋ฆ์๋ง ์ง์คํฉ๋๋ค.
2. RTL (React Testing Library)
์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌํ(state, props)์ด ์๋๋ผ, ์ฌ์ฉ์๊ฐ ํ๋ฉด์์ ๋ณด๋ ๊ฒฐ๊ณผ๋ฌผ(text, role ๋ฑ)์ ์ค์ฌ์ผ๋ก ํ ์คํธํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ฝ๋ ๋ฆฌํฉํ ๋ง ์ ํ ์คํธ๊ฐ ๊นจ์ง์ง ์๋ ์์ ํจ์ ์ค๋๋ค.
3. ๋ชจํน (Mocking)
์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ถ API ๋์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌํ๋ ๊ธฐ์ ์ ๋๋ค. ์ธ๋ถ ํ๊ฒฝ์ ์์กดํ์ง ์๊ณ ํญ์ ์ผ๊ด๋ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ํ์์ ์ ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์ ): "์ํธ ๋! '์์๋ค ๋๊ธ' ๊ธฐ๋ฅ์ ํ๋ ๊ณ ์ณค๋๋ฐ ๋ฉ์ฉกํ๋ '๊ฒ์๊ธ ์์ '์ด ํฐ์ก์ด์! ๐ฑ ์ฌ๋์ด ์ผ์ผ์ด ๋ค ๋๋ฌ๋ณผ ์๋ ์๊ณ ... ํ ์คํธ ์ฝ๋ ์ง๋ฉด ์ง์ง ์ด๋ฐ ๊ฑฐ ๋ค ์ก์์ฃผ๋์?"
- ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ํ ์คํธ๋ '๋์ค์ ๊ท์ฐฎ์ง ์์ผ๋ ค๊ณ ์ง๊ธ ๊ท์ฐฎ์์ ๊ฐ์ํ๋ ์ผ'์ ๋๋ค. ํ ์คํธ ์ฝ๋๊ฐ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด์ ์ ๋ด๊ฐ ์ง ์ฝ๋๋ฅผ ๋ฏฟ๊ณ ์ค๋ ๋ง์๊ป ๋ฆฌํฉํ ๋งํ ์ ์์ฃ . ์, ์ด๋ค ๊ฑธ ๋จผ์ ํ ์คํธํ ์ง ํผ๋ผ๋ฏธ๋๋ถํฐ ์ธ์๋ด ์๋ค."
Q1. ๋จ์ ํ ์คํธ(Unit Test)์ ํตํฉ ํ ์คํธ(Integration Test)์ ์ฐจ์ด์ ์ ๋ฌด์์ด๋ฉฐ, ์ค๋ฌด์์ ์ด๋ค ๋น์ค์ผ๋ก ์์ฑํ์๋์?
๐ฏ ์ถ์ ์๋
ํ ์คํธ์ ๋น์ฉ๊ณผ ๊ฐ์น๋ฅผ ์ดํดํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ๋ชจ๋ ์ฝ๋์ ํ ์คํธ๋ฅผ ์ง๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ํจ์จ์ ์ธ ํ ์คํธ ์ ๋ต์ ์ธ์ธ ์ ์๋ ํ๋จ๋ ฅ์ ํ๊ฐํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ Naive ๊ตฌํ (Bad Case)
์์ฒ ์ด๋ ๋ชจ๋ ์์ ํจ์ ํ๋ํ๋์ ํ ์คํธ๋ฅผ ์ง๋๋ผ ๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ ์๋๊ฐ ๋๋ฌด ๋๋ ค์ก์ต๋๋ค.
// ๐ฃ ์์ฒ : "1 + 1 ํจ์๋ ํ
์คํธ๋ฅผ ์ง์ผ ์์ฌ์ด ๋ผ์!"
test('add function', () => {
expect(add(1, 1)).toBe(2); // โ ๏ธ ๋๋ฌด ์ฌ์ํ ํ
์คํธ์ ์๋์ง๋ฅผ ๋ญ๋น ์ค
});
// โ ๏ธ ๋ฌธ์ : ์ค์ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ์ ์ด๋ป๊ฒ ํต์ ํ๋์ง ๋ฑ ์ ์ ์ค์ํ 'ํ๋ฆ'์ ํ
์คํธ ์ ํจ๐ฆ ์ํธ์ ํฉํญ ์กฐ์ธ
"์์ฒ ๋, ํจ์๊ฐ ์ ๋๋ ๊ฒ๋ ์ค์ํ์ง๋ง ๋ ์ค์ํ ๊ฑด ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋์ ๋๋ค. ์ฌ์ํ ์ ํธ๋ฆฌํฐ ํจ์ 100๊ฐ๋ณด๋ค, '๋ก๊ทธ์ธ ํ ๊ฒ์๊ธ ์ฐ๊ธฐ'๋ผ๋ ํ๋์ ํ๋ฆ์ ํ ์คํธํ๋ ๊ฒ ํจ์ฌ ๊ฐ์น ์์ด์."
๐ฆ ์ํธ์ ์ํคํ ์ฒ ๊ฐ์ด๋ (Good Case)
์ํธ ๋ฆฌ๋๊ฐ ์ ์ํ๋ ๊ท ํ ์กํ ํ ์คํธ ๋น์ค์ ๋๋ค.
// ๐ฆ ์ํธ: "๋น์ฆ๋์ค ํต์ฌ ๋ก์ง์ ๋จ์ ํ
์คํธ๋ก, ์ปดํฌ๋ํธ ๊ฐ ํ์
์ ํตํฉ ํ
์คํธ๋ก ์ก์ผ์ธ์."
// 1. ๋จ์ ํ
์คํธ (Unit):
// - ๋ณต์กํ ๊ณ์ฐ์, ์์ ํจ์, ๋น์ฆ๋์ค ๊ท์น (์: ํฌ์ธํธ ์ ๋ฆฝ ๊ณ์ฐ ๋ก์ง)
// - ๋น์ค: 60% (๋น ๋ฅด๊ณ ์ ํํจ)
// 2. ํตํฉ ํ
์คํธ (Integration):
// - ํ
๊ณผ ์ปดํฌ๋ํธ์ ์ํธ์์ฉ, API ๋ชจํน ๋ฐ์ดํฐ์ UI์ ์ฐ๋
// - ๋น์ค: 30% (์ค์ ์ฌ์ฉ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ์น ์ ๊ณต)
// 3. E2E ํ
์คํธ (Playwright/Cypress):
// - ๊ฒฐ์ ์ฑ๊ณต, ํ์๊ฐ์
๋ฑ ํต์ฌ ๋น์ฆ๋์ค ํฌ๋ฆฌํฐ์ปฌ ํจ์ค
// - ๋น์ค: 10% (๋๋ฆฌ์ง๋ง ํ์คํ ๋ณด์ฆ)๐ ๋ ๋ฒจ๋ณ ๋ต๋ณ ๊ฐ์ด๋ (Self-Check)
- Level 1 (Junior): "๋จ์ ํ ์คํธ๋ ์์ ํจ์๋ฅผ, ํตํฉ ํ ์คํธ๋ ์ฌ๋ฌ ๊ฐ๊ฐ ํฉ์ณ์ง ๊ฒ์ ํ ์คํธํฉ๋๋ค. ๋ ๋ค ๋ง์ด ์ง๋ฉด ์ข์ต๋๋ค."
- Level 2 (Senior): "๋จ์ ํ ์คํธ๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์ธ๋ถ ๋ก์ง์ ๊ฒ์ฆํ๊ณ , ํตํฉ ํ ์คํธ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ํธ๋ฆฌ๊ฐ ์ค์ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ๋๋ก ๋ ๋๋ง๋๋์ง ํ์ธํจ์ ์ค๋ช ํฉ๋๋ค. ROI(ํฌ์ ๋๋น ํจ๊ณผ) ๊ด์ ์์ ํตํฉ ํ ์คํธ์ ๋น์ค์ ๋์ฌ '๋ฆฌํฉํ ๋ง ๋ด์ฑ'์ ํ๋ณดํ๋ ์ ๋ต์ ์ ์ํฉ๋๋ค."
- Level 3 (Specialist): "TDD(Test Driven Development)๋ฅผ ํตํ ์ค๊ณ ๊ฐ์ ์ฌ๋ก๋ฅผ ์ค๋ช ํฉ๋๋ค. ๋ํ MSW(Mock Service Worker)๋ฅผ ํ์ฉํด ๋คํธ์ํฌ ๊ณ์ธต๊น์ง ๋ชจํนํ์ฌ ํ๋ก ํธ์๋ ํ ์คํธ ํ๊ฒฝ์ ์ค์ ์ ๊ฐ๊น๊ฒ ๊ตฌ์ถํ ๊ฒฝํ์ ๋ถ์ํฉ๋๋ค. 'ํ ์คํธ๋ฅผ ์ํด ํ ์คํธ๋ฅผ ์ง๋ ๊ฒ'์ด ์๋, ์ฝ๋์ ์ค๊ณ ์์ค์ ๋์ด๋ ๋๊ตฌ๋ก์์ ํ ์คํธ๋ฅผ ๊ฐ์กฐํฉ๋๋ค."
Q2. React Testing Library(RTL)์์ '๊ตฌํ ์ธ๋ถ ์ ๋ณด'๊ฐ ์๋ '์ฌ์ฉ์ ๊ด์ '์ผ๋ก ํ ์คํธ๋ฅผ ์์ฑํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
๐ฏ ์ถ์ ์๋
์ฝ๋๋ฅผ ๊ณ ์ณค์ ๋ ํ ์คํธ๊ฐ ๊นจ์ง๋ '์ทจ์ฝํ ํ ์คํธ'์ ๋ฌธ์ ๋ฅผ ์ธ์งํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ๋ณํ์ ์ ์ฐํ ๊ฒฌ๊ณ ํ ํ ์คํธ ์ฝ๋๋ฅผ ์งค ์ ์๋์ง ํ๊ฐํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ Naive ๊ตฌํ (Bad Case)
์์ฒ ์ด๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ state ๊ฐ์ด๋ ํจ์ ์ด๋ฆ์ด ์ ํํ์ง ํ
์คํธํ๋ ค ํฉ๋๋ค.
// ๐ฃ ์์ฒ : "๋ด๋ถ์ isOpen ์ํ๊ฐ true์ธ์ง ํ์ธํ๋ฉด ๋๊ฒ ์ฃ ?"
const wrapper = shallow(<Modal />);
expect(wrapper.state('isOpen')).toBe(true);
// โ ๏ธ ๋ฌธ์ : state ์ด๋ฆ์ 'isVisible'๋ก ๋ฐ๊พธ๋ ์๊ฐ, ๊ธฐ๋ฅ์ ๋ฉ์ฉกํด๋ ํ
์คํธ๋ ๊นจ์ง (๋ฆฌํฉํ ๋ง ๋ฐฉํด)๐ฆ ์ํธ์ ํฉํญ ์กฐ์ธ
"์์ฒ ๋, ์ฌ์ฉ์๋ ์ปดํฌ๋ํธ ์ด๋ฆ์ด ๋ญ์ง, ์ํ ๋ณ์๋ช ์ด ๋ญ์ง ๊ด์ฌ ์์ด์. ์ค์ง 'ํ๋ฉด์ ๋ชจ๋ฌ์ด ๋ด๋๊ฐ'๋ง ๊ด์ฌ ์์ฃ . ์ฌ์ฉ์์ ๋์ผ๋ก ์ฝ๋๋ฅผ ๋ณด์ธ์."
๐ฆ ์ํธ์ ์ํคํ ์ฒ ๊ฐ์ด๋ (Good Case)
์ํธ ๋ฆฌ๋๊ฐ RTL์ ์ฒ ํ์ ๋ด์ ํ ์คํธ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
// ๐ฆ ์ํธ: "์ฌ์ฉ์๊ฐ ๋ณด๋ ํ
์คํธ, ๋ฒํผ ์์ฑ์ผ๋ก ์ ๊ทผํ์ธ์."
import { render, screen, fireEvent } from '@testing-library/react';
test('๋ชจ๋ฌ ์ด๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ํ์ ๋ฉ์์ง๊ฐ ๋ํ๋๋ค', () => {
render(<WelcomeModal />);
// 1. "๋ชจ๋ฌ ์ด๊ธฐ"๋ผ๊ณ ์จ์ง ๋ฒํผ์ ์ฐพ์์ ํด๋ฆญ (์ฌ์ฉ์ ํ์)
const openBtn = screen.getByRole('button', { name: /๋ชจ๋ฌ ์ด๊ธฐ/i });
fireEvent.click(openBtn);
// 2. ํ๋ฉด์ "ํ์ํฉ๋๋ค"๋ผ๋ ๊ธ์๊ฐ ์๋์ง ํ์ธ (์ฌ์ฉ์ ๊ฒฝํ)
expect(screen.getByText(/ํ์ํฉ๋๋ค/i)).toBeInTheDocument();
// โ
์ด์ ๋ด๋ถ ๋ณ์๋ช
์ ์๋ฌด๋ฆฌ ๋ฐ๊ฟ๋ ๊ธฐ๋ฅ๋ง ๊ฐ์ผ๋ฉด ์ด ํ
์คํธ๋ ํต๊ณผํฉ๋๋ค!
});๐ ๋ ๋ฒจ๋ณ ๋ต๋ณ ๊ฐ์ด๋ (Self-Check)
- Level 1 (Junior): "RTL์ ์ฌ์ฉ์๊ฐ ๋ณด๋ ๊ฒ์ ํ ์คํธํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๊ทธ๋์ผ ๊ธฐ๋ฅ์ด ๋ฐ๋์ด๋ ํ ์คํธ๊ฐ ์ ๋์๊ฐ๋๋ค."
- Level 2 (Senior): "๋ธ๋ผ์ฐ์ ์ ๊ทผ์ฑ(Accessibility)์ ๊ณ ๋ คํ
getByRole,getByLabelText๋ฑ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐ์ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ด๋ ํ ์คํธ์ ๊ฒฌ๊ณ ํจ์ ๋์ผ ๋ฟ๋ง ์๋๋ผ ์น ์ ๊ทผ์ฑ์ ๊ฐ์ ํ๋ ๋ถ์ ํจ๊ณผ๊ฐ ์์์ ์ธ๊ธํฉ๋๋ค." - Level 3 (Specialist): "'ํ์ดํธ๋ฐ์ค ํ
์คํธ'์ '๋ธ๋๋ฐ์ค ํ
์คํธ'์ ๊ฐ๋
์ ์ฐ๊ฒฐํฉ๋๋ค. ๋ด๋ถ ๊ตฌํ์ ๋ชจ๋ฅด๋ ์ํ์์ ์
์ถ๋ ฅ(UI ์ํธ์์ฉ๊ณผ ๊ฒฐ๊ณผ)๋ง ๊ฒ์ฆํ๋ ๋ธ๋๋ฐ์ค ํ
์คํธ๊ฐ ๋ฆฌํฉํ ๋ง ํจ์จ์ ์ผ๋ง๋ ๊ทน๋ํํ๋์ง ์ฌ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ๋ํ ๋น๋๊ธฐ ํ
์คํธ ์
findBy์ฟผ๋ฆฌ์waitFor๋ฅผ ์ ํํ ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ์ ๋ถ์ํฉ๋๋ค."
๐ ์ค์ ๋ณํ ์ง๋ฌธ (Related Variations)
Q175. TDD(ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ)์ ์ฌ์ดํด๊ณผ ์ค๋ฌด์์์ ํ์ค์ ์ธ ์ ์ฉ ๋ฐฉ์์?
- ๐ฏ ์ถ์ ์๋: ์ด๋ก ์ ์ธ TDD ์ง์์ ๋์ด, ์ค์ ์ ๋ฌด ์๋์ ํ์ง ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ ์ค ์๋์ง ํ์ธํฉ๋๋ค.
- ๐ก ํต์ฌ ์๋ฆฌ & ๋ต๋ณ: TDD๋
Red(์คํจํ๋ ํ ์คํธ)โGreen(๊ตฌํ)โRefactor(๊ฐ์ )์์๋ก ์งํ๋ฉ๋๋ค. ํ์ง๋ง ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ์ฉํ๊ธด ํ๋ค ์ ์์ต๋๋ค. ์ค๋ฌด์์๋ ๋ณต์กํ ์ฃ์ง ์ผ์ด์ค๊ฐ ๋ง์ ๊ณตํต ์ ํธ๋ฆฌํฐ ํจ์๋, ์๋ฒ ์๋ต์ ๋ฐ๋ผ UI๊ฐ ๋ฏผ๊ฐํ๊ฒ ๋ณํ๋ ๋ณต์กํ ๋น์ฆ๋์ค ํผ ๋ก์ง ๋ฑ์ ์ ํ์ ์ผ๋ก ์ ์ฉํ์ฌ ์ค๊ณ์ ์์ฑ๋๋ฅผ ๋์ด๋ ๊ฒ์ด ํ์ค์ ์ ๋๋ค.
Q180. ์ค๋ ์ท ํ ์คํธ(Snapshot Testing)์ ์ฅ๋จ์ ๊ณผ ์ธ์ ์ฌ์ฉํ๋ฉด ์ ํจํ๊ฐ์?
- ๐ฏ ์ถ์ ์๋: ํ ์คํธ์ ํธ๋ฆฌํจ ๋ค์ ์จ์ ์ํ์ฑ(๋ฌด์๋ฏธํ ์ ๋ฐ์ดํธ)์ ์ธ์งํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
- ๐ก ํต์ฌ ์๋ฆฌ & ๋ต๋ณ: ์ค๋ ์ท ํ ์คํธ๋ ์ด์ UI ๊ฒฐ๊ณผ๋ฌผ๊ณผ ํ์ฌ๋ฅผ ๋น๊ตํ์ฌ ์๋์น ์์ ๋ณํ๋ฅผ ๊ฐ์งํ๋ ๋ฐ ๋งค์ฐ ๋น ๋ฅด๊ณ ํธ๋ฆฌํฉ๋๋ค. ํ์ง๋ง ์กฐ๊ธ๋ง ์คํ์ผ์ ๊ณ ์ณ๋ ํ ์คํธ๊ฐ ๊นจ์ ธ ์๋์ผ๋ก ์ ๋ฐ์ดํธํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์ปค์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ก์ง์ด ์์ฃผ ๋ฐ๋๋ ์ปดํฌ๋ํธ๋ณด๋ค๋, ๋์์ธ ์์คํ ์ ๊ณตํต UI ์ปดํฌ๋ํธ๋ ์ ๋ ๋ฐ๋๋ฉด ์ ๋๋ ์ค์นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ํ๊ท ๋ฐฉ์ง ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
Q195. ์ข์ ํ ์คํธ ์ฝ๋์ 5๋ ์์น(FIRST)์ด๋ ๋ฌด์์ธ๊ฐ์?
- ๐ฏ ์ถ์ ์๋: ํ ์คํธ ์ฝ๋ ์์ฒด๊ฐ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ 'ํ์ง'์ ๊ฐ์ถ๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
- ๐ก ํต์ฌ ์๋ฆฌ & ๋ต๋ณ: FIRST ์์น์ Fast(๋น ๋ฅด๊ฒ ์คํ), Independent(๋ ๋ฆฝ์ ์คํ), Repeatable(์ด๋์๋ ๊ฐ์ ๊ฒฐ๊ณผ), Self-Validating(์ฑ๊ณต/์คํจ ์ฌ๋ถ ์๋ ํ๋ณ), Timely(์ฝ๋ ๊ตฌํ ์ ํ ์ ์์ ์์ฑ)๋ฅผ ์๋ฏธํฉ๋๋ค. ํนํ ๋ ๋ฆฝ์ฑ๊ณผ ๋ฐ๋ณต ๊ฐ๋ฅ์ฑ์ด ์ค์ํ๋ฐ, ์ด์ ํ ์คํธ์ ์ํ๊ฐ ๋ค์ ํ ์คํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๋งค๋ฒ ํ๊ฒฝ์ ์ด๊ธฐํํ๋ ๊ฒ์ด ์ข์ ํ ์คํธ์ ๊ธฐ์ด์ ๋๋ค.
๐ฃ ์์ฒ ์ด์ ๋ณต๊ธฐ ์ผ๊ธฐ
์ค๋ ํ ์คํธ ์ฝ๋๋ฅผ ์ง๋ณด๋ฉด์ ๋๊ผ๋ค. ๊ทธ๋์ ๋๋ "์ ๋ฐ ๋ฒ๊ทธ ์ ๋๊ฒ ํด์ฃผ์ธ์"๋ผ๊ณ ๊ธฐ๋ํ๋ฉฐ ์ฝ๋ฉํ๋๋ฐ, ์ด์ ๋ "์ด ํ ์คํธ๊ฐ ๋ด ์ฝ๋๋ฅผ ์ง์ผ์ฃผ๊ณ ์๋ค"๋ ๋ ๋ ํ ๋ฐฉํจ๋ฅผ ์ป์๋ค. ํนํ '์ฌ์ฉ์ ๊ด์ '์์ ํ ์คํธ๋ฅผ ์ง๋ ๋ฒ์ ๋ฐฐ์ฐ๋, ๋ด๊ฐ ๋ง๋๋ ๊ธฐ๋ฅ์ด ์ง์ง ์ฌ์ฉ์์๊ฒ ์ด๋ค ๊ฐ์น๋ฅผ ์ฃผ๋์ง ๋ค์ ํ๋ฒ ์๊ฐํ๊ฒ ๋์๋ค.
๐ก "ํ ์คํธ ์ฝ๋๋ ๋ฏธ๋์ ๋ด๊ฐ ๊ณผ๊ฑฐ์ ๋์๊ฒ ๊ฐ์ฌ๋ฅผ ํํ๊ฒ ๋ง๋๋ ์ต๊ณ ์ ์ ๋ฌผ์ด๋ค."
๋ด์ผ์ ์น์ ์ํํ๋ ์ด๋ ์ ๊ทธ๋ฆผ์(?)๋ฅผ ๋ง๋ ๋ฒ, '๋ณด์ & ์ฑ๋ฅ ์์ง๋์ด๋ง 2ํ'์ ๋ฐฐ์ด๋ค. ๋ณด์์ ๋ซ๋ ค์ผ ์๋ ๋ฒ์ด๋ผ๋๋ฐ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ์ ๋ง์์ผ์ง! ๐โ๏ธ