โœ๐Ÿป [Code Camp_TIL] 17์ผ์ฐจ: CORS, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ดˆ, DBeaver ์‹ค์Šต

code_Jยท2023๋…„ 4์›” 19์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
24/41
post-thumbnail

CORS


CORS๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์—๋Š” SOP(Same Origin Policy) ์ •์ฑ…์ด ๋จผ์ € ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„ค์ด๋ฒ„ ๋ธŒ๋ผ์šฐ์ €์˜ api ์š”์ฒญ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์‘๋‹ต์€ ๋„ค์ด๋ฒ„ ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๋‹ค์›€ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์›€ ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋‹ค์›€์—์„œ๋„ ๋„ค์ด๋ฒ„์˜ ๋ฐฑ์—”๋“œ์— api ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž! ํ•ด์„œ ๋‚˜์˜จ ๊ฒƒ์ด CORS(Cross Origin Resource Sharing)๋‹ค.


preflight(api ์š”์ฒญ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์š”์ฒญ ๋ณด๋‚ด๋ณด๋Š” ๊ฒƒ)๋ฅผ ๋ณด๋‚ด๋ฉด, ๋ฐฑ์—”๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค˜๋„ ๋˜๋Š”์ง€, ์•ˆ๋˜๋Š”์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ์•Œ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.

๋ฐฑ์—”๋“œ์—์„œ CORS ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค˜๋„ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ช…์‹œํ•ด๋†“๊ณ , ๊ฒ€์‚ฌ ํ›„์— CORS ํ—ˆ์šฉ ํ˜น์€ ๊ฑฐ์ ˆ์„ ๋ณด๋‚ธ๋‹ค.


CORS๊ฐ€ ๊ฑฐ์ ˆ๋œ ๊ฒฝ์šฐ, ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๋กœ ์šฐํšŒํ•ด์„œ ์›๋ž˜ api ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋˜ ๋ฐฑ์—”๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๋ธŒ๋ผ์šฐ์ €์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„์ฃผ๋Š” ๋Œ€๋ฆฌ์ธ ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ํ”„๋ก์‹œ์„œ๋ฒ„(proxy)๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ ์™ธ์— ๋ชจ๋ฐ”์ผ๋กœ api ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐฑ์—”๋“œ ์ปดํ“จํ„ฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋Ÿฌ๋ฉด ๋‹ค ์šฐํšŒํ•˜๋ฉด ๋ ํ…๋ฐ ์™œ ๊ตณ์ด CORS ์ •์ฑ…์ด ์žˆ๋Š”๊ฑธ๊นŒ? ๋ฐ”๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค!

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด, ๋ฐฑ์—”๋“œ์—์„œ ๊ฒ€์ฆ ํ›„ ๋ธŒ๋ผ์šฐ์ €์— ๋กœ๊ทธ์ธ์ฆํ‘œ๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค๋ผ๋Š” ๊ณณ์— ๋กœ๊ทธ์ธ์ฆํ‘œ๋ฅผ ์ €์žฅํ•ด๋†“๋Š”๋‹ค.

์ฟ ํ‚ค์— ๋ˆ„๊ตฌํ•œํ…Œ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™”๋Š”์ง€ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ๋กœ๊ทธ์ธ์ฆํ‘œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋กœ๊ทธ์ธ์ฆํ‘œ๋ฅผ ๋ฐ›์•˜๋˜ ๋ฐฑ์—”๋“œ์— ๋‹ค์‹œ api๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋งŒ์„ CORS ํ—ˆ์šฉํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์›๋ž˜ ๋ธŒ๋ผ์šฐ์ €์™€ ๋˜‘๊ฐ™์ด ์ƒ๊ธด ํ•ดํ‚น ์‚ฌ์ดํŠธ๊ฐ€ ์ ‘์†์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!


๋ฐฑ์—”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค


์„œ๋น„์Šค ์ „์ฒด ๊ตฌ์กฐ ์ดํ•ด


database

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„๋‘๋Š” ์ €์žฅ์†Œ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„๋‘๋Š” ๋ฐฉ์‹์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

SQL(ํ‘œ ๋ฐฉ์‹): Oracle, MySQL, Postgresql..
NoSQL(์„œ๋ฅ˜ ๋ฐฉ์‹): MongoDB, Redis, Firebase..


SQL ๋ฐฉ์‹

SQL ๋ฐฉ์‹์€ NoSQL ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ํ‘œ ์‚ฌ์ด์— ๊ด€๊ณ„์„ฑ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ด€๊ณ„์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ผ๊ณ  ํ•œ๋‹ค. ํ†ต์‹ ์„ ๋„์™€์ฃผ๋Š” ํˆด๋กœ ORM(Object Relation Mapping)์„ ์‚ฌ์šฉํ•œ๋‹ค.


NoSQL ๋ฐฉ์‹

NoSQL ๋ฐฉ์‹์€ ์„œ๋ฅ˜ ๋ด‰ํˆฌ์— document๋ฅผ ๋ชจ์•„๋‘๋Š” ๋ฐฉ์‹์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์„œ๋ฅ˜ ๋ด‰ํˆฌ๋ฅผ ์ปฌ๋ ‰์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ํ†ต์‹ ์„ ๋„์™€์ฃผ๋Š” ํˆด๋กœ ODM(Object Document Mapping)์„ ์‚ฌ์šฉํ•œ๋‹ค.


