강한 결합(Tight Coupling)과 느슨한 결합(Loose Coupling)

cabbage·2023년 1월 27일
0

기타

목록 보기
18/26

강한 결합(Tight Coupling)

강한 결합은 서로 다른 클래스들이 서로 크게 의존하는 경우를 말한다.

강한 결합의 예시 코드는 아래와 같다.

export class ProductController {
  buyProduct = (req, res) => {
    const cashService = new CashService();
    const hasMoney = cashService.checkValue();

    const productService = new ProductService();
    const isSoldout = productService.checkSoldout();

    if (hasMoney && !isSoldout) {
      // ...
    }
  };

  refundProduct = (req, res) => {
    const productService = new ProductService();
    const isSoldout = productService.checkSoldout();

    if (isSoldout) {
      res.send("상품 환불 완료!!");
    }
  };
}
  • ProductController 클래스에 선언한 메서드에서 CashService, ProductService의 객체를 직접 생성해 메서드를 호출하는 형태의 코드이다.
  • ProductController 클래스가 CashService, ProductService 클래스를 직접 사용해 생성한 객체에 의존하고 있는 강한 결합 상태이다.

강한 결합의 단점

강한 결합은 아래와 같은 특징을 갖는다.

  1. 강한 결합 상태의 코드는 유지보수하기가 어렵다.
    • 컨트롤러와 의존 관계에 있는 서비스 객체를 변경해야 하는 경우, 컨트롤러가 서비스 객체를 사용하고 있는 코드를 모두 수정해야 한다.
    • 만약 현재 의존 관계에 있는 서비스 객체를 모두 수정하지 않는 경우, 비즈니스 로직에 문제가 발생할 수 있다.
  2. 서비스 객체가 필요할 때마다 서비스 객체를 생성해서 사용하므로 메모리 효율성이 좋지 않다.
    • 서비스 객체의 로직이 필요한 경우 서비스 객체를 생성 후 사용하는데, 객체를 중복 생성하면 메모리를 효율적으로 사용할 수 없다.

느슨한 결합(Loose Coupling)

느슨한 결합강한 결합의 반대 개념으로, 객체들이 서로 결합이 되어 있긴 하지만 강한 결합 상태 보다는 느슨한 상태의 결합이라고 볼 수 있다. 어떤 클래스에서 다른 클래스를 직접적으로 사용하는 클래스 의존성을 줄인 결합 상태를 말한다.

강한 결합 상태의 코드를 느슨한 결합 상태로 만든 예시 코드는 다음과 같다.

// index.js

import express from "express";
import { ProductController } from "./mvc/controllers/product.controller.js";
import { CashService } from "./mvc/controllers/services/cash.service.js";

const app = express();
const cashService = new CashService();
const productController = new ProductController(cashService);
app.post("/products/buy", productController.buyProduct);
  • index.js에서 CashService 객체를 생성하고, ProductController 객체를 생성할 때 생성자의 인자로 CashService 객체를 전달한다.
// product.controller.js

import { ProductService } from './services/product.service.js'

export class ProductController {
  constructor(cashService) {
    this.cashService = cashService;
  }

  buyProduct = (req, res) => {
    // const cashService = new CashService();
    const hasMoney = this.cashService.checkValue();

    const productService = new ProductService()
    const isSoldout = productService.checkSoldout();

    if (hasMoney && !isSoldout) {
      res.send("상품을 구매합니다.");
    }
  };

  refundProduct = (req, res) => {
    const productService = new ProductService()
    const isSoldout = productService.checkSoldout();

    if (isSoldout) {
      res.send("상품을 환불합니다.");
    }
  };
}
  • constructor를 사용해 CashService 객체를 전달 받는다.
  • 아직 ProductControllerProductService는 강한 결합 상태인데, ProductService 객체를 직접 생성해서 사용하고 있기 때문이다.

ProductController 클래스는 CashService 의 객체를 직접 생성하지 않는다. ProductController 외부에서 객체를 생성하여 constructor를 통해 안으로 전달하는 형태이다.

Constructor Injection(생성자 주입)을 사용하는 의존성 주입(Dependency Injection)으로 두 클래스를 느슨한 결합 상태로 만든 것이다.

정리

  • 강한 결합은 클래스들이 서로 크게 의존하여 강하게 결합된 상태를 말한다.
  • 느슨한 결합은 클래스들이 서로 결합이 되어 있긴 하지만, 강한 결합 상태 보다는 느슨한 상태의 결합이라고 볼 수 있다.
    어떤 클래스에서 다른 클래스를 직접적으로 사용하는 클래스 의존성을 줄인 결합 상태를 말한다.
  • 강한 결합 상태의 코드는 유지보수가 어렵다.
  • 의존성 주입(Dependency Injection, DI)을 통해 강한 결합느슨한 결합으로 바꿀 수 있다.
profile
캐비지 개발 블로그입니다. :)

0개의 댓글