◆ TURNING LAB

강한 결합 직접 만들고 부숴보기

new 의 함정 — 실습 / 약 20분

📍 지금 어디를 만지고 있나요?
브라우저
Tomcat
코드 결합 실험
Controller
DB

사전 준비

이번 실습의 목표

의도적으로 「new 함정」 코드를 짜보고, 부품 교체 요청을 받았을 때 코드가 어떻게 부서지는지 직접 체감합니다. 다음 차시 IoC/DI 를 배울 때 「왜 이걸 배우는지」 가 살아있게 됩니다.

1
v1 코드 작성 — 강하게 묶이기
// File: OrderApp.java
class GmailSender {
    void send(String msg) { System.out.println("📧 Gmail: " + msg); }
}

class OrderService {
    private GmailSender mail = new GmailSender();  // ← 강한 결합!
    void order() {
        System.out.println("주문 처리...");
        mail.send("주문 완료");
    }
}

public class OrderApp {
    public static void main(String[] args) {
        OrderService service = new OrderService();
        service.order();
    }
}
$ javac OrderApp.java
$ java OrderApp
주문 처리...
📧 Gmail: 주문 완료
2
요청 도착 — 카카오톡으로 바꿔주세요

위 코드에 KakaoSender 클래스를 추가하고 OrderService 를 수정합니다.

class KakaoSender {
    void notify(String msg) { System.out.println("💬 Kakao: " + msg); }
    //  ^^^^^^ Gmail 의 send 와 메서드 이름이 다르다!
}
CHECKPOINT — 무엇을 바꿔야 하나
  • OrderService 의 필드 타입: GmailSenderKakaoSender
  • new GmailSender()new KakaoSender()
  • mail.send(...)mail.notify(...) (메서드 이름 다름)
  • 변수명 mail 도 어색해짐 — 의미상 messenger 같은 게 맞음
3
실제로 수정해보기
class OrderService {
    private KakaoSender messenger = new KakaoSender();  // ← 모두 변경
    void order() {
        System.out.println("주문 처리...");
        messenger.notify("주문 완료");                  // ← 호출 코드도
    }
}
CHECKPOINT
  • 메일 보내는 클래스가 5 곳에 있다면 — 5 곳 모두 같은 작업을 반복?
  • 다음 달에 「알림톡으로 또 바꾸자」하면? 또 같은 작업.
  • 이게 「강한 결합」이 만드는 비용입니다.
4
미래의 약속 — 인터페이스 + 외부 주입

다음 차시 IoC/DI 에서는 다음 패턴을 배웁니다 — 미리 살짝.

interface MessageSender {
    void send(String msg);
}

class OrderService {
    private MessageSender sender;  // 인터페이스에 의존
    OrderService(MessageSender sender) {
        this.sender = sender;       // 외부에서 받음 (주입)
    }
    void order() { sender.send("주문 완료"); }
}

이렇게 짜면 부품을 갈아끼워도 OrderService 는 한 줄도 수정 안 됩니다.

실습 완료 체크리스트

v1 의 강한 결합 코드 작성
부품 교체 요청을 받고 직접 수정해봄
한 줄 요청이 여러 곳을 수정하게 만든다는 사실 체감
「인터페이스 + 외부 주입」이 이 문제를 푸는 방향임을 안다