DB ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ

DB ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์—๋Š” DBeaver, MySQL webpack ๋“ฑ์ด ์žˆ๋‹ค. ์ˆ˜์—…์—์„œ๋Š” DBeaver๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.



๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ตฌ์ถ• ์‹ค์Šต


์‹ค์Šตํ•  ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ORM์„ ์„ค์น˜ํ•ด์„œ ORM์„ ํ†ตํ•ด DB์™€ ์—ฐ๊ฒฐ.
JS์— ๋ฐฑ์—”๋“œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ class ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์คŒ.
ํ•ด๋‹นํ•˜๋Š” class๋ฅผ ๋„ฃ์œผ๋ฉด DB์— Board table์ด ๋งŒ๋“ค์–ด์ง.
DB ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด DB์— ํ…Œ์ด๋ธ”์ด ์ž˜ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ.


Node.js

์›๋ž˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐœ๋ฐœ์„ ํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, node.js๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ผœ์ง€ ์•Š๊ณ  ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๊ฒผ๋‹ค.


์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

  1. ํ™•์žฅ์ž js๋กœ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
  2. ์ฝ”๋“œ ์ž‘์„ฑ
  3. ํ„ฐ๋ฏธ๋„์— node ํŒŒ์ผ ์ž…๋ ฅํ•ด์„œ ํŒŒ์ผ ์‹คํ–‰์‹œํ‚ค๊ธฐ

Node.js์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•˜๊ธฐ

  1. ts/tsx ํ™•์žฅ์ž ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

  2. typescript ์„ค์น˜ ๋ฐ ์„ค์ •

    yarn add --dev typescript

  3. ts-node(ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ”„๋กœ๊ทธ๋žจ) ์„ค์น˜

    yarn add ts-node

  4. package.json์— ํŒŒ์ผ ์‹คํ–‰ ๋ช…๋ น์–ด ์ถ”๊ฐ€ ํ›„ ๋ช…๋ น์–ด๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅ(yarn ๋ช…๋ น์–ด)

"scripts": {
    "๋ช…๋ น์–ด": "ts-node index.ts"
  },

ํ”„๋กœ์ ํŠธ์™€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์‹ค์Šต

typeORM์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋ฐฑ์—”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

typeORM ์„ค์น˜

yarn add typeorm
yarn add pg(typeorm์ด postgres์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)


๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋ฐฑ์—”๋“œ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ

import { DataSource } from "typeorm";
import { Board } from "./Board.postgres";

const AppDataSource = new DataSource({
  type: "postgres",
  host: "DB๊ฐ€ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ IP ์ฃผ์†Œ",
  port: DB๊ฐ€ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ port number,
  username: "postgres",
  password: "password",
  database: "postgres",
  entities: [Board], // entities์˜ ํŒŒ์ผ๊ฒฝ๋กœ
  synchronize: true, 
  logging: true, 
});

AppDataSource.initialize()
  .then(() => {
    console.log("์—ฐ๊ฒฐ ์„ฑ๊ณต!");
  })
  .catch((error) => console.log(error, "์—ฐ๊ฒฐ ์‹คํŒจ!"));

entity ๋งŒ๋“ค๊ธฐ

Board.postgres.ts ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , entity๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

// entities ๋งŒ๋“ค์–ด์ฃผ๊ธฐ _ ์ƒˆ๋กœ์šด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from "typeorm";

// @ -> ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(typeORM์—๊ฒŒ ํ…Œ์ด๋ธ”์ž„์„ ์•Œ๋ ค์คŒ. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜)
 @Entity() 
	export class Board extends BaseEntity {
      
		// primaryGenerateColumn: ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฒˆํ˜ธ		
			@primaryGenerateColumn(โ€™incrementโ€™) 
			number!: number;
			
			@column({type : โ€œtextโ€})
			wrtier!: string;
		
		  @Column({ type: "text" })
		  title!: string;
		
		  @Column({ type: "text" })
		  contents!: string;

}

์—ฌ๊ธฐ์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ํƒ€์ž…์„ tsconfig.json์—์„œ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

"experimentalDecorators": true

DBeaver ์—ฐ๋™

  1. ์ขŒ์ธก ์ƒ๋‹จ ํ”Œ๋Ÿฌ๊ทธ ๋ชจ์–‘ ํด๋ฆญ

  2. postgreSQL ์„ ํƒ

  3. Host ๋ถ€๋ถ„์— localhost ๋Œ€์‹  ๋ฐฑ์—”๋“œ ์ฃผ์†Œ ์ž…๋ ฅ

  4. ๋ชจ๋‘ ์ž…๋ ฅ ํ›„ test connection ํด๋ฆญ(ํŒŒ๋ž€์ƒ‰ ๋œจ๋ฉด ์™„๋ฃŒ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ์™„๋ฃŒ ๋ˆ„๋ฅด๊ธฐ)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DB์— ํ…Œ์ด๋ธ”์ด ์ž˜ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
Web FE ๊ฐœ๋ฐœ์ž ์ทจ์ค€์ƒ

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