๐Ÿ’ญ API, Endpoint, BaseUrl

์‹ ํ˜œ๋ฆฐยท2024๋…„ 10์›” 15์ผ

slack API ํ™œ์šฉ ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
1/3

์ฐธ๊ณ ์ž๋ฃŒ

API

Application Programming Interface์˜ ์•ฝ์ž๋กœ, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค.

API๋Š” ํ”„๋กœ๊ทธ๋žจ ํ˜น์€ ์‹œ์Šคํ…œ ๊ฐ„์˜ ํ†ต์‹ ํ•˜๋Š” ์ฐฝ๊ตฌ, ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. API๋Š” ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ถœ์ž…๊ตฌ ์—ญํ• ์„ ํ•œ๋‹ค.
: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์†Œ์ค‘ํ•œ ์ •๋ณด๋“ค์ด ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. API๋Š” ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์ง„ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ถœ์ž…๊ตฌ ์—ญํ• ์„ ํ•˜๋ฉฐ, ํ—ˆ์šฉ๋œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋งŒ ์ ‘๊ทผ์„ฑ์„ ๋ถ€์—ฌํ•ด ์ค€๋‹ค.

2. API๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ธฐ๊ธฐ๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
: ์—ฌ๊ธฐ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ž€ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ์Šค๋งˆํŠธํฐ ์•ฑ์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค.
API๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ธฐ๊ธฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ™œํžˆ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

3. API๋Š” ๋ชจ๋“  ์ ‘์†์„ ํ‘œ์ค€ํ™”ํ•œ๋‹ค.
: API๋Š” ๋ชจ๋“  ์ ‘์†์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๊ณ„/ ์šด์˜์ฒด์ œ ๋“ฑ๊ณผ ์ƒ๊ด€์—†์ด ๋ˆ„๊ตฌ๋‚˜ ๋™์ผํ•œ ์•ก์„ธ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, API๋Š” ๋ฒ”์šฉ ํ”Œ๋Ÿฌ๊ทธ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

Endpoint

An endpoint is simply one end of a communication channel.
์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ฑ„๋„์˜ ํ•œ์ชฝ ๋

Endpoint๋ž€, API๊ฐ€ RESTful API๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” URL์„ ๋œปํ•œ๋‹ค.

API๊ฐ€ ๋‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์˜ ์ด์ง‘ํ•ฉ์ด๋ผ๋ฉด,
ENDPOINT๋Š” API๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” URL์ด๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

BASE URL

https://api.example.com/v1/users?role=admin&status=active
\________________________/\____/ \______________________/
  server(base) URL       endpoint    query parameters
                            path
  • ๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ๋Š” server(base) URL์˜ ์ƒ๋Œ€๊ฒฝ๋กœ๋‹ค.

์ด๋•Œ, Base URL์€ ํ™˜๊ฒฝ(dev, stg, prd ๋“ฑ)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋™์ ์œผ๋กœ ์„ค์ •๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

Doppler๋ฅผ ์‚ฌ์šฉํ•œ ํ™˜๊ฒฝ๋ณ„ Base URL ์„ค์ • ์˜ˆ์‹œ:

const api = axios.create({
  baseURL: import.meta.env.BASE_URL, // ๋„ํ”Œ๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
  headers: {
    Authorization: `Bearer ${ import.meta.env.SLACK_TOKEN }`,
    'Content-Type': 'application/json',
  },
})

baseURL: import.meta.env.BASE_URL

Vite์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ Base URL๋กœ, ์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Doppler๋ฅผ ์‚ฌ์šฉํ•ด ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์ž‘์„ฑ ๋˜์—ˆ๋‹ค.
Doppler๋Š” ๊ฐ ํ™˜๊ฒฝ(dev, stg, prd ๋“ฑ)๋งˆ๋‹ค ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ Base URL์ด ๋‹ฌ๋ผ์ง€๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.




์ฐธ๊ณ ) ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋„ํ”Œ๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ช…๋ น์–ด์— doppler run์ด ์กด์žฌํ•จ

BaseUrl - ๋กœ์ปฌ ๋ฐ ๋„คํŠธ์›Œํฌ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

์„œ๋ฒ„๋ฆฌ์Šค ๋„์šฐ๊ธฐ ์ „, ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•

โš™๏ธ Backend

  • ๋กœ์ปฌ ์ ‘์† ์‹œ
    doppler run -- serverless offline

  • ๋„คํŠธ์›Œํฌ ์ ‘์† ์‹œ
    doppler run -- serverless offline --host 0.0.0.0

  • ์ฝ”๋“œ

const api = axios.create({
  baseURL: 'https://slack.com/api',
  headers: {
    Authorization: `Bearer ${ process.env.SLACK_TOKEN }`,
    'Content-Type': 'application/json',
  },
})

๐ŸŽจ Frontend

  • ๋กœ์ปฌ ์ ‘์† ์‹œ
const api = axios.create({
  baseURL: 'http://localhost:3000', // ๋กœ์ปฌ ์ ‘์† ์‹œ
  headers: {
    Authorization: `Bearer ${ import.meta.env.SLACK_TOKEN }`,
    'Content-Type': 'application/json',
  },
})
  • ๋„คํŠธ์›Œํฌ ์ ‘์† ์‹œ
const api = axios.create({
  baseURL: 'http://0.0.0.0:3000', // ๋„คํŠธ์›Œํฌ ์ ‘์† ์‹œ
  headers: {
    Authorization: `Bearer ${ import.meta.env.SLACK_TOKEN }`,
    'Content-Type': 'application/json',
  },
})
profile
๊ฐœ ๋ฐœ์ž๊ตญ ๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€