- ์ฃผ๋ฌธ ๋ชฉ๋ก์ ์๋ฃ ์ถ๊ฐ/์ญ์ ๊ธฐ๋ฅ
- ์ฃผ๋ฌธ ๋ชฉ๋ก ์ ์ฒด ์ง์ฐ๊ธฐ
- ์ฃผ๋ฌธ ๋ชฉ๋ก ์ด ๊ธ์ก ๊ณ์ฐํ๊ธฐ
- ์ฃผ๋ฌธ ์์ฑํ๊ธฐ
- ํ ์ข ๋ฅ์ ์๋ฃ ์ฌ๋ฌ ์์ ํ ๋ฒ์ ๋ด๋ ๊ธฐ๋ฅ
- ๊ฐ๊ฒ ์ด์ ์๊ฐ(10:00 ~ 22:00) ์ธ์๋ ์ฃผ๋ฌธ์ ์์ฑํ ์ ์๋ค.
- ํค์ค์คํฌ ์ฃผ๋ฌธ์ ์ํ ์ํ ํ๋ณด ๋ฆฌ์คํธ ์กฐํํ๊ธฐ
- ์ํ์ ํ๋งค ์ํ: ํ๋งค์ค, ํ๋งค๋ณด๋ฅ, ํ๋งค์ค์ง
- ํ๋งค์ค, ํ๋งค๋ณด๋ฅ์ธ ์ํ์ ์ํ์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
- ID, ์ํ๋ฒํธ, ์ํํ์ , ํ๋งค์ํ, ์ํ์ด๋ฆ, ๊ฐ๊ฒฉ
- ์ํ ๋ฒํธ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ ์ฃผ๋ฌธ ์์ฑํ๊ธฐ
- ์ฃผ๋ฌธ์ ์ฃผ๋ฌธ ์ํ, ์ฃผ๋ฌธ ๋ฑ๋ก ์๊ฐ์ ๊ฐ์ง๋ค.
- ์ฃผ๋ฌธ์ ์ด ๊ธ์ก์ ๊ณ์ฐํ ์ ์์ด์ผ ํ๋ค.
- ์ฃผ๋ฌธ ์์ฑ ์ ์ฌ๊ณ ํ์ธ ๋ฐ ๊ฐ์ ์ฐจ๊ฐ ํ ์์ฑํ๊ธฐ
- ์ฌ๊ณ ๋ ์ํ๋ฒํธ๋ฅผ ๊ฐ์ง๋ค.
- ์ฌ๊ณ ์ ๊ด๋ จ ์๋ ์ํ ํ์ ์ ๋ณ ์๋ฃ, ๋ฒ ์ด์ปค๋ฆฌ์ด๋ค.
- ๊ด๋ฆฌ์ ํ์ด์ง์์ ์ ๊ท ์ํ์ ๋ฑ๋กํ ์ ์๋ค.
- ์ํ๋ช , ์ํ ํ์ , ํ๋งค ์ํ, ๊ฐ๊ฒฉ ๋ฑ์ ์ ๋ ฅ๋ฐ๋๋ค.
- ์์ ์ฝ๋ ๋จ์(ํด๋์ค or ๋ฉ์๋)๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒ์ฆํ๋ ํ ์คํธ
- ๊ฒ์ฆ ์๋๊ฐ ๋น ๋ฅด๊ณ , ์์ ์ ์ด๋ค.
- ํดํผ์ผ์ด์ค
- ์์ธ์ผ์ด์ค
- ๊ฒฝ๊ณ๊ฐ ํ ์คํธ (๋ฒ์(์ด์, ์ดํ, ์ด๊ณผ, ๋ฏธ๋ง), ๊ตฌ๊ฐ, ๋ ์ง ๋ฑ)
์ธ๋ถ๋ก ๋ถ๋ฆฌํ ์๋ก ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ ๋ง์์ง๋ค.
ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์์ญ
- ๊ด์ธกํ ๋๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ์์กดํ๋ ์ฝ๋ (IN)
- ํ์ฌ ๋ ์ง/์๊ฐ
- ๋๋ค ๊ฐ
- ์ ์ญ ๋ณ์/ํจ์
- ์ฌ์ฉ์ ์ ๋ ฅ ๋ฑ
- ์ธ๋ถ ์ธ๊ณ์ ์ํฅ์ ์ฃผ๋ ์ฝ๋ (OUT)
- ํ์ค ์ถ๋ ฅ
- ๋ฉ์์ง ๋ฐ์ก
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋กํ๊ธฐ
ํ ์คํธ ํ๊ธฐ ์ฌ์ด ํจ์(์์ํจ์)
- ๊ฐ์ ์ ๋ ฅ์๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ
- ์ธ๋ถ ์ธ์๊ณผ ๋จ์ ๋ ํํ
- ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋
ํ๋ก๋์ ์ฝ๋๋ณด๋ค ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ์ฌ ํ ์คํธ๊ฐ ๊ตฌํ ๊ณผ์ ์ ์ฃผ๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ๋ก
RED โ GREEN โ REFACTOR
RED: ์คํจํ๋ ํ
์คํธ ์์ฑ
GREEN: ํ
์คํธ ํต๊ณผ / ์ต์ํ์ ์ฝ๋ฉ
REFACTOR: ๊ตฌํ ์ฝ๋ ๊ฐ์ / ํ
์คํธ ํต๊ณผ ์ ์ง
์ ๊ธฐ๋ฅ ๊ตฌํ, ํ ํ ์คํธ ์์ฑ
- ํ ์คํธ ์์ฒด์ ๋๋ฝ ๊ฐ๋ฅ์ฑ
- ํน์ ํ ์คํธ ์ผ์ด(ํดํผ์ผ์ด์ค)๋ง ๊ฒ์ฆํ ๊ฐ๋ฅ์ฑ
- ์๋ชป๋ ๊ตฌํ์ ๋ค์ ๋ฆ๊ฒ ๋ฐ๊ฒฌํ ๊ฐ๋ฅ์ฑ
์ ํ ์คํธ ์์ฑ, ํ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ณต์ก๋๊ฐ ๋ฎ์, ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ก ๊ตฌํํ ์ ์๊ฒ ํ๋ค.
- ์ฝ๊ฒ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์ด ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋์น์ง ์๊ฒ ํด์ค๋ค.
- ๊ตฌํ์ ๋ํ ๋น ๋ฅธ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ค.
- ๊ณผ๊ฐํ ๋ฆฌํฉํ ๋ง์ด ๊ฐ๋ฅํด์ง๋ค.
TDD: ๊ด์ ์ ๋ณํ
ํ
์คํธ๋ ๊ตฌํ๋ถ ๊ฒ์ฆ์ ์ํ ๋ณด์กฐ์๋จ โ ํ
์คํธ์ ์ํธ ์์ฉํ๋ฉฐ ๋ฐ์ ํ๋ ๊ตฌํ๋ถ
ํด๋ผ์ด์ธํธ ๊ด์ ์์ ํผ๋๋ฐฑ์ ์ฃผ๋ Test Driven
- ํ๋ก๋์ ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ํ ์คํธ ์ฝ๋ ๋ฌธ์
- ๋ค์ํ ํ ์คํธ์ผ์ด์ค๋ฅผ ํตํด ํ๋ก๋์ ์ฝ๋๋ฅผ ์ดํดํ๋ ์๊ฐ๊ณผ ๊ด์ ์ ๋ณด์
- ์ด๋ ํ ์ฌ๋์ด ๊ณผ๊ฑฐ์ ๊ฒฝํํ๋ ๊ณ ๋ฏผ์ ๊ฒฐ๊ณผ๋ฌผ์ ํ ์ฐจ์์ผ๋ก ์น๊ฒฉ์์ผ์, ๋ชจ๋์ ์์ฐ์ผ๋ก ๊ณต์ ํ ์ ์๋ค.
- ๋ช
์ฌ์ ๋์ด๋ณด๋ค ๋ฌธ์ฅ์ผ๋ก
- ์๋ฃ 1๊ฐ ์ถ๊ฐ ํ ์คํธ โ ์๋ฃ๋ฅผ 1๊ฐ ์ถ๊ฐํ ์ ์๋ค.
- ํ
์คํธ ํ์์ ๋ํ ๊ฒฐ๊ณผ๊น์ง ๊ธฐ์ ํ๊ธฐ
- ์๋ฃ๋ฅผ 1๊ฐ ์ถ๊ฐํ ์ ์๋ค. โ ์๋ฃ๋ฅผ 1๊ฐ ์ถ๊ฐํ๋ฉด ์ฃผ๋ฌธ ๋ชฉ๋ก์ ๋ด๊ธด๋ค.
- ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธต ์ถ์ํ๋ ๋ด์ฉ์ ๋ด๊ธฐ(๋ฉ์๋ ์์ฒด์ ๊ด์ ๋ณด๋ค ๋๋ฉ์ธ ์ ์ฑ
๊ด์ ์ผ๋ก)
- ํน์ ์๊ฐ ์ด์ ์ ์ฃผ๋ฌธ์ ์์ฑํ๋ฉด ์คํจํ๋ค โ ์์ ์์ ์๊ฐ ์ด์ ์๋ ์ฃผ๋ฌธ์ ์์ฑํ ์ ์๋ค.
- ํ
์คํธ์ ํ์์ ์ค์ ์ผ๋ก ๊ธฐ์ ํ์ง ๋ง ๊ฒ
- ์ฑ๊ณตํ๋ค/์คํจํ๋ค โ ๋ด๊ธด๋ค/์์ฑํ ์ ์๋ค
- TDD์์ ํ์๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ
- ํจ์ ๋จ์์ ํ ์คํธ์ ์ง์คํ๊ธฐ๋ณด๋ค, ์๋๋ฆฌ์ค์ ๊ธฐ๋ฐํ ํ ์คํธ์ผ์ด์ค ์์ฒด์ ์ง์คํ์ฌ ํ ์คํธํ๋ค.
- ๊ฐ๋ฐ์๊ฐ ์๋ ์ฌ๋์ด ๋ด๋ ์ดํดํ ์ ์์ ์ ๋์ ์ถ์ํ ์์ค(๋ ๋ฒจ)์ ๊ถ์ฅ
- Given: ์๋๋ฆฌ์ค ์งํ์ ํ์ํ ๋ชจ๋ ์ค๋น ๊ณผ์ (๊ฐ์ฒด, ๊ฐ, ์ํ ๋ฑ)
- When: ์๋๋ฆฌ์ค ํ๋ ์งํ
- Then: ์๋๋ฆฌ์ค ์งํ์ ๋ํ ๊ฒฐ๊ณผ ๋ช ์, ๊ฒ์ฆ
- Persistence Layer
- Data Access ์ญํ
- ๋น์ง๋์ค ๊ฐ๊ณต ๋ก์ง์ด ํฌํจ๋์ด์๋ ์ ๋๋ค.
- Data์ ๋ํ CRUD์๋ง ์ง์คํ ๋ ์ด์ด
- Business Layer
- ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ ์ญํ
- Persistence Layer์ ์ํธ์์ฉ(Data๋ฅผ ์ฝ๊ณ ์ฐ๋ ํ์)์ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ์ ๊ฐ์ํจ๋ค.
- ํธ๋์ญ์ ์ ๋ณด์ฅํด์ผ ํ๋ค.
- Presentation Layer
- ์ธ๋ถ ์ธ๊ณ์ ์์ฒญ์ ๊ฐ์ฅ ๋จผ์ ๋ฐ๋ ๊ณ์ธต
- ํ๋ผ๋ฏธํฐ์ ๋ํ ์ต์ํ์ ๊ฒ์ฆ์ ์ํํ๋ค.
- ์ฌ๋ฌ ๋ชจ๋์ด ํ๋ฝํ๋ ๊ธฐ๋ฅ์ ํตํฉ์ ์ผ๋ก ๊ฒ์ฆํ๋ ํ ์คํธ
- ์ผ๋ฐ์ ์ผ๋ก ์์ ๋ฒ์์ ๋จ์ํ ์คํธ๋ง์ผ๋ก๋ ๊ธฐ๋ฅ ์ ์ฒด์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
- ํ๋ถํ ๋จ์ํ ์คํธ & ํฐ ๊ธฐ๋ฅ ๋จ์๋ฅผ ๊ฒ์ฆํ๋ ํตํฉํ ์คํธ
- Mock(๊ฐ์ง) ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ์คํ๋ง MVC ๋์์ ์ฌํํ ์ ์๋ ํ ์คํธ ํ๋ ์์ํฌ
- Layerd Architecture
- Hexagonal Architecture
- ๋จ์ํ ์คํธ vs ํตํฉํ ์คํธ
- IoC, DI, AOP
- ORM, ํจ๋ฌ๋ค์์ ๋ถ์ผ์น, Hibernate
- Spring Data JPA
- QueryDSL
- @SpringBootTest vs @DataJpaTest
- @SpringBootTest vs @WebMvcTest
- Optimistic Lock, Pessimistic Lock
- CQRS
- @RestControllerAdvice, @ExceptionHandler
- Spring Bean Validation
- @NotNull, @NotEmpty, @NotBlank, ...
- Mock, Mockito, @MockBean