๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript

Web-Client DIP(Dependency inversion principle)

by frontChoi 2026. 5. 15.
๋ฐ˜์‘ํ˜•

 

๐Ÿ˜— DIP(Dependency inversion principle)๋ž€?

์ƒ์œ„๋ชจ๋“ˆ์€ ํ•˜์œ„๋ชจ๋“ˆ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

์ฆ‰ ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜์ง€ ๋ง๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผํ•œ๋‹ค ์ด๋‹ค

 

 

๐Ÿง Web - Client ์˜ DIP

์›น ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋กœ ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค

index.html <-> main.js <-> auth-service.js <-> api-client.js <-> fetch

 

ํŒŒ์ผ ์—ญํ• 
index.html view
main.js UI/์‚ฌ์šฉ์ž ํ๋ฆ„
auth-service.js ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
api-client.js HTTP ์ถ”์ƒํ™” 
fetch ์‹ค์ œ ๊ตฌํ˜„ ๊ธฐ์ˆ 

 

api-client.js

import { mapHttpError, mapUnknownError } from "./errors/error-mapper.js";
export async function post(url, data) {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(data),
    });

    const error = mapHttpError(response);
    if (error) {
      throw error;
    }
    return await response.json();
  } catch (e) {
    throw mapUnknownError(e);
  }
}

api-client์€ http๋ฅผ ์ถ”์ƒํ™” ํ•œ๊ฒƒ์ด๋‹ค.

post๋ฅผ ํ˜ธ์ถœ์‹œ์— fetch๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , http error๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ mapUnknownError์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

 

auth-service.js

import { post } from "./app-client.js";

export const authService = {
  async login(email, password) {
    return await post("http://localhost:3000/login", {
      email,
      password,
    });
  },
};

์•ž์—์„œ http๋ฅผ ์ถ”์ƒํ™” ํ•˜์˜€๋‹ค.

auth-service.js์—์„œ๋Š” post๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, "/login"์„ ํ˜ธ์ถœํ•œ๋‹ค.

 

auth-service.js์—์„œ๋Š” fetch๋ฅผ ์ง์ ‘์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š”๊ฒƒ์—์„œ ์ถ”์ƒํ™”๋˜์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

main.js

import { authService } from "./auth-service.js";

const loginBtn = document.querySelector("button#loginBtn");
const email = document.querySelector("input#email");
const password = document.querySelector("input#password");
function validate() {
  if (!email.value || !password.value) {
    throw new Error("๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
  }
}

loginBtn.addEventListener("click", async () => {
  try {
    validate();
    await authService.login(email.value, password.value);
    alert("๋กœ๊ทธ์ธ ์„ฑ๊ณต");
  } catch (error) {
    alert(error.message);
  }
});

main.js์—์„œ๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

main.js์—์„œ๋Š” fetch์˜ ์กด์žฌ๋„ ๋ชจ๋ฅด๊ณ , http status code๋„ ๋ชจ๋ฅธ๋‹ค.

๊ทธ๋Ÿฌํ•œ ๊ด€์ ์—์„œ๋Š” ์ถ”์ƒํ™”๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ˜Œ DIP  (0) 2026.05.11
Queue์œผ๋กœ ์ž‘์—…์‹คํ–‰  (0) 2025.05.19
๐Ÿ’ฟ ์ƒํƒœ ํŒจํ„ด  (0) 2024.11.25
โ„๏ธ ์ „๋žต ํŒจํ„ด  (1) 2024.11.19
โ˜‚๏ธ ์ปค๋ง  (0) 2024.05.29

๋Œ“๊ธ€