๐ ์๊ฐ
Spring Boot๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๊ฒ์ด "์ด๋ค ํด๋์ ์ด๋ค ํ์ผ์ ๋ฃ์ด์ผ ํ๋๊ฐ?" ์ด๋ค.
์ด ๊ธ์ Todo API ํ๋ก์ ํธ๋ฅผ ํตํด Controller, Service, Repository, Entity, DTO์ ์ญํ ๊ณผ ๊ฐ ํ์ผ์ด ์ ๊ทธ ์์น์ ์์ด์ผ ํ๋์ง ๋ช
ํํ๊ฒ ์ค๋ช
ํ๋ค. ์ฝ๋๋ณด๋ค ๊ตฌ์กฐ์ ๊ฐ๋
์ดํด์ ์ง์คํด๋ณด์.
ํ๋ก์ ํธ: ๊ฐ๋จํ ํ ์ผ ๊ด๋ฆฌ (Todo) API
[ํ๋ก์ ํธ ๊ตฌ์กฐ]
todo-api/
โโโ src/
โ โโโ main/
โ โโโ java/
โ โ โโโ com/
โ โ โโโ example/
โ โ โโโ todo/
โ โ โโโ TodoApplication.java
โ โ โโโ controller/
โ โ โ โโโ TodoController.java
โ โ โโโ service/
โ โ โ โโโ TodoService.java
โ โ โโโ repository/
โ โ โ โโโ TodoRepository.java
โ โ โโโ entity/
โ โ โ โโโ Todo.java
โ โ โโโ dto/
โ โ โ โโโ TodoCreateRequest.java
โ โ โ โโโ TodoResponse.java
โ โ โ โโโ ErrorResponse.java
โ โ โโโ exception/
โ โ โโโ TodoNotFoundException.java
โ โ โโโ GlobalExceptionHandler.java
โ โโโ resources/
โ โโโ application.yml
โโโ pom.xml
๊ฐ ๋จ๊ณ๋ณ ์ค๋ช
1๋จ๊ณ: Hello World ์คํ ํ์ธ
| ํ์ผ๋ช | ์ญํ | ์์ธ ์ค๋ช |
| TodoApplication.java | ์คํ๋ง๋ถํธ ์์์ | @SpringBootApplication์ด ์ ์ธ๋ ๋ฉ์ธ ํด๋์ค๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ง์ ์ |
| application.yml | ํ๊ฒฝ ์ค์ | MySQL ์ฐ๊ฒฐ ์ ๋ณด ์ค์ → ์๋ฒ ์คํ ์ DB ์๋ ์ฐ๋ |
| TodoController.java | API ์ปจํธ๋กค๋ฌ | ์๋ฒ ๋์ ํ์ธ์ฉ Hello World API ์ ๊ณต |
2๋จ๊ณ: Controller-Service-Repository ํจํด
| ํ์ผ๋ช | ๊ตฌ๋ถ | ์ญํ | ์์ธ ์ค๋ช |
| Todo.java | Entity | DB ๋งคํ | @Entity๋ก MySQL ํ ์ด๋ธ๊ณผ ๋งคํ, ์ปฌ๋ผ ์ ์ |
| TodoRepository.java | Repository | DB ์ ๊ทผ | JpaRepository ์์ → CRUD ์๋ ์ ๊ณต |
| TodoService.java | Service | ๋น์ฆ๋์ค ๋ก์ง | ํธ๋์ญ์ ์ฒ๋ฆฌ, ํต์ฌ ๋ก์ง ์บก์ํ |
| TodoController.java | Controller | HTTP ์์ฒญ ์ฒ๋ฆฌ | REST API ์ ๊ณต (CRUD ์์ฑ) |
3๋จ๊ณ: Entity ๋์ DTO ์ฌ์ฉํ๊ธฐ
| ํ์ผ๋ช | ๊ตฌ๋ถ | ์ญํ | ์์ธ ์ค๋ช |
| TodoCreateRequest.java | Request DTO | ์์ฒญ ๋ฐ์ดํฐ ์์ | ํด๋ผ์ด์ธํธ ์ ๋ ฅ ์ ์ฉ DTO, ๊ฒ์ฆ(@Valid) ๋์ |
| TodoResponse.java | Response DTO | ์๋ต ๋ฐ์ดํฐ ๋ฐํ | ํ์ํ ํ๋๋ง ๋ ธ์ถํ์ฌ ์๋ต ๊ตฌ์กฐ ์์ ํ |
| TodoService.java | Service | ๋ณํ ์ฑ ์ | Entity ↔ DTO ๋ณํ ๋ก์ง ๋ด๋น (๋น์ฆ๋์ค ๊ณ์ธต์ ์บก์ํ) |
| TodoController.java | Controller | DTO ์ ์ถ๋ ฅ | Entity ์ง์ ์ฌ์ฉ ๊ธ์ง, DTO๋ก๋ง ์์ฒญ·์๋ต ์ฒ๋ฆฌ |
4๋จ๊ณ: JPA ์ฟผ๋ฆฌ ๋ฉ์๋
| ํ์ผ๋ช | ๊ตฌ๋ถ | ์ญํ | ์์ธ ์ค๋ช |
| TodoRepository.java | Repository | findBy..., @Query | ๋ฉ์๋ ์ฟผ๋ฆฌ ๋ฐ JPQL/Native Query๋ก ๋ค์ํ ์กฐํ ์กฐ๊ฑด ์ง์ |
| TodoService.java | Service | ๊ฒ์·ํํฐ๋ง ๋ก์ง | ์ํ, ํค์๋, ๊ธฐ๊ฐ ๋ฑ ์กฐ๊ฑด ์กฐํฉ ์ฒ๋ฆฌ |
| TodoController.java | Controller | ๊ฒ์ API | ์กฐ๊ฑด ํ๋ผ๋ฏธํฐ ๊ธฐ๋ฐ ์กฐํ ์๋ํฌ์ธํธ ์ ๊ณต |
5๋จ๊ณ: ์์ธ ์ฒ๋ฆฌ์ ์ ํจ์ฑ ๊ฒ์ฆ
| ํ์ผ๋ช | ๊ตฌ๋ถ | ์ญํ | ์์ธ ์ค๋ช |
| TodoNotFoundException.java | Exception | ์ปค์คํ ์์ธ | Todo ๋ฏธ์กด์ฌ ์ ๋ช ํํ ๋๋ฉ์ธ ์์ธ ์ ์ |
| ErrorResponse.java | DTO | ์๋ฌ ์๋ต | ์๋ฌ ์ฝ๋·๋ฉ์์ง·ํ์์คํฌํ ๋ฑ ํ์คํ๋ ์๋ต ๊ตฌ์กฐ |
| GlobalExceptionHandler.java | Handler | ์ ์ญ ์์ธ ์ฒ๋ฆฌ | @ControllerAdvice๋ก ์์ธ ์ผ๊ด ์ฒ๋ฆฌ |
| TodoCreateRequest.java | DTO | ์์ฒญ ๊ฒ์ฆ | @NotBlank, @Size ๋ฑ @Valid ๊ธฐ๋ฐ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ |
| TodoController.java | Controller | ๊ฒ์ฆ ์ ์ฉ | @Valid ์ ์ฉ์ผ๋ก ์๋ชป๋ ์์ฒญ ์ฌ์ ์ฐจ๋จ |
์ ์ด๋ ๊ฒ ๋๋๋๊ฐ?
Spring Boot ํ๋ก์ ํธ๋ฅผ Controller, Service, Repository๋ก ๋๋๋ ์ด์ ๋ ๊ฐ๋จํ๋ค.
๊ฐ ๊ณ์ธต์ด ์๊ธฐ ์ผ๋ง ํ๋๋ก ๋ง๋ค๊ธฐ ์ํด์๋ค.
| ๋ชจ๋ ๊ฒ์ Controller์ ์์ฑ (๋์ ์) | ์ฑ ์๋ณ๋ก ๋ถ๋ฆฌ (์ข์ ์) |
| TodoController.java โโ HTTP ์์ฒญ ์ฒ๋ฆฌ โโ ๋น์ฆ๋์ค ๋ก์ง โโ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ โโ ์์ธ ์ฒ๋ฆฌ โโ ๋ฐ์ดํฐ ๊ฒ์ฆ |
TodoController.java โโ HTTP ์์ฒญ/์๋ต๋ง ์ฒ๋ฆฌ TodoService.java โโ ๋น์ฆ๋์ค ๋ก์ง๋ง ์ฒ๋ฆฌ TodoRepository.java โโ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ๋ง ์ฒ๋ฆฌ GlobalExceptionHandler.java โโ ์์ธ ์ฒ๋ฆฌ๋ง ๋ด๋น |
| → ํ ํ์ผ์ด ๋๋ฌด ๋ง์ ์ฑ
์! → ์์ ํ ๋๋ง๋ค ์ํ → ์ด๋์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋์ง ์ฐพ๊ธฐ ์ด๋ ค์ |
→ ๊ฐ์ ์๊ธฐ ์ผ๋ง ํจ! |
1. ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility Principle)
ํ ํ์ผ์ ํ ๊ฐ์ง ์ผ๋ง ํด์ผ ํ๋ค.
๋ชจ๋ ์ฝ๋๋ฅผ TodoController ํ๋์ ์์ฑํ๋ฉด HTTP ์์ฒญ ์ฒ๋ฆฌ, ๋น์ฆ๋์ค ๋ก์ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ด ํ ํ์ผ์ ๋ค์์ด๊ฒ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์๋ฐฑ ์ค์ง๋ฆฌ ๊ฑฐ๋ํ ํ์ผ์ด ๋ง๋ค์ด์ง๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์์ธ์ ์ฐพ๊ธฐ ์ด๋ ค์์ง๋ค.
๊ณ์ธต์ ๋ถ๋ฆฌํ๋ฉด ๊ฐ ํ์ผ์ ์์ ์ ์ญํ ๋ง ์ํํ๋ค. Controller๋ HTTP ์์ฒญ๊ณผ ์๋ต๋ง ์ฒ๋ฆฌํ๊ณ , Service๋ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋ด๋นํ๋ฉฐ, Repository๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ๋ง ์ฑ ์์ง๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ค ๊ณ์ธต์ ํ์ธํด์ผ ํ๋์ง๊ฐ ์ฆ์ ๋ช ํํด์ง๋ค.
2. ์ ์ง๋ณด์์ฑ
์ฝ๋๋ ๋์ค์ ๊ณ ์น๊ธฐ ์ฌ์์ผ ํ๋ค.
์ค์ ๊ฐ๋ฐ ํ์ฅ์์๋ ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์๊ฐ๋ณด๋ค ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ๋ ์๊ฐ์ด ํจ์ฌ ๋ ๋ง์ด ์์๋๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ์ ๊ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค.
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ MySQL์์ PostgreSQL๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ค. ๊ณ์ธต ๋ถ๋ฆฌ๊ฐ ๋์ด ์์ง ์๋ค๋ฉด Controller ๊ณณ๊ณณ์ ์์ฑ๋ SQL์ ๋ชจ๋ ์์ ํด์ผ ํ๋ฉฐ, ์ด ๊ณผ์ ์์ ์ค์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋ฐ๋ฉด Repository๋ก ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ application.yml๊ณผ Repository ๊ณ์ธต์ ๊ตญํ๋๋ค. ์์ ๋ฒ์๊ฐ ๊ทน๋๋ก ์ค์ด๋ ๋ค.
๋ ๋ค๋ฅธ ์๋ก “์๋ฃ๋ ํ ์ผ์ ์์ ํ ์ ์๋ค”๋ผ๋ ๋น์ฆ๋์ค ๊ท์น์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณธ๋ค. Service ๊ณ์ธต์ ๋ก์ง์ด ๋ชจ์ฌ ์๋ค๋ฉด TodoService์ ์์ ๋ก์ง ํ ๊ณณ๋ง ๋ณ๊ฒฝํ๋ฉด ๋ชจ๋ API์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค. ๊ทธ๋ฌ๋ Controller๋ง๋ค ๋ก์ง์ด ํฉ์ด์ ธ ์๋ค๋ฉด ๋์ผํ ์ฝ๋๋ฅผ ์ฌ๋ฌ ํ์ผ์ ๋ฐ๋ณตํด์ ์ถ๊ฐํด์ผ ํ๋ค.
3. ํ ์คํธ ์ฉ์ด์ฑ
์ฝ๋๋ ์๋์ผ๋ก ๊ฒ์ฆํ ์ ์์ด์ผ ํ๋ค.
ํ
์คํธ๊ฐ ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์์ ํ ๋๋ง๋ค Postman์ผ๋ก ๋ชจ๋ API๋ฅผ ์๋์ผ๋ก ํธ์ถํด์ผ ํ๋ค. ๊ธฐ๋ฅ์ด ๋ง์์ง์๋ก ๊ฒ์ฆ ๋น์ฉ์ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๋ฉฐ, ์ค์๋ก ํ์ธํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํ๋ค.
๊ณ์ธต์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉด Service ๊ณ์ธต๋ง ๋
๋ฆฝ์ ์ผ๋ก ํ
์คํธํ ์ ์๋ค. HTTP ์๋ฒ๋ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋น ๋ฅด๊ฒ ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ, ํ
์คํธ๋ ๋ช ์ด ์์ ๋๋๋ค.
๋ฐ๋๋ก ๋ชจ๋ ๋ก์ง์ด Controller์ ์์ฌ ์๋ค๋ฉด ํ
์คํธ๋ฅผ ์ํด ์๋ฒ ์คํ, ์์ฒญ ์์ฑ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋น๊ฐ ํ์ํด์ง๊ณ , ํ
์คํธ ํ๋์ ๋ช ๋ถ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ์ด๋ฐ ๊ตฌ์กฐ์์๋ ํ
์คํธ ์์ฒด๊ฐ ์ธ๋ฉด๋ฐ๊ฒ ๋๋ค.
๊ฒฐ๋ก
Controller–Service–Repository ํจํด์ผ๋ก ๋๋๋ ์ด์ ๋ ๊ฒฐ๊ตญ ๊ฐ๋ฐ์๋ฅผ ํธํ๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ค.
์ด๊ธฐ์๋ ํ์ผ ์๊ฐ ๋์ด๋ ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ด ๊ตฌ์กฐ์ ์ฅ์ ์ด ๋ถ๋ช
ํด์ง๋ค.
๊ฐ ๊ณ์ธต์ด ์๊ธฐ ์ญํ ๋ง ์ํํ๋ฏ๋ก ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ฝ๊ณ , ์์ ํ๊ธฐ ์ฝ๊ณ , ํ ์คํธํ๊ธฐ ์ฝ๋ค. ์ด๊ฒ์ด ์ค๋ฌด์์ ์ด ํจํด์ด ํ์ค์ฒ๋ผ ์ฌ์ฉ๋๋ ์ด์ ๋ค.
'Spring > ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring Boot] MVC ํจํด ์ ๋ฆฌ (0) | 2026.01.22 |
|---|---|
| [Spring Boot] ์น ์๋น์ค ์ ์ฒด ์คํ ํ๋ฆ ๋ถ์ (React, FastAPI, MySQL ์ฐ๋ ์ํคํ ์ฒ) (0) | 2026.01.20 |

