๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

29์ผ์ฐจ. ์—๋Ÿฌ ์žก๊ณ  ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅ๊ฐ’ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ธฐ, ๋„์ปค ์ปดํฌ์ฆˆ ์—…

by GreenJin_S2 2025. 11. 18.

 

common-service๋ž‘ soccer-service๋Š” ๋„์ปค๊ฐ€ ๊บผ์ ธ์žˆ๋Š”๋ฐ ์™œ ๊ทธ๋Ÿฐ๊ฑฐ์•ผ?

 

 

 

 

 

 



@Slf4j
๋Š” Lombok์ด ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ธ๋ฐ, ์ด ํ•œ ์ค„๋งŒ ๋ถ™์ด๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

java
 
// @Slf4j๋ฅผ ๋ถ™์ด๋ฉด Lombok์ด ์ปดํŒŒ์ผํ•  ๋•Œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์‚ฝ์ž…ํ•ด ์คŒ
private static final org.slf4j.Logger log = 
        org.slf4j.LoggerFactory.getLogger(ํ˜„์žฌํด๋ž˜์Šค๋ช….class);

๊ทธ๋ž˜์„œ @Slf4j๋ฅผ ๋ถ™์ด๋ฉด ์–ป๊ฒŒ ๋˜๋Š” ์ด์ 

 
์žฅ์ ์„ค๋ช…
1. ์ฝ”๋“œ 5์ค„ → 1์ค„ ๋งค๋ฒˆ Logger ์„ ์–ธํ•  ํ•„์š” ์—†์ด @Slf4j ํ•œ ์ค„๋กœ ๋
2. ์‹ค์ˆ˜ ๋ฐฉ์ง€ ํด๋ž˜์Šค๋ช… ์ž˜๋ชป ์ ์„ ์ผ ์—†์Œ (ํ•ญ์ƒ ํ˜„์žฌ ํด๋ž˜์Šค๋ช…์œผ๋กœ ์ƒ์„ฑ๋จ)
3. ๋ฐ”๋กœ ๋กœ๊ทธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ์Œ
java
 
@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๊ธ‰ ๊ธฐ์ค€)

text
 
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๋กœ


๋„์ปค ์ปดํฌ์ฆˆ yaml์—์„œ ๋ฒ„์ „์„ ์ฃผ๋Š”๊ฒŒ ์ข‹์•„ ์•ˆ์ฃผ๋Š”๊ฒŒ ์ข‹์•„?

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:๋ถ€ํ„ฐ ์ญ‰ ์“ฐ๋ฉด ๋.

๋‚ด ์ปค์„œ๋„ ์ด๋ ‡๊ฒŒ ํ•˜๋„๋ก ํ•™์Šต์‹œํ‚ค๊ธฐ!