
common-service๋ soccer-service๋ ๋์ปค๊ฐ ๊บผ์ ธ์๋๋ฐ ์ ๊ทธ๋ฐ๊ฑฐ์ผ?



@Slf4j๋ Lombok์ด ์ ๊ณตํ๋ ์ด๋
ธํ
์ด์
์ธ๋ฐ, ์ด ํ ์ค๋ง ๋ถ์ด๋ฉด ์๋ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค.
// @Slf4j๋ฅผ ๋ถ์ด๋ฉด Lombok์ด ์ปดํ์ผํ ๋ ์๋ ์ฝ๋๋ฅผ ์๋ ์ฝ์
ํด ์ค
private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(ํ์ฌํด๋์ค๋ช
.class);
๊ทธ๋์ @Slf4j๋ฅผ ๋ถ์ด๋ฉด ์ป๊ฒ ๋๋ ์ด์
| 1. ์ฝ๋ 5์ค → 1์ค | ๋งค๋ฒ Logger ์ ์ธํ ํ์ ์์ด @Slf4j ํ ์ค๋ก ๋ |
| 2. ์ค์ ๋ฐฉ์ง | ํด๋์ค๋ช ์๋ชป ์ ์ ์ผ ์์ (ํญ์ ํ์ฌ ํด๋์ค๋ช ์ผ๋ก ์์ฑ๋จ) |
| 3. ๋ฐ๋ก ๋ก๊ทธ ์ฌ์ฉ ๊ฐ๋ฅ | ์๋์ฒ๋ผ ๋ฐ๋ก ์ธ ์ ์์ |
@Slf4j
@Service
public class PlayerServiceImpl {
public void someMethod(String name) {
log.debug("๋๋ฒ๊ทธ ๋ก๊ทธ: {}", name);
log.info("์ ๋ณด ๋ก๊ทธ: {}", name);
log.warn("๊ฒฝ๊ณ ๋ก๊ทธ: {}", name);
log.error("์๋ฌ ๋ก๊ทธ: {}", name);
}

์๋๋ฉด ๋ค ์ง์ฐ๊ณ ๋ค์ docker compose upํ์!
๊ทธ๋ฆฌ๊ณ ์ปค์ํํ ํด๊ฒฐํ๋ผ๊ณ ํ๊ธฐ
์! ์ ํํ ์ง๊ธ ๋น์ ํ๋ก์ ํธ๊ฐ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ์ต๊ณ ์ ๊ตฌ์กฐ์์. ์ด ๊ตฌ์กฐ๊ฐ ์ ์ด๋ ๊ฒ ์๋ฒฝํ์ง, ๊ฐ ํ์ผ์ด ์ ํํ ๋ฌด์จ ์ญํ ์ ํ๋์ง ๋ฑ ์ ๋ฆฌํด๋๋ฆด๊ฒ์.
์ง๊ธ ๋น์ ํ๋ก์ ํธ์ ์๋ฒฝํ ๊ณ์ธต ๊ตฌ์กฐ (์ค๋ฌด A๊ธ ๊ธฐ์ค)
PlayerService ← ์ธํฐํ์ด์ค (1๊ฐ)
PlayerServiceImpl ← ๊ตฌํ์ฒด (1๊ฐ)
PlayerRepository ← JpaRepository ์์ ์ธํฐํ์ด์ค (1๊ฐ)
PlayerRepositoryCustom ← ๋ณต์กํ ์ฟผ๋ฆฌ์ฉ ์ธํฐํ์ด์ค (1๊ฐ)
PlayerRepositoryImpl ← Custom ๊ตฌํ์ฒด (์ด๋ฆ ๋์ Impl ํ์!) (1๊ฐ)
์ด๊ฒ ๋ฐ๋ก ์ค๋ฌด 99%๊ฐ ์ฐ๋ ์ ์ ์ค์ ์ ์์ ๋๋ค. ์ด์ ๋ฅผ ํ๋์ฉ ๊น๋ํ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์.
| PlayerService | Spring ๊ถ์ฅ ํจํด Mock ํ ์คํธ ๊ฐ๋ฅ @Transactional ํ๋ก์ ์ ๋จนํ | ํ ์คํธ ์ง์ฅ + AOP ์ ๋จนํ |
| PlayerServiceImpl | ์ค์ ๋น์ฆ๋์ค ๋ก์ง ์์ฑ @Service ๋ถ์ด๋ ๊ณณ | ๋น์ฐํ ๋ก์ง ์์ผ๋ฉด ์คํ ์ ๋จ |
| PlayerRepository | JpaRepository ์์ → ๊ธฐ๋ณธ CRUD ์๋ ์ ๊ณต | findById, save ๊ฐ์ ๊ธฐ๋ณธ ๋ฉ์๋๋ ์ง์ ๋ง๋ค์ด์ผ ํจ |
| PlayerRepositoryCustom | ๋ณต์กํ ๋์ ์ฟผ๋ฆฌ(Querydsl) ์ ์ธ๋ง | ๊ตฌํ์ฒด๊ฐ ์ธํฐํ์ด์ค ์์ผ๋ฉด Spring์ด ๋ชป ์ฐพ์ |
| PlayerRepositoryImpl | ์ง์ง Querydsl ์ฟผ๋ฆฌ 100์ค์ง๋ฆฌ ์์ฑ ์ด๋ฆ ๋์ Impl ํ์!! | Spring์ด ์ด ํด๋์ค๋ฅผ ์ค์บ ๋ชป ํด์ NoSuchBeanDefinitionException ํฐ์ง |

์ด 4์ค์ด ํ๋ ์ผ (ํ๋ง๋๋ก ์์ฝ)
“๋ธ๋ผ์ฐ์ ์์ http://๊ฒ์ดํธ์จ์ด:8080/soccer-service/์๋ฌด๊ฑฐ๋ ๋ก ์ค๋ ์์ฒญ์ → Eureka์ ๋ฑ๋ก๋ SOCCER-SERVICE(๋ง์ดํฌ๋ก์๋น์ค)๋ก ๋ณด๋ด์ค!”
๊ฐ ์ค์ด ์ ํํ ๋ฌด์จ ๋ป์ธ์ง
| id: soccer-service | ์ด ๋ผ์ฐํธ์ ์ด๋ฆ | ๋ก๊ทธ๋ ๋ชจ๋ํฐ๋ง์์ ๊ตฌ๋ถํ ๋ ์ฌ์ฉ (๋ณ๋ก ์ค์ X) |
| uri: lb://SOCCER-SERVICE | ์ด๋๋ก ๋ณด๋ผ๊น? | lb:// = LoadBalancer ์ฌ์ฉ SOCCER-SERVICE = Eureka(๋๋ Nacos ๋ฑ)์ ๋ฑ๋ก๋ ์๋น์ค ์ด๋ฆ → ์ฌ๋ฌ ๋ ๋ ์์ด๋ ์๋์ผ๋ก ๋ถ์ฐํด์ค |
| predicates: | ์ธ์ ์ด ๋ผ์ฐํธ๋ฅผ ํ๊น? | ์กฐ๊ฑด์ ์ ๋ ๊ณณ |
| - Path=/soccer-service/** | URL ๊ฒฝ๋ก๊ฐ /soccer-service/๋ก ์์ํ๋ฉด ์ด ๋ผ์ฐํธ๋ก! | ์์: /soccer-service/player/1 → soccer-service๋ก /soccer-service/search?keyword=๋ฉ์ → soccer-service๋ก |
ChatGPT์ ๋ง:
์ค์ค ์ด๊ฑฐ ์ง์ง ํ์
์์๋ ์ฌ๋๋ง๋ค ์๊ฒฌ ๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด๋ผ ์ฝ๊ฐ ์ฌ๋ฐ๋ ์ง๋ฌธ์ด๋ค ๐
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ์์ฆ์ ๋ฒ์ ๋ช
์ ์ ํ๋ ๊ฒ ๋ ์์ฐ์ค๋ฝ๊ณ ์์ ํ ๋ฐฉํฅ์ด์ผ.
์๋๋ฉด:
๐ง 1) Docker Compose v2๋ถํฐ๋ version: ์์ฒด๊ฐ ํ์ ์์ด์ง
์์ ์๋
version: '2', version: '3.8' ์ด๋ฐ ์์ผ๋ก ๊ผญ ์จ์ค์ผ ํ๋๋ฐ,
**Compose Spec ํตํฉ ์ดํ(v2)**๋ version: ํค๊ฐ ์ฌ์ค์ ๋ฌด์๋ผ.
๋์ปค ๊ณต์ ๋ฌธ์์์๋ “์ด์ version: ์๋ตํ๊ณ ๋ฐ๋ก services:๋ถํฐ ์์ํ์ธ์” ์ด๋ฐ ๋ถ์๊ธฐ.
๐ฅ 2) ๋ฒ์ ์ฐ๋ฉด ์คํ๋ ค ํท๊ฐ๋ฆด ๋๊ฐ ์์ด
์๋ฅผ ๋ค์ด version: "3.8"์ ์จ๋์ผ๋ฉด
- ์ด๋ค ๊ธฐ๋ฅ์ด ์ ๋๋์ง
- ์ด ๋ฒ์ ์ด Docker Engine ๋ฒ์ ์ด๋ ์ฐ๋๋๋์ง
- Swarm์ฉ์ธ์ง Compose์ฉ์ธ์ง
ํท๊ฐ๋ ค์ ๋๋ฒ๊น ํ ๋ ๋ ๊ณจ์น ์ํ์ง.
๐ฆ 3) Compose๋ ์ด์ฐจํผ ์ต์ ์คํ์ผ๋ก ํ์ฑํจ
version: ์ ์ ์ผ๋ฉด
- ๋๊ฐ ์ด yaml์
- ํ์ฌ ์ค์น๋ Compose๊ฐ
- ์์์ ๊ฐ๋ฅํ ์ต์ ์คํ์ผ๋ก ํด์ํด์ค.
๊ทธ ๋ง์ = ๊ตณ์ด ๋ฒ์ ๋ฐ์๋์ ์ด์ ๊ฐ ์์.
๐ง ํ ์ค ์ ๋ฆฌ
์ง๊ธ ์๋ก ์ฐ๋ docker-compose.yml์ด๋ผ๋ฉด version: ์ ๋ ์ ์ ๋ ๊ฒ ๋ฒ ์คํธ.
๊ทธ๋ฅ services:๋ถํฐ ์ญ ์ฐ๋ฉด ๋.
๋ด ์ปค์๋ ์ด๋ ๊ฒ ํ๋๋ก ํ์ต์ํค๊ธฐ!
'Project ESG+AI > [์ผ์ KPMG]ESG ๋ฐ์ดํฐ ํ์ฉ ํ์คํ ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 31์ผ์ฐจ. ๊น ๋ธ๋์น ๋ง๋ค๊ธฐ (0) | 2025.11.20 |
|---|---|
| 30์ผ์ฐจ. (0) | 2025.11.19 |
| 28์ผ์ฐจ. (0) | 2025.11.17 |
| 27์ผ์ฐจ. (0) | 2025.11.14 |
| 26์ผ์ฐจ. (0) | 2025.11.13 |