Code Monkey home page Code Monkey logo

jandy_web_back's People

Contributors

inhyeok-j avatar iqeq1945 avatar istiopaxx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

jandy_web_back's Issues

Bug: ์œ ์ € ๊ฒ€์ƒ‰ ์‹œ keyword๊ฐ€ null์ผ๋•Œ ์ „์ฒด ์œ ์ €๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์Œ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Search?keyword=&skip=0&take=10&type=user ์—์„œ keyword๊ฐ€ null ์ด๋ฉด ์ „์ฒด ์œ ์ €๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
keyword๊ฐ€ null ์ผ๋•Œ ์ „์ฒด ์œ ์ €๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
where ์ฟผ๋ฆฌ๋ฅผ ์“ฐ๋Š”๋ฐ ์žˆ์–ด์„œ keyword๊ฐ€ null ์ด๋ฉด where ์ฟผ๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€์•Š๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๊ฒŒ๋” ํ•ด์•ผํ•จ.

prisma unique error

@InHyeok-J
โš ๏ธ There might be data loss when applying the changes:

โ€ข A unique constraint covering the columns [followerId,followingId] on the table follow will be added. If there are existing duplicate values, this will fail.

โˆš Do you want to ignore the warning(s)? ... yes
Error: Database error
Error querying the database: Server error: `ERROR HY000 (1553): Cannot drop index 'PRIMARY': needed in a foreign key constraint'
0: sql_migration_connector::sql_database_step_applier::apply_migration
at migration-engine\connectors\sql-migration-connector\src\sql_database_step_applier.rs:11
1: migration_core::api::SchemaPush
at migration-engine\core\src\api.rs:161

unique๋กœ ์„ค์ •ํ•˜์—ฌ id ์™ธ๋ž˜ํ‚ค๊ฐ€ ์—†๋Š”๊ฒŒ ๋ฌธ์ œ์ธ๊ฑธ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ @id ๋กœ id๊ฐ’์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์ค˜์•ผ ํ•˜๊ฑฐ๋‚˜ unique์—์„œ @@id๋กœ ์ˆ˜์ •ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Archive ์กฐํšŒ API

๊ฐœ๋ฐœ์‚ฌํ•ญ

  1. ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ์ „์ฒด ์กฐํšŒ API
  2. ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ๊ฐœ๋ณ„ ์กฐํšŒ API
  3. ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋ชจ์•„๋ณด๊ธฐ API(public)
  4. ๋ชจ๋‘ get ๊ด€๋ จ์ด๋‹ˆ ๊ฐ™์ด ๋ฌถ์—ˆ์Šต๋‹ˆ๋‹ค.
  5. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ž‘์„ฑ ๋ฐ ์„œ๋น„์Šค ์ž‘์„ฑ ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ

Bug: ์งˆ๋ฌธ ๋‹ต์žฅ์Œ์ด ์—†์„๋•Œ ๋นˆ ๋ฐฐ์—ด์„ ๋ณด๋‚ด์ค˜์•ผํ•จ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
์งˆ๋ฌธ ๋‹ต์žฅ์Œ์ด ์—†์„๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
์งˆ๋ฌธ ๋‹ต์žฅ์Œ์ด ์—†์„๋•Œ๋Š” ๋นˆ ๋ฐฐ์—ด์„ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

Refactor: Channel ์ƒ์„ฑ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌํŒฉํ† ๋ง

๋ฆฌํŒฉํ† ๋ง ๋ฌธ์ œ ์‚ฌํ•ญ

  • category๊ฐ€ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๊ธฐ์— query์— ์ ํ•ฉํ•˜์ง€ ์•Š์•„ ๊ทธ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•จ.
  • category๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋กœ์ง ์ˆ˜์ •

๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์•ˆ

์นดํ…Œ๊ณ ๋ฆฌ

  • code ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์นดํ…Œ๊ณ ๋ฆฌ ์ข…๋ฅ˜๋งˆ๋‹ค ๊ณ ์œ ์˜ code๋ฅผ ํ†ตํ•ด query๋ฅผ ์ฒ˜๋ฆฌํ•จ.

channel ๊ณผ category Connect

  • ์ฑ„๋„์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘” ์นดํ…Œ๊ณ ๋ฆฌ code ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด ์ฑ„๋„๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ ์‚ฌ์ด์˜ connect๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

์ถ”๊ฐ€์‚ฌํ•ญ

migration from GCP to AWS With Docker

Why?

  • ๋ฌด๋ฃŒ ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์‹œ์ž‘์ผ 8.2, ์ข…๋ฃŒ์ผ 11.1
  • OSS ๋Œ€ํšŒ 2์ฐจ ํ‰๊ฐ€ ๊ธฐ๊ฐ„ 10.25~ 11.5, 11.9 (ํ™”) ๋ฐœํ‘œ ํ‰๊ฐ€
  • ๋ฌด๋ฃŒ ๊ธฐ๊ฐ„์— ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ๋ณ€๊ฒฝ ํ•„์š”

๊ฐœ๋ฐœ ์‚ฌํ•ญ

  • docker ๋„์ž…
  • aws ํ™˜๊ฒฝ ๊ตฌ์ถ•

Docker

  • ํ”„๋กœ์ ํŠธ์— ๋„์ปค ์…‹ํŒ… ๋ฐ ํ…Œ์ŠคํŒ…

AWS ํ™˜๊ฒฝ ๊ตฌ์ถ•

  • EC2
  • Docker๋กœ ๊ตฌ์ถ•
  • ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ -> AWS ๋กœ multer ๋ณ€๊ฒฝ
  • AWS RDBMS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์šฉ,

Archive ์†Œ์…œ ๊ธฐ๋Šฅ API

๊ฐœ๋ฐœ์‚ฌํ•ญ

  1. ํฌ์ŠคํŒ… ์•„์นด์ด๋น™ ์ข‹์•„์š”,์ทจ์†Œ API
  2. ํฌ์ŠคํŒ… ์•„์นด์ด๋น™ ๋Œ“๊ธ€ API
  3. ๊ฐ ๋ชจ๋ธ๊ณผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์—ฐ๊ฒฐ
  4. ๋Œ“๊ธ€์€ comment ๋ชจ๋ธ ๊ฐ™์ด ์“ฐ๋‚˜์š”? ๊ธฐ๋Šฅ์€ ์™„์ „ ๋™์ผํ•˜๋‹ค๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•จ.
  5. ์„œ๋น„์Šค ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ

Discussion: AWS ec2 cpu ์‚ฌ์šฉ๋ฅ  ์ฆ๊ฐ€ ๋ฐ ์“ฐ๋กœํ‹€๋ง ํ˜„์ƒ

๋ฌธ์ œ์ƒํ™ฉ.

  • ํ˜„์žฌ ์„œ๋ฒ„ ๋ฐฐํฌ ๊ตฌ์กฐ๋Š” ec2 ์ธ์Šคํ„ด์Šค์— ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์—์„œ api ์„œ๋ฒ„์™€ mysql ๋””๋น„๋ฅผ ๋‘๊ฐœ ๋Œ๋ฆฌ๊ณ , nginx๋ฅผ ์„ค์น˜ํ•ด 80, 443 ํฌํŠธ ์š”์ฒญ์„ api ์„œ๋ฒ„๋กœ ํ”„๋ก์‹œ ํŒจ์Šค์ค‘์ž…๋‹ˆ๋‹ค.
  • mysql ๋””๋น„๋Š” ๊ฐœ๋ฐœ์‹œ์— ํ•ด๋‹นํ•˜๋Š” ํฌํŠธ์— ip ์ธ๋ฐ”์šด๋“œ ๋ฃฐ์„ ๋ชจ๋“  ip์— ์—ด๊ณ , ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์„ ์‹œ์—๋Š” ip๋ฅผ ์ž๊ธฐ ์ž์‹ ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ๋ฐฐํฌ์ดํ›„ ์ธ์Šคํ„ด์Šค cpu ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰์ƒ์Šนํ•˜์—ฌ ssh ์ ‘์†์€ ๋ฌผ๋ก  api์„œ๋ฒ„๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ํ˜„์ƒ์ด ์—ฌ๋Ÿฌ์ฐจ๋ก€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์•„๋ž˜ cpu ์‚ฌ์šฉ๋Ÿ‰ ์‚ฌ์ง„์—์„œ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด ์„œ๋ฒ„ ๋‹ค์šด์ž…๋‹ˆ๋‹ค.
    ์บก์ฒ˜2
  • ์ œ์ผ ์ตœ๊ทผ ์„œ๋ฒ„ ๋‹ค์šด์—์„œ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ๋ฅผ ๋ณด๋ฉด
    ์บก์ฒ˜2
  • ๋„คํŠธ์›Œํฌ ์ž…์ถœ๋ ฅ์ด ์žˆ๊ธด ํ–ˆ์œผ๋‚˜ ๋ฏธ๋ฏธํ•œ ์ˆ˜์ค€์œผ๋กœ, ํŠธ๋ž˜ํ”ฝ ๊ณผ๋ถ€ํ•˜๋กœ ์ธํ•œ ์„œ๋ฒ„ cpu ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€๋ผ๊ณ  ์ƒ๊ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ ์ด์ „์˜ ์„œ๋ฒ„ ๋‹ค์šด ์‚ฌ๋ก€์—์„œ๋„ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ ์ค‘ ๋„คํŠธ์›Œํฌ ์ž…์ถœ๋ ฅ ์ง€ํ‘œ๋Š” ํฐ ๋ณ€ํ™”๋ฅผ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    ์บก์ฒ˜2
  • nginx access log์ธ๋ฐ, ์„œ๋ฒ„ ๋‹ค์šด์‹œ์ ์ธ utc:08:58:00 ์ด์ „์— ๊ทธ๋ฆฌ ๋งŽ์€ ์š”์ฒญ์ด ์˜ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฆ‰ ํŠธ๋ž˜ํ”ฝ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์‹œ๊ฐ„์˜ docker ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณผ๊ฑด๋ฐ, api์„œ๋ฒ„์˜ ๋กœ๊ทธ๋Š” nginx access log์™€ ๊ฑฐ์˜ ๊ฐ™์œผ๋ฏ€๋กœ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.
    ์บก์ฒ˜
  • ์œ„ ๋กœ๊ทธ๋Š” docker ์ปจํ…Œ์ด๋„ˆ ์ค‘ mysql ๋””๋น„ ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. mbind: Operation not permitted ๋ผ๋Š” ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋‹ค๊ฐ€ ๋กœ๊ทธ๊ฐ€ ๋Š๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒํƒœ๋ผ๋ฉด ํ•ด๋‹น ์—๋Ÿฌ๋ฅผ ์˜์‹ฌํ•ด๋ณผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ด€๋ จ๋œ ์—๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
  • https://stackoverflow.com/questions/55559386/how-to-fix-mbind-operation-not-permitted-in-mysql-error-log
  • https://data-engineer-tech.tistory.com/27
  • ํ˜„์žฌ๋Š” ์œ„ ๊ฒ€์ƒ‰๋“ค์—์„œ ์ œ์‹œํ•˜๋Š” ๋Œ€๋กœ mysql ์ปจํ…Œ์ด๋„ˆ๋ฅผ --cap-add=sys_nice ์˜ต์…˜์„ ์ฃผ์–ด์„œ ์‹คํ–‰์ค‘์ž…๋‹ˆ๋‹ค.

๋…ผ์˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ

  • ๊ณผ์—ฐ ์œ„์˜ mbind ๋ฌธ์ œ๊ฐ€ ์›์ธ์ธ์ง€?
  • ํ˜น์€ ๋‹ค๋ฅธ ๊ฒƒ์ด ์›์ธ์ธ์ง€?
  • ๋‹ค๋ฅธ ๊ฒƒ์ด ์›์ธ์ด๋ผ๋ฉด ์›์ธ์„ ์–ด๋–ป๊ฒŒ ์ฐพ์•„๋‚ผ ๊ฒƒ์ธ์ง€?
    • cpu ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ ํ™•์ธ
    • ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ๊ณ ๋„ํ™”
    • ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก?
  • ๋™์ผํ•˜๊ฒŒ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๋Š” ํ˜„์ƒ์ด ๋˜ ๋ฐœ์ƒํ•˜๋ฉด, mysql ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด๋ณด๊ณ , ๋ณ„ ์ด์ƒ์ด ์—†๋‹ค๋ฉด(ํ˜„์žฌ๋Š” ์˜ต์…˜์„ ์ฃผ์–ด์„œ ์‹คํ–‰ํ•˜์—ฌ mbind ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ) ๋‹ค๋ฅธ ์›์ธ์„ ์ฐพ์•„๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@InHyeok-J @iqeq1945
์˜๊ฒฌ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ฑ„๋„ ํ”„๋กœํ•„ image๊ด€๋ จ DB ์ˆ˜์ •

๊ฐœ๋ฐœ์‚ฌํ•ญ

  • Channel, Profile Image DB ๊ตฌ์กฐ ๋ณ€๊ฒฝ
  • 1:1 ๊ด€๊ณ„์ธ ์ด๋ฏธ์ง€๋Š” ๊ด€๊ณ„๋ฅผ ๋Š๊ณ  ChannelImage ๋“ฑ์˜ ๋„ค์ด๋ฐ์œผ๋กœ string ์ปฌ๋Ÿผ ์ถ”๊ฐ€

Refactor: ๊ฒ€์ƒ‰ api ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐ ๊ธฐ๋Šฅ์ถ”๊ฐ€(์•„์นด์ด๋ธŒ ๊ฒ€์ƒ‰)

๋ฆฌํŒฉํ† ๋ง ๋ฌธ์ œ ์‚ฌํ•ญ

  • query๊ฐ€ category, keyword, skipUser, skipChannel๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋„ค์ด์…˜ api์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ต์ผํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
  • category์— archive๋ฅผ ์ถ”๊ฐ€

๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์•ˆ

query ์ธํ„ฐํŽ˜์ด์Šค ํ†ต์ผ ๋ฐ ์ •๋ฆฌ

  • category๋Š” type์œผ๋กœ, keyword๋Š” ๊ทธ๋Œ€๋กœ, skipUser์™€ skipChannel์€ ํ†ต์ผํ•˜์—ฌ from(ํ˜น์€ skip), ๊ทธ๋ฆฌ๊ณ  size(ํ˜น์€ take, limit๋„ ๊ดœ์ฐฎ์Œ)๋ผ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • size(|| take || limit) ๋Š” ํ˜„์žฌ ๋ณด๋‚ด๋Š” ์š”์ฒญ์—์„œ ์ตœ๋Œ€ ๋ช‡๊ฐœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ธ์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. prisma ์ฟผ๋ฆฌ๋ฌธ์— skip: from, take: size์ด๋ ‡๊ฒŒ ๋ฐ”๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

category์— archive๋ฅผ ์ถ”๊ฐ€

  • ์•„์นด์ด๋ธŒ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฏ€๋กœ ์•„์นด์ด๋ธŒ๋ฅผ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋™์ž‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„์นด์ด๋ธŒ์˜ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ๋Œ€์ƒ์€ ์ œ๋ชฉ, ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์•„์นด์ด๋ธŒ ์Šคํ‚ค๋งˆ์—๋Š” ํƒœ๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น๋ถ€๋ถ„ #88 ์—์„œ ํ•ด๊ฒฐํ•˜์—ฌ ๋จธ์ง€ํ•˜๋ฉด dev๋ธŒ๋žœ์น˜ pull ํ•ด์„œ ์ž‘์—…ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถ”๊ฐ€์‚ฌํ•ญ

  • #95 ์„ ํ•ด๊ฒฐํ•œ ํ›„, ์ง„ํ–‰

Bug: ์•„์นด์ด๋ธŒ ์ข‹์•„์š” api ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํ•จ์ˆ˜ ๋ถ€์žฌ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
POST /api/Archive/like ์—”๋“œํฌ์ธํŠธ ํ˜ธ์ถœ ์‹œ ์—๋Ÿฌ

{
    "name": "TypeError",
    "message": "UserRepository.LikeOnArchive is not a function"
}

๋งž๋Š” ๋™์ž‘
๋™์ž‘ ํ˜ธ์ถœ ์‹œ ์ •์ƒ์ ์œผ๋กœ like๊ฐ€ ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
UserRepository.LikeOnArchive ํ•จ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปค๋ฐ‹๋‚ด์—ญ์— ๋‹ฌ์€ ์ฝ”๋ฉ˜ํŠธ ๋งํฌ์ž…๋‹ˆ๋‹ค.
https://github.com/Jandy-SeoulTech/Jandy_Web_Back/pull/82/files#r725908318

Bug: ์žฌ๋Šฅ๊ณต์œ ์š”์ฒญ์— ์—ฐ๊ฒฐ๋œ ๋ชจ์•„๋ณด๊ธฐ ๊ธ€์ด ์žˆ์„๋•Œ ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ์ง€์•Š์Œ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Post/:postId ์—์„œ ์•„์นด์ด๋ธŒ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์•„์นด์ด๋ธŒ ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
์•„์นด์ด๋ธŒ ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

Bug: ํŽ˜์ด์ง€๋„ค์ด์…˜ api ์ „์ฒด ํŽ˜์ด์ง€ ๊ฐฏ์ˆ˜ ๋ฒ„๊ทธ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
ํŽ˜์ด์ง€๋„ค์ด์…˜ api ์ „๋ฐ˜์—์„œ ์˜ฌ๋ฆผ ๊ตฌํ˜„์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์•„ ํŽ˜์ด์ง€ ๊ฐฏ์ˆ˜๊ฐ€ ๋”ฑ ๋งž์•„๋–จ์–ด์งˆ ๋•Œ ์ „์ฒด ํŽ˜์ด์ง€ ๊ฐฏ์ˆ˜๊ฐ€ +1๋˜์–ด ์‘๋‹ต๋˜๋Š” ๋ฒ„๊ทธ

๋งž๋Š” ๋™์ž‘
Math.ceil() ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฆผ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

Prettier,Eslint ์ถ”๊ฐ€

์ œ์•ˆ์‚ฌํ•ญ

eslint ํ˜„์žฌ import, export๋กœ ์ฝ”๋”ฉ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จํ•œ ์„ค์ •์œผ๋กœ ์ถ”๊ฐ€ ํ•ด์•ผ ํ• ๋“ฏ.

ํ•„์š”์„ฑ

์„œ๋กœ ํ”„๋ฆฌํ‹ฐ์–ด์™€ eslint๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•„์„œ ์ฝ”๋“œ ์ €์žฅ ํ˜น์€ ์ˆ˜์ • ์‹œ ํ•„์š”์—†๋Š” ์ฝ”๋“œ๊นŒ์ง€ ์ €์žฅ๋˜์–ด git commit ๊ธฐ๋ก์ด ๋ง์ณ์ง.-> ๋ฆฌ๋ทฐ ํ•˜๊ธฐ ํž˜๋“ค์–ด์ง

Bug: Search api ์ฑ„๋„ ๊ฒ€์ƒ‰ ์‹œ ์‘๋‹ต๋ฐ”๋””์— participants ๋ถ€์žฌ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Search/?code=PROGRAMMING!COOK&keyword=&skip=3&take=6&type=channel
ํ•ด๋‹น ์˜ˆ์‹œ์—์„œ channel์˜ participants ์ •๋ณด๊ฐ€ ์‘๋‹ต๋ฐ”๋””์— ์—†์Œ.

๋งž๋Š” ๋™์ž‘
participants ์ •๋ณด๊ฐ€ ์‘๋‹ต ๋ฐ”๋””์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ๊ธฐ๋Šฅ ๊ตฌํ˜„

ํฌ์ŠคํŠธ ์•„ํ‚ค์ด๋น™ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (Feature1)

  • 9.29 ํšŒ์˜์—์„œ ์ •ํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • ํฌ์ŠคํŠธ๋ž‘ ์•„์นด์ด๋น™์ด ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฐœ๋…์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ํฌ์ŠคํŠธ ์•„์นด์ด๋น™์—๋Š” ๊ณต๊ฐœ ๋ฒ”์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • public -> ์ „์ฒด ๊ณต๊ฐœ, ์œ ์ €์˜ ํ”„๋กœํ•„์˜ ๋ชจ์•„๋ณด๊ธฐ์— ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Œ.
    • private -> ์ฑ„๋„ ์œ ์ €๋งŒ ๊ณต๊ฐœ, ์œ ์ € ํ”„๋กœํ•„์—๋Š” ๋ณด์ด์ง€ ์•Š๊ณ , ์ฑ„๋„ ๋ชจ์•„๋ณด๊ธฐ์—๋งŒ ๋ณด์ž„
  • ํฌ์ŠคํŠธ ์•„์นด์ด๋น™์—๋„ ์ข‹์•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€๋„ ์žˆ์Œ

1. ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ์ƒ์„ฑ

  • ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ๊ธ€์„ ์ž‘์„ฑํ•  ๋•Œ, ๋กœ๊ทธ์ธํ•œ ์œ ์ €์˜ ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด ์žˆ์œผ๋ฉด(๋กœ๊ทธ์ธํ•œ ์œ ์ €๊ฐ€ ๋ฐฉ์žฅ์ธ ๊ฒฝ์šฐ) ์š”์ฒญ ์œ ์ €์˜ ์ฑ„ํŒ…๋ฐฉ ๋ชฉ๋ก ๋ฐ ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด๋ฅผ ์คŒ
  • ๋กœ๊ทธ์ธํ•œ ์œ ์ €์˜ ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฒดํฌ๋Š” ํ”„๋ก ํŠธ๊ฐ€ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค @sjsjsj1246
  • entry point๋Š” ํ•˜๋‚˜์ด๋ฉฐ ์œ ์ €์˜ ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด ์žˆ๋Š”๊ฒฝ์šฐ๋งŒ ํ”„๋ก ํŠธ๊ฐ€ ์ฒดํฌํ•ด์คŒ.

1.1 ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (์•„์นด์ด๋น™)

  • ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ธ€ ์ž‘์„ฑ์ž๊ฐ€ ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์˜ค๊ฒ ๋‹ค๊ณ  ํ•˜๋ฉด ๋กœ๊ทธ์ธ ํ•œ ์œ ์ €์˜ ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” API ๋ฅผ ํ†ตํ•ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ค๋‹ˆ๋‹ค. ์ดํ›„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ํƒ ํ•˜๋ฉด ๊ทธ ๋ฐฉ์˜ ๋‹ต์žฅ ์Œ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ API ๋ฅผ ํ†ตํ•ด ๋‹ต์žฅ์„ ํ”„๋ก ํŠธ๊ฐ€ ๋ Œ๋”๋ง ํ•ด์ค๋‹ˆ๋‹ค.
  • ์ดํ›„ ๊ฒŒ์‹œํŒ ์žฌ๋Šฅ ๊ณต์œ ์™€ ๊ฐ™์€ ๋กœ์ง์œผ๋กœ ๊ธ€ ์ž‘์„ฑ.
  • ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ ์ •๋ณด์—๋Š” ์ฑ„ํŒ…๋ฐฉ์ด ์ƒ์„ฑํ•œ ๊ธ€ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ๊ฐ€ ๋‚˜์ค‘์— ๋ Œ๋”๋ง์„ ํ•ด์ค๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ ์Šคํฌ๋žฉ ์ฒ˜๋Ÿผ

1.2 ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด ์—†๋Š” ๊ฒฝ์šฐ (ํฌ์ŠคํŠธ)

  • ๊ฒŒ์‹œํŒ ์žฌ๋Šฅ ๊ณต์œ ์™€ ๊ฐ™์€ ๋กœ์ง์œผ๋กœ ๊ธ€ ์ž‘์„ฑ.

์ถ”๊ฐ€

  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” html ๋ฐ์ดํ„ฐ๋กœ ๋‹ด๊ฒจ์„œ ์„œ๋ฒ„๋กœ ์ „์†ก๋ ๋“ฏํ•ฉ๋‹ˆ๋‹ค

ํฌ์ŠคํŠธ ์•„์นด์ด๋น™์œผ๋กœ ์ธํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ (Feature2)

1. ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋ชจ์•„๋ณด๊ธฐ

  • ํ”„๋กœํ•„ํŽ˜์ด์ง€์—๋Š” ๊ทธ ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ์•„์นด์ด๋น™์˜ public๋งŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ์ด๋ฒˆ ์ด์Šˆ์—์„œ ์—ฌ๊ธฐ๊นŒ์ง€ ์ˆ˜์ • ๋ฐ”๋ž๋‹ˆ๋‹ค

2. ์žฌ๋Šฅ ๊ณต์œ  ๊ฒŒ์‹œํŒ์˜ ์ƒํƒœ ์ถ”๊ฐ€

  • ์žฌ๋Šฅ ๊ณต์œ  ๊ฒŒ์‹œํŒ์— ๊ธฐ์กด์—๋Š” ๊ณต์ง€. ์ฑ„ํŒ…๋ฐฉ ์˜ˆ์•ฝ, ์ฑ„ํŒ…๋ฐฉ ์—ด๋ฆผ, ์•ˆ์—ด๋ฆผ ์ด๋ ‡๊ฒŒ 4๊ฐœ์˜ ์ƒํƒœ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ
  • ๊ณต์ง€, ์ฑ„ํŒ…๋ฐฉ ์˜ˆ์•ฝ,์˜คํ”ˆ, ์ฑ„ํŒ… ๋Œ€๊ธฐ(์•ˆ์—ด๋ฆผ), ํ•ด๊ฒฐ์™„๋ฃŒ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋˜๋ฉฐ ์ด๊ฑฐ๋Š” ๋‹ค๋ฅธ ์ด์Šˆ์— ์ถ”๊ฐ€์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

์š”์•ฝ

  • ํฌ์ŠคํŠธ์•„์นด์ด๋น™ ์ƒ์„ฑ API
  • ๋กœ๊ทธ์ธํ•œ ์œ ์ €๊ฐ€ ์ฑ„ํŒ…๋ฐฉ ์ฃผ์ธ์ธ ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ API
  • ์ฑ„ํŒ…๋ฐฉ์˜ ์งˆ๋ฌธ๋‹ต์žฅ์Œ API
  • ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ์ „์ฒด ์กฐํšŒ API
  • ํฌ์ŠคํŠธ ์•„์นด์ด๋น™ ๊ฐœ๋ณ„ ์กฐํšŒ API
  • ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋ชจ์•„๋ณด๊ธฐ API(public)
  • ํฌ์ŠคํŒ… ์•„์นด์ด๋น™ ์ข‹์•„์š”,์ทจ์†Œ API
  • ํฌ์ŠคํŒ… ์•„์นด์ด๋น™ ๋Œ“๊ธ€ API

Bug: db ์Šคํ‚ค๋งˆ์—์„œ String ๊ธธ์ด ์ œํ•œ ์„ค์ • ๋ณ€๊ฒฝ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
์Šคํ‚ค๋งˆ์— String์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด์ œํ•œ์ด ์‹ค์ œ ๊ธฐํš์ƒ์˜ ์˜๋„์™€ ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด ์Šคํ‚ค๋งˆ๋ฅผ ์ „๋ถ€ ์ ๊ฒ€ํ•˜๊ณ  ๊ธธ์ด์ œํ•œ์„ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
Post์™€ Archive์˜ content ๋“ฑ์€ ๊ธธ์ด ์ œํ•œ์ด ๋†’์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Babel Error

What

Babel ๊ด€๋ จ ์˜ค๋ฅ˜ ๋ฐœ์ƒ, ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ

'babel-node'์€(๋Š”) ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€ ๋ช…๋ น, ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ, ๋˜๋Š”๋ฐฐ์น˜ ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค

ํ”„๋กœํ•„ ์กฐํšŒ API ํ•„๋“œ ๊ฐ’ ์ด์Šˆ

ํ”„๋กœํ•„ ์กฐํšŒ API์— ์ถ”๊ฐ€ํ•ด์ฃผ์‹  admin, participants ํ•„๋“œ๋ฅผ ํ™•์ธํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

API ๋ช…์„ธ์„œ์— ์˜ˆ์‹œ๋กœ ์ ์–ด์ฃผ์‹  ์‘๋‹ต์€

"admin": [],
"participants": [
  {
    "channel": {
      "id": 1,
      "name": "์ถ•.์ž˜.๋ชจ",
      "introduce": "์ถ•๊ตฌ๋ฅผ ์ž˜ํ•˜๋“  ์ž˜๋ชปํ•˜๋“  ์‚ฌ๋žŒ๋“ค์˜ ๋ชจ์ž„์ž…๋‹ˆ๋‹ค.",
      "adminId": 3,
      "createdAt": "2021-09-08T14:51:13.044Z",
      "updatedAt": null,
      "channelImage": {
        "id": 4,
        "src": "...",
        "createdAt": "2021-09-08T14:51:13.044Z",
        "updatedAt": null,
        "profileId": null,
        "channelId": 1,
        "postId": null
      }
    }
  }
]

์ด๋ ‡๊ฒŒ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์œ„์ฒ˜๋Ÿผ ๋‚˜์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ admin ํ•„๋“œ ๊ฐ’์„ ๋ฐ›์•„๋ณด๋ฉด

"admin": [
  {
    "id": 1,
    "name": "์ถ•.์ž˜.๋ชจ",
    "introduce": "์ถ•๊ตฌ๋ฅผ ์ž˜ํ•˜๋“  ์ž˜๋ชปํ•˜๋“  ์‚ฌ๋žŒ๋“ค์˜ ๋ชจ์ž„์ž…๋‹ˆ๋‹ค.",
    "adminId": 3,
    "createdAt": "2021-09-08T14:51:13.044Z",
    "updatedAt": null,
    "channelImage": {
      "id": 4,
      "src": "...",
      "createdAt": "2021-09-08T14:51:13.044Z",
      "updatedAt": null,
      "profileId": null,
      "channelId": 1,
      "postId": null
    }
  }
]

์ด๋ ‡๊ฒŒ channel ์•ˆ์— ์žˆ์ง€ ์•Š์€ ํ˜•ํƒœ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
์ €๋Š” admin ํ•„๋“œ ๊ฐ’์ฒ˜๋Ÿผ ๊ตณ์ด channel ํ”„๋กœํผํ‹ฐ ์•ˆ์— ๋„ฃ์ง€ ์•Š๊ณ  admin, participants ํ•„๋“œ์˜ ํ˜•ํƒœ๋ฅผ ๋˜‘๊ฐ™๊ฒŒ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

AWS migration์—์„œ Dockerfile ํ”ฝ์Šค ํ•„์š”

Dockerfile

ํ˜„์žฌ ํ”„๋ก ํŠธ ์ฝ”๋“œ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด build ๋œ ํŒŒ์ผ์„ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ•ด๋‹น ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ๋„์ปคํŒŒ์ผ์€ ํ•ด๋‹น ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์†Œ์Šค์ฝ”๋“œ๋งŒ ๋ณต์‚ฌํ•˜์—ฌ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, index.js์—์„œ ../../ ๋ฅผ ํ•˜๋”๋ผ๋„ ํ”„๋ก ํŠธ ์ฝ”๋“œ(๋นŒ๋“œํŒŒ์ผ)๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์— ์—†์Šต๋‹ˆ๋‹ค. ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ๋ณต์‚ฌ๋œ ์†Œ์Šค์ฝ”๋“œ๋Š” ์„œ๋ฒ„ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฟ์ž…๋‹ˆ๋‹ค.

WORKDIR /src/index
COPY package*.json ./
RUN npm install -g pm2
RUN npm install
COPY . .

docker build -t upgle . ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ(Jandy_Web_Back)์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ ˆํฌ๋งŒ ๋ณต์‚ฌํ•˜๊ฒŒ ๋จ.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  1. ์ฐจ๋ผ๋ฆฌ ํ”„๋ก ํŠธ ๋นŒ๋“œ ํŒŒ์ผ์„ ์„œ๋ฒ„์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— sftp๋“ฑ์œผ๋กœ ์ด์ „ํ•˜๊ณ , ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์— ๊ตณ์ด ํ”„๋ก ํŠธ ๋ ˆํฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋ฐฉ๋ฒ•.

    • sh ์Šคํฌ๋ฆฝํŠธ๋กœ git reset์„ ํ•ด์ฃผ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์„ ๋นผ์•ผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ์—์„œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋นŒ๋“œํŒŒ์ผ์„ ๋งค๋ฒˆ ๋„ฃ์–ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์กฐ๊ธˆ ์žˆ์Œ
  2. ๋„์ปคํŒŒ์ผ์„ ์ธ์Šคํ„ด์Šค ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‘๊ณ (ํ˜น์€ docker build -t upgle ../.), ๋„์ปคํŒŒ์ผ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•œ๋‹ค.

    • ๋„์ปคํŒŒ์ผ์„ ํ™ˆ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ , ๋„์ปคํŒŒ์ผ ๋‚ด์—์„œ๋Š” ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜ฎ๊ฒจ๊ฐ€๋ฉฐ ์†Œ์ŠคํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  npm run build๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ ๋นŒ๋“œ ๊ฐ™์€๊ฑด sh ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋นผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ๋„์ปคํŒŒ์ผ์ด ๋ฐฑ๊ณผ ํ”„๋ก ํŠธ์˜ ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ๋ณต์‚ฌํ•˜๊ฒŒ๋” ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ํ•ต์‹ฌ.
  3. ์–ด์‚ฌ์ธ์€ ์ œ๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๊ฑธ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๊ณ , @InHyeok-J ์—๊ฒŒ ์ž‘์—… ๋‚ด์—ญ์„ ์ „๋‹ฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ง„ํ–‰์ƒํ™ฉ ๊ณต์œ ํ•˜๊ฒ ์Œ~!

Bug: ๊ฒ€์ƒ‰ ๋ผ์šฐํŠธ ์‘๋‹ต ๊ฐ์ฒด์— ์ „์ฒด ๊ฐฏ์ˆ˜ ๋ถ€์žฌ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Search ์‘๋‹ต ๊ฐ์ฒด์— ์ „์ฒด ๊ฒ€์ƒ‰๋œ ๊ฐฏ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
์‘๋‹ต๊ฐ์ฒด๋Š” ์ „์ฒด ๊ฒ€์ƒ‰๋œ ๊ฐฏ์ˆ˜๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์‘๋‹ต ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

{
    "total" : 32,
    "data" : [
        {},
        {},
    ]
}

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

AWS ๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ prisma db push ๋ฐฉ์‹ ๋ณ€๊ฒฝ

AWS ์„œ๋ฒ„ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

  • ํ˜„์žฌ ๋ฐฉ์‹์€ ์ด๋ฏธ์ง€๋ฅผ ๋งค๋ฒˆ ์—…๋ฐ์ดํŠธ๋งˆ๋‹ค ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— npm dependency๋ฅผ ๋ชจ๋‘ ์ƒˆ๋กœ ์„ค์น˜์ค‘.
  • ๋„์ปค ์ด๋ฏธ์ง€๋Š” ๋‹ค์‹œ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ• ๋•Œ ๋ณ€ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„๊นŒ์ง€ ์บ์‹ฑํ•˜๊ณ  ๋ณ€ํ•œ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋นŒ๋“œํ•˜๊ธฐ๋•Œ๋ฌธ์— ๊ทธ ์ด์ ์„ ์‚ด๋ ค์„œ ๋งค๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜์ง€๋ง๊ณ , ์ด๋ฏธ์ง€๋ฅผ ๋‚จ๊ธฐ๋ฉด dependency๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ npm install์„ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ package*.json์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋งŒ npm install์„ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์‹œ๊ฐ„/๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์Œ
  • ๋˜, prisma db push๋ฅผ ๋ฏธ๋ฆฌ ํ•จ์œผ๋กœ์จ ๋„์ปค ๋นŒ๋“œ ์‹œ์— ๋ถ€ํ•˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ฒ ์Šต๋‹ˆ๋‹ค.

Feat: git hook ์ž‘์„ฑ

๊ฐœ๋ฐœ์‚ฌํ•ญ

  • git hook ์ž‘์„ฑ
  • pre-commit : lint ๊ฒ€์‚ฌ
  • prepare-commit-msg : ์ปค๋ฐ‹๋ฉ”์‹œ์ง€ convention์— ๋”ฐ๋ฅธ ์ปค๋ฐ‹๋ฉ”์‹œ์ง€ ์ž๋™ ์ƒ์„ฑ
  • commit-msg : ์ปค๋ฐ‹๋ฉ”์‹œ์ง€ convention ๊ฒ€์‚ฌ

์ถ”๊ฐ€์‚ฌํ•ญ

Comment ์กฐํšŒ API ์ž‘์„ฑ

  1. GET api/Comment/:commentId => ์ฝ”๋ฉ˜ํŠธ id๋กœ ์ฝ”๋ฉ˜ํŠธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
  2. GET api/Comment/list?type=post&id=postId => ํฌ์ŠคํŠธid๋กœ ํ•ด๋‹น ํฌ์ŠคํŠธ์˜ ์ฝ”๋ฉ˜ํŠธ ๋ฐฐ์—ด ๊ฐ€์ ธ์˜ค๊ธฐ
  3. GET api/Comment/list?type=archive&id=archiveId => ์•„์นด์ด๋ธŒid๋กœ ํ•ด๋‹น ์•„์นด์ด๋ธŒ์˜ ์ฝ”๋ฉ˜ํŠธ ๋ฐฐ์—ด ๊ฐ€์ ธ์˜ค๊ธฐ

Archive table ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋…ผ์˜

์•„์นด์ด๋น™ table ๊ตฌ์กฐ ๋…ผ์˜

์ถ”ํ›„ Table์˜ ๋ณ€๊ฒฝ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด issue์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์ œ์ž‘ํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ
model Archive {
  id                  Int @id @default(autoincrement())
  status              ArchiveStatus // Private, Public ๊ณต๊ฐœ๋ฒ”์œ„
  content             String // ์•„์นด์ด๋น™์— ๋“ค์–ด๊ฐˆ (๊ฒŒ์‹œ๊ธ€, ์งˆ๋ฌธ๋‹ต์Œ)์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋‚ด์šฉ ํ˜น์€ ํฌ์ŠคํŒ…
  archiveComment      Comment[] // ์•„์นด์ด๋น™์— ์†ํ•˜๋Š” ๋Œ“๊ธ€ ๋ชฉ๋ก
  owner               User @relation("archive", fields: [ownerId], references: [id]) 
  ownerId             Int // ์•„์นด์ด๋น™์˜ ์†Œ์œ ์ฃผ 
  channel             Channel @relation(fields: [channelId], references: [id])
  channelId           Int // ๊ณต๊ฐœ๋ฒ”์œ„๊ฐ€ Private์‹œ ์†ํ•œ ์ฑ„๋„์˜ ์œ ์ €๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ์œ„ํ•œ ๊ฐ’
  post                Post? @relation(fields: [postId], references: [id])
  postId              Int // ์ฃผ์ œ๊ฐ€ ๋˜๋Š” POST ์ •๋ณด
  chatMessage         ChatMessage[] // ์งˆ๋ฌธ๋‹ต์Œ์˜ ์ •๋ณด
  createdAt           DateTime
  updatedAt           DateTime?
  @@map("archives")
}

enum ArchiveStatus {
  Private
  Public
}

channel

  • one to many ๊ด€๊ณ„
  • channel ์ •๋ณด์˜ ๊ฒฝ์šฐ, ์•„์นด์ด๋น™์€ ์ฑ„๋„์—์„œ ์ž‘์„ฑ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜. (๊ณต์œ ์š”์ฒญ ์ƒ๊ด€x), ๊ณต๊ฐœ ๋ฒ”์œ„๊ฐ€ private์ธ ๊ฒฝ์šฐ, ํŒ๋ณ„์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•จ.
model Channel {
...
  archive      Archive[]
...
}

chatMessage

  • archive : one to many ๊ด€๊ณ„
  • ์žฌ๋Šฅ ๊ณต์œ  ์š”์ฒญ์— ๋Œ€ํ•ด ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒฝ์šฐ, ์ฑ„ํŒ…๋ฐฉ์˜ ๋Œ€ํ™” ๋‚ด์—ญ(chatMessage ์ค‘ ๋‹ต์žฅ๊ธ€๊ณผ ๋‹ต์žฅ์„ ๋‹จ ์งˆ๋ฌธ๊ธ€์˜ ์ •๋ณด๋งŒ๊ฐ€์ ธ์˜ด)์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
model ChatMessage {
...
  archive         Archive?  @relation(fields: [archiveId], references: [id])
  archiveId       Int? // ์งˆ๋ฌธ ๋‹ต์Œ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์•„์นด์ด๋ธŒ
...
}

post

  • archive : one to one ๊ด€๊ณ„
  • ์–ด๋–ค post์—์„œ ์‹œ์ž‘ํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ์œ„ํ•ด ์ฑ„ํŒ…๋ฐฉ์—์„œ post์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
model Post {
...
  archive         Archive?
...
}

content

  • ๊ณต์œ  ์š”์ฒญ์— ๋Œ€ํ•œ ๊ธ€์ธ ๊ฒฝ์šฐ, post์™€ chatMessage ๋‚ด์šฉ์˜ ๋ณด์ถฉ ์„ค๋ช… ์ž‘์„ฑ
  • ๊ณต์œ  ์š”์ฒญ์— ๋Œ€ํ•œ ๊ธ€์ด ์•„๋‹Œ ๊ฒฝ์šฐ, post์™€ ๋น„์Šทํ•œ ํ˜•์‹

comment

  • Archive๋‚˜ Post์˜ ๋Œ“๊ธ€์€ ๋™์ผํ•˜์—ฌ ๊ฐ™์€ table์„ ์‚ฌ์šฉ
model Comment {
....
  post      Post?      @relation(fields: [postId], references: [id])
  postId    Int
  archive   Archive? @relation(fields: [archiveId], references: [id])
  archiveId Int
...
}

prisma Timezone ๋ฌธ์ œ

Prisma Timezone ์ด์Šˆ

WHAT

ํ”„๋ฆฌ์ฆˆ๋งˆ์—์„œ ์‹œ๊ฐ„ ๊ฐ’์„ ์ €์žฅํ• ๋•Œ, KST ์‹œ๊ฐ„์ด ์•„๋‹Œ UTC ์‹œ๊ฐ„์ด ์ €์žฅ๋จ.
ex)(ํ˜„์žฌ ์‹œ๊ฐ„) : 21.5.13์‹œ -> (ํ”„๋ฆฌ์ฆˆ๋งˆ๋ฅผ ํ†ตํ•ด DB์— ์ €์žฅ๋˜๋Š” ์‹œ๊ฐ„ ) 21.5.04์‹œ (UTC : KTC-9hour)

WHY

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์›์ธ์€ ์ •ํ™•ํ•œ ์ด์Šˆ๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ํ”„๋ฆฌ์ฆˆ๋งˆ ์ž์ฒด์—์„œ local timezone์— ๋Œ€ํ•œ ์ง€์›์„ ์•ˆํ•˜๋Š” ๋“ฏ ํ•จ.
์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์‹œ๊ฐ„ ๊ด€๋ จ ์ด์Šˆ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ธก client๊ฐ€ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ , ์„œ๋ฒ„์—์„œ DB์— ์ €์žฅ๋œ ์‹œ๊ฐ„์„
๋‹ค์‹œ ๊ฐ€๊ณตํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์ €์žฅํ•˜๋Š” ์‹œ๊ฐ„์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ.
prisma/prisma#5051 <- ์—ฌ๊ธฐ์—์„œ jhaemin์ด๋ž€ ๋ถ„์ด prisma์— issue๋ฅผ ๋‚จ๊ฒผ๋Š”๋ฐ ์•„์ง๊นŒ์ง€ ์ง€์›์„ ์•ˆํ•˜๊ณ  ์žˆ์Œ.

SOLUTION

์•„๋ž˜ ์†”๋ฃจ์…˜์€ ์ด์Šˆ ์ž‘์„ฑ์ž jhaemin ์ด๋ž€ ๋ถ„์ด ์ œ์‹œํ•œ ๋ฐฉ๋ฒ•.

Create or update with custom now() method

// UTC-9 using dayjs
export const dbNow = (): Date => dayjs().add(9, 'hour').toDate()

const now = dbNow()

await prisma.user.create({
  data: {
    createdAt: now,
    updatedAt: now,
  },
})

Use a middleware that modifies all the times from Prisma's result object

// Subtract 9 hours from all the Date objects recursively
function subtract9Hours(obj: Record<string, unknown>) {
  if (!obj) return

  for (const key of Object.keys(obj)) {
    const val = obj[key]

    if (val instanceof Date) {
      obj[key] = dayjs(val).subtract(9, 'hour').toDate()
    } else if (!isPrimitive(val)) {
      subtract9Hours(val as any)
    }
  }
}

function prismaTimeMod<T>(value: T): T {
  if (value instanceof Date) {
    return dayjs(value).subtract(9, 'hour').toDate() as any
  }

  if (isPrimitive(value)) {
    return value
  }

  subtract9Hours(value as any)

  return value
}

// Create a prisma client instance with timemod
const prisma = new PrismaClient()

prisma.$use(async (params, next) => {
    const result = await next(params)

    return prismaTimeMod(result)
  })

์•„์ง DB์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ๋‹ด๊ฒจ์ ธ ์žˆ์ง€ ์•Š๊ณ  ๋ฐฐํฌํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ๊น, create, update ๋กœ์ง ์‹œ ์œ„์— ์†Œ๊ฐœํ•œ now ์ ์šฉ์‹œ์ผœ์„œ ๊ตฌํ˜„ํ•˜๊ณ ,
์Šคํ‚ค๋งˆ ์ˆ˜์ •์ด ํ•„์š”ํ•ด ๋ณด์ž„

Feat: GET /api/Chat/room/:roomId/answer ๋กœ์ง ๋ณ€๊ฒฝ

๊ฐœ๋ฐœ์‚ฌํ•ญ

  • ์•„์นด์ด๋น™ ์ž‘์„ฑ ์‹œ ์ฑ„ํŒ…๋ฐฉ ๋ฐฉ์žฅ์€ ์ž์‹ ์˜ ์งˆ๋ฌธ-๋‹ต์žฅ์Œ๋งŒ ์•„์นด์ด๋น™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ์„ ๋ณด๋‚ธ ์œ ์ €์˜ id๊ฐ’์„ repository ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น ์œ ์ €์˜ ์งˆ๋ฌธ-๋‹ต์žฅ์Œ๋งŒ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ธ๋ถ€์‚ฌํ•ญ

๋ ˆํฌ์ง€ํ† ๋ฆฌ ํ•จ์ˆ˜ ๋ณ€๊ฒฝ

  • export const findRoomAnswerChat = async (channelRoomId) => {
    try {
    let data = await prisma.chatMessage.findMany({
    where: {
    AND: [
    {
    channelRoomId,
    },
    {
    answeredId: {
    not: null,
    },
    },
    ],
    },
    include: {
    answeredMessage: {
    include: {
    sendUser: true,
    },
    },
    sendUser: true,
    },
    });
    return data.map((v) => {
    delete v.sendUser["password"];
    delete v.answeredMessage.sendUser["password"];
    return v;
    });
    } catch (err) {
    console.error(err);
    }
    };
  • where ์ฟผ๋ฆฌ์—์„œ sendUserId๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ธ ์œ ์ € id์™€ ์ผ์น˜ํ•˜๋Š” ๊ฑธ๋กœ ํ•„ํ„ฐ๋ง ํ•„์š”

์ถ”๊ฐ€์‚ฌํ•ญ

Bug: ์ฑ„๋„ ๊ฒ€์ƒ‰ ์‹œ code๊ฐ€ null ์ด๋ฉด validation ์—๋Ÿฌ ๋ฐœ์ƒ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Search?code=&skip=0&take=10&type=channel ์ผ ์‹œ code๊ฐ€ null์ด์–ด์„œ validation์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
code๊ฐ€ null ์ด๋ฉด ์ „์ฒด ์ฑ„๋„์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

์•„์นด์ด๋ธŒ ์Šคํ‚ค๋งˆ ํƒœ๊ทธ ์ถ”๊ฐ€ ๋ฐ ์•„์นด์ด๋ธŒ ์ƒ์„ฑ ์‹œ ํƒœ๊ทธ ์ถ”๊ฐ€

๊ฐœ๋ฐœ์‚ฌํ•ญ

  • ์•„์นด์ด๋ธŒ์— ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์Šคํ‚ค๋งˆ์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•จ.
  • ์ƒ์„ฑ ์‹œ์—๋„ ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์•ผํ•จ.

Feat : ์นดํ…Œ๊ณ ๋ฆฌ ๋”•์…”๋„ˆ๋ฆฌ

๊ฐœ๋ฐœ์‚ฌํ•ญ

  • ์นดํ…Œ๊ณ ๋ฆฌ ๋”•์…”๋„ˆ๋ฆฌ
  • ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ๋Œ€๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•จ.

์„ธ๋ถ€์‚ฌํ•ญ

๋”•์…”๋„ˆ๋ฆฌ

name code
๋ฏธ์ˆ  / ๊ณต์˜ˆ ART
์š”๋ฆฌ / ์กฐ๋ฆฌ COOK
ํˆฌ์ž / ๋ถ€์—… INVEST
์™ธ๊ตญ์–ด LANGUAGE
๋””์ž์ธ DESIGN
ํŒจ์…˜ / ๋ทฐํ‹ฐ BEAUTY
ํ”„๋กœ๊ทธ๋ž˜๋ฐ PROGRAMMING
์ฐฝ์—… STARTUP
์Œ์•… MUSIC
ํ™ˆ๋ฆฌ๋น™ / ์ธํ…Œ๋ฆฌ์–ด INTERIOR
์‹œํ—˜ / ์ž๊ฒฉ์ฆ EXAM
์Šคํฌ์ธ  SPORTS
์—ฐ๊ธฐ / ๋งˆ์ˆ  ACT
ํŽซ / ๋ฐ˜๋ ค๋™๋ฌผ PET
์ปค๋ฆฌ์–ด CAREER
๊ฑด๊ฐ• HEALTH
๋Œ„์Šค DANCE
์—ฌํ–‰ TRAVEL
ํ•™๋ฌธ STUDY
์ธ๊ฐ„๊ด€๊ณ„ RELRATIONSHIP
๋ผ์ดํ”„ LIFE
์‚ฌ์ง„ / ์˜์ƒ MEDIA
์ทจ๋ฏธ ์ƒํ™œ HOBBY
๊ธฐํƒ€ ETC

์ถ”๊ฐ€์‚ฌํ•ญ

  • code์˜ ๊ธ€์ž ์ˆ˜๋ฅผ ๋งž์ถ”๊ธฐ์—๋Š” ํž˜๋“ค ๊ฒƒ ๊ฐ™์•„ ์ด๋ ‡๊ฒŒ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๊ธ€์ž์ˆ˜๋ฅผ ๋งž์ถฐ์•ผํ•œ๋‹ค๋ฉด ์ด์ง„์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/api/Profile/mychannel ์˜ ๋ฃธ ์ •๋ณด์— channelId ์š”์ฒญ

์š”๊ตฌ์‚ฌํ•ญ

๋งˆ์ด ์ฑ„๋„์—์„œ ์ข…๋ฃŒ๋œ ์ฑ„ํŒ…๋ฐฉ์ด๋‚˜, ์ฑ„ํŒ…๋ฐฉ์„ ๋‚˜๊ฐˆ ๋•Œ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ฃผ์–ด์ง€๋Š” ๋ฐ์ดํ„ฐ์— ์ฑ„๋„ID, OnwerId๊ฐ€ ์—†์–ด ๋ฆฌ๋ทฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํ˜•์‹์ด GET /api/Room/info/:roomId์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

image
image

  • myChannel์˜ ์˜คํ”ˆ๋ฃธ, ์ฐธ์—ฌ๋ฃธ์—์„œ channelId๊ณผ OnweId ์š”์ฒญ
  • ๋ฐ์ดํ„ฐ ํ˜•์‹์„ GET /api/Room/info/:roomId์—์„œ ์ฃผ์–ด์ง€๋Š” ๋ฃธ ๋ฐ์ดํ„ฐ์™€ ํ†ต์ผ

์ถ”๊ฐ€์‚ฌํ•ญ

์ฑ„๋„ ๊ณต์œ  ์š”์ฒญ ๊ฒŒ์‹œ๊ธ€๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๋ฆฌํŒฉํ† ๋ง

์ฑ„๋„ ๊ณต์œ  ๊ฒŒ์‹œํŒ ๊ธ€ ์กฐํšŒ ๊ธฐ๋Šฅ ์ˆ˜์ •

  • ๊ธฐ์กด์—๋Š” ๊ณต์ง€/ ์ฑ„ํŒ…๋ฐฉ ์—ด๋ฆผ/ ์˜ˆ์•ฝ/ ์•ˆ์—ด๋ฆผ ์ˆœ์œผ๋กœ ์คฌ์Šต
  • ๊ฒŒ์‹œ๊ธ€๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•จ
  • ๋””ํดํŠธ : (์„ ํƒx) : ๊ณต์ง€ / ๊ทธ์™ธ ์‹œ๊ฐ„ ์ˆœ์„œ
  • (์ฑ„ํŒ…๋ฐฉ์„ ํƒ??) ์ฑ„ํŒ…๋ฐฉ์˜ˆ์•ฝ,์˜คํ”ˆ๋œ ๊ณต์œ  ์š”์ฒญ ๊ฒŒ์‹œ๊ธ€
  • ์ฑ„ํŒ… ๋Œ€๊ธฐ -> ๊ธฐ์กด ์•ˆ์—ด๋ฆผ, ์ฑ„ํŒ…๋ฐฉ ์˜ˆ์•ฝ์ด๋‚˜ ๊ณต์œ  ์š”์ฒญ์ด ์•ˆ๋œ ๊ฒŒ์‹œ๊ธ€๋งŒ ์กฐํšŒ
  • ํ•ด๊ฒฐ์™„๋ฃŒ -> ์ฑ„ํŒ…๋ฐฉ์ด ์ข…๋ฃŒ๋˜๊ณ , ์•„์นด์ด๋น™์ด ์žˆ๋Š” ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ

์ฑ„ํŒ…๋ฐฉ์ด ์ข…๋ฃŒ๋œ ๊ฒŒ์‹œ๊ธ€ 1๊ฐœ ์กฐํšŒ ์ˆ˜์ •

  • ํฌ์ŠคํŠธ ์•„์นด์ด๋น™์ด ์ƒ๊ธด ๋ฐ์ดํ„ฐ๋Š” ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ• ๋•Œ ์Šคํฌ๋žฉ์ฒ˜๋Ÿผ ๋ Œ๋”๋ง์„ ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์นด์ด๋น™ ์ •๋ณด๋„ ๋ฆฌํ„ดํ•ด์ค˜์•ผํ•จ

Bug: ์•„์นด์ด๋ธŒ ์—…๋ฐ์ดํŠธ ์‹œ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ ๋ฐ˜์˜์•ˆ๋จ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
์•„์นด์ด๋ธŒ ์—…๋ฐ์ดํŠธ ์‹œ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ ๋ฐ˜์˜ ์•ˆ๋จ

๋งž๋Š” ๋™์ž‘
์•„์นด์ด๋ธŒ ์—…๋ฐ์ดํŠธ ์‹œ ํƒœ๊ทธ๋„ ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผ ํ•จ.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

Bug: GET /api/Archive/channel/:channelId ์—์„œ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ถ€์žฌ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Archive/channel/:channelId api๊ฐ€ ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งž๋Š” ๋™์ž‘
GET /api/Archive/channel/:channelId?page=&pageSize= ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ์ ์–ด์ฃผ์„ธ์š”.

Bug: GET /api/Archive/:archiveId์˜ ์‘๋‹ต๋ฐ”๋””์— archiveLike๊ฐ€ ์—†์Œ

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
GET /api/Archive/:archiveId์˜ ์‘๋‹ต๋ฐ”๋””์— archiveLike๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

{
  "status": 200,
  "success": true,
  "message": "์ •๋ณด ์–ป๊ธฐ ์„ฑ๊ณต",
  "data": {
    "id": 3,
    "title": "Prisma Timezone Error ๋ฐœ์ƒ",
    "status": "Public",
    "content": "Timezone ERROR",
    "ownerId": 10,
    "channelId": 1,
    "postId": null,
    "createdAt": "2021-10-10T19:23:24.566Z",
    "updatedAt": null,
    "owner": {
      "id": 10,
      "email": "[email protected]",
      "nickname": "์˜ค์šฐ์ด",
      "profile": {
        "id": 8,
        "department": "",
        "introduce": "",
        "createdAt": "2021-10-10T01:51:30.827Z",
        "updatedAt": null,
        "userId": 10,
        "profileImage": null
      }
    },
    "post": null,
    "tags": [
      {
        "archiveId": 3,
        "tagId": 6,
        "createdAt": "2021-10-10T19:23:24.566Z",
        "updatedAt": null,
        "tag": {
          "id": 6,
          "name": "bad",
          "createdAt": "2021-10-10T19:23:24.566Z",
          "updatedAt": null
        }
      },
      {
        "archiveId": 3,
        "tagId": 7,
        "createdAt": "2021-10-10T19:23:24.566Z",
        "updatedAt": null,
        "tag": {
          "id": 7,
          "name": "log",
          "createdAt": "2021-10-10T19:23:24.566Z",
          "updatedAt": null
        }
      },
      {
        "archiveId": 3,
        "tagId": 8,
        "createdAt": "2021-10-10T19:23:24.566Z",
        "updatedAt": null,
        "tag": {
          "id": 8,
          "name": "error",
          "createdAt": "2021-10-10T19:23:24.566Z",
          "updatedAt": null
        }
      }
    ],
    "images": [
      {
        "src": null
      }
    ]
  }
}

์žฌํ˜„๋ฐฉ๋ฒ•
ํ•ด๋‹น api ์š”์ฒญ

๋งž๋Š” ๋™์ž‘
์‘๋‹ต ๋ฐ”๋””์— archiveLike(๋ฐฐ์—ด, ํ•ด๋‹น ์•„์นด์ด๋ธŒ๋ฅผ ๊ณต๊ฐํ•œ ์‚ฌ์šฉ์žId)

Archive ์ƒ์„ฑ API

๊ฐœ๋ฐœ์‚ฌํ•ญ

  1. ์•„์นด์ด๋ธŒ ์ƒ์„ฑ API๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๋””๋น„์— ์•„์นด์ด๋ธŒ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•„์š”ํ•œ repository ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ์„œ๋น„์Šค์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

GET /api/Post/:postId ์—์„œ roomId ์š”์ฒญ

image

์ฑ„๋„ ํฌ์ŠคํŠธ์—์„œ ์ฑ„ํŒ…๋ฐฉ ๋ฐ”๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„  post ์ •๋ณด์— roomId๊ฐ€ ์ฃผ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/api/Channel/info/:channelId ๋ฒ„๊ทธ

์ฑ„๋„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” API๊ฐ€ ํ•ญ์ƒ 403 ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ์•„๋งˆ ๊ธฐ์กด์˜ ์ฑ„๋„ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์™€์˜ ๊ด€๊ณ„ ๋ฌธ์ œ ๋•Œ๋ฌธ์ด์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.
image

์ถ”๊ฐ€์ ์œผ๋กœ ์ด์Šˆ์— ๋ผ๋ฒจ์„ ๋‹ฌ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ ๊ถŒํ•œ์ข€ ์ฃผ์‹œ๊ฒ ์–ด์š”?

Bug: ๋ฃธ ์ƒ์„ฑ ์‹œ Locale์— ๋งž๋Š” ์‹œ๊ฐ„ ์„ค์ • ํ•„์š”

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
๋ฃธ ์˜ˆ์•ฝ ์ƒ์„ฑ ์‹œ ์‹œ๊ฐ„์ด AWS์˜ ์‹œ๊ฐ„๋Œ€๋กœ ์„ค์ •๋˜๋Š” ๊ฒƒ ๊ฐ™์Œ
Locale์— ๋งž๋Š” ์‹œ๊ฐ„ ์„ค์ • ํ•„์š”

์ƒํ™ฉ
์„œ๋ฒ„์—์„œ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ์‹œ๊ฐ„์ด UTC๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท

} else {
const response = await ChannelRoomRepository.ReserveRoom(
req.body,
req.user.id
);
const reservePost = await PostRepository.updateReserve(
parseInt(req.body.postId, 10),
req.body.reservedTime
);
const date = new Date(req.body.reservedTime);
const job = schedule.scheduleJob(date, async () => {
await ChannelRoomRepository.updateOpenRoom(response.id);
await PostRepository.UpdateOpen(parseInt(req.body.postId, 10));
});
if (response && reservePost) {
return res
.status(201)
.send(resFormat.successData(201, "๋ฐฉ ์˜ˆ์•ฝ ์„ฑ๊ณต", response));
}
}

 const date = new Date(req.body.reservedTime); 

ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
POST /api/Room ์—์„œ UTC, GMT+0900๋‘˜๋‹ค ๋ณด๋‚ด๋ดค๋Š”๋ฐ ์„œ๋ฒ„์—๋Š” -9์‹œ๊ฐ„๋ผ์„œ ์ €์žฅ๋˜๋„ค์š”

Api Bug Report

What

  • Channel Api -> Profile Api๋กœ ๋„˜๊ธฐ๋˜ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • api ์‘๋‹ต์œผ๋กœ ์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ˆ˜๋ช…์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ
  • userId๋กœ ์ฐธ์—ฌํ•˜๊ณ ์žˆ๋Š” ๋ชจ๋“  ์ฑ„๋„,์ฑ„ํŒ…๋ฃธ์˜ ์ •๋ณด๋ฅผ ๋ฐ›๋Š” api์˜ ๋ถ€์žฌ

๊ฐœ๋ฐœ์‚ฌํ•ญ

  • Api ์ˆ˜์ •
  • userId๋กœ ์ฐธ์—ฌํ•˜๊ณ ์žˆ๋Š” ๋ชจ๋“  ์ฑ„๋„,์ฑ„ํŒ…๋ฃธ์˜ ์ •๋ณด๋ฅผ ๋ฐ›๋Š” api ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ด์Šˆ์— ๋ผ๋ฒจ ๋ถ™ํžˆ๋Š” ์ปจ๋ฒค์…˜ ์ •๋ฆฝ

ํ˜„์žฌ ํด๋ผ์™€ ์„œ๋ฒ„์˜ ์ด์Šˆ์ž‘์„ฑ ์ปจ๋ฒค์…˜์—์„œ ๋ผ๋ฒจ์„ ๋ถ™ํžˆ๋Š” ์ปจ๋ฒค์…˜์ด ํ†ต์ผ์ด ์•ˆ๋˜์–ด ์žˆ์Œ.
ํƒœ์Šคํฌ ๋ถ„๋ฅ˜์— ๋”ฐ๋ฅธ ์ ์ ˆํ•œ ๋ผ๋ฒจ ํด๋Ÿฌ์Šคํ„ฐ๋ง๊ณผ ๊นƒํ—™์—์„œ ๊ธฐ๋ณธ์ง€์›ํ•˜๋Š” ๋ผ๋ฒจ์„ ์ข€ ์ปค์Šคํ…€ํ•ด์„œ ์ปจ๋ฒค์…˜ ์ •๋ฆฝํ•ด์•ผ ํ•จ.
2021.09.24์— ์ •๋ฆฝ ์˜ˆ์ •.

/api/Room/:channelId ์ฑ„ํŒ…๋ฐฉ ํ•˜๋‚˜๋„ ์—†์„ ์‹œ 500์—๋Ÿฌ

์ฑ„๋„ ์ฑ„ํŒ…๋ฐฉ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์— ์ฑ„ํŒ…๋ฐฉ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด 500์—๋Ÿฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.
image

์ฑ„๋„์— ์ฑ„ํŒ…๋ฐฉ์ด ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ 500์—๋Ÿฌ๋ฉด ์„œ๋ฒ„์˜ ์—๋Ÿฌ๋ผ๊ณ  ์ธ์ง€๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Discussion: ๋Œ“๊ธ€ ์ž‘์„ฑ, ๋ถˆ๋Ÿฌ์˜ค๊ธฐ API ๋‚ด type enum ๋ช…์นญ ๋ณ€๊ฒฝ

๋ฌธ์ œ์ƒํ™ฉ

์•„์นด์ด๋ธŒ ๊ธ€์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ๋Œ“๊ธ€ ์ž‘์„ฑ, ๋ถˆ๋Ÿฌ์˜ค๊ธฐ API์— type ์ฟผ๋ฆฌ๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ์š”,
๋Œ“๊ธ€ ์ž‘์„ฑ์—์„œ๋Š” [channel, archive] enum์„ ์‚ฌ์šฉํ•˜๊ณ ,
๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ์—์„œ๋Š” [post, archive] enum์„ ์‚ฌ์šฉํ•ด์„œ ๋ช…์นญ์ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
channel์„ post๋กœ ๋ฐ”๊ฟ”์„œ ํ†ต์ผ ์‹œํ‚ค๋ฉด ์ดํ•ดํ•˜๊ธฐ ๋” ๋ช…ํ™•ํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-12 13 43 32

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-12 13 46 40

OAuth, Channel, Post, Comment, Search Refactoring

Refactoring

  • ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ์ •ํ–ˆ๋˜ ๊ทœ์น™์— ๋งž๊ฒŒ ์ˆ˜์ •

OAuth

  • services/OauthSevices.js ์˜ ์ด๋ฆ„์ด Oauth๋ผ ๋˜์–ด์žˆ์–ด OAuth๋กœ ์ˆ˜์ •
  • Router ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ • "/api/Oauth" -> "api/OAuth"

Channel

  • ๊ธฐ์กด Post์™€ Comment๋ฅผ Channel ์•ˆ์— ๋‘์–ด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ Post์™€ Comment์˜ controller๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ฌ.
  • ์ฑ„๋„ ์ฐธ์—ฌํ•˜๊ธฐ, ๋‚˜๊ฐ€๊ธฐ api์—์„œ ์‚ฌ์šฉํ•˜๋˜ ์ฑ„๋„์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ ์ ˆ์น˜ ์•Š์•„ ์ตœ๊ทผ ๊ตฌํ˜„ํ•ด๋‘” ํ•จ์ˆ˜๋ฅผ ์ ์šฉ์‹œํ‚ด.

Post

  • ๊ธฐ์กด์— Channel Controller์— ์žˆ๋˜ Post๊ด€๋ จ api๋ฅผ Post Controller์„ ์ƒ์„ฑํ•˜์—ฌ ๋”ฐ๋กœ ์˜ฎ๊ฒจ์คŒ. Router ๊ฒฝ๋กœ๋Š” "/api/Post"๋กœ ์„ค์ •ํ•จ.
  • post์˜ controller๋กœ ์ˆ˜์ • ํ•˜๋ฉด์„œ ๊ธฐ์กด channelId๋ฅผ parameter๋กœ ๋ฐ›๋˜ ๊ฒƒ์„ body๊ฐ’์œผ ๋ฐ›๊ฒŒ ์ˆ˜์ •์„ ํ•จ.
  • ์•„์นด์ด๋น™์— ์ƒ๊ธธ ๊ฒŒ์‹œ๊ธ€์— ๊ฒฝ์šฐ, post์˜ ์ด๋ฆ„์„ ์“ฐ์ง€์•Š๊ณ  article์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์˜ˆ์ •
  • ๊ธฐ์กด์— post์˜ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ, channelId์™€ postId๋ฅผ ๊ฐ™์ด ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ ํ•„์š”์„ฑ์ด ๋Š๊ปด์ง€์ง€ ์•Š์•„ postId๋งŒ ๋ฐ›๊ฒŒ ์ฒ˜๋ฆฌํ•จ. ์ด์— ๋”ฐ๋ผ validation ๋„ ๊ฐ™์ด ์ˆ˜์ •ํ•จ.

Comment

  • ๊ธฐ์กด์— Channel Controller์— ์žˆ๋˜ Comment๊ด€๋ จ api๋ฅผ Comment Controller์„ ์ƒ์„ฑํ•˜์—ฌ ๋”ฐ๋กœ ์˜ฎ๊ฒจ์คŒ. Router ๊ฒฝ๋กœ๋Š” "/api/Comment"๋กœ ์„ค์ •ํ•จ.
  • ๊ธฐ์กด์— comment์˜ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ, channelId์™€ postId๋ฅผ ๊ฐ™์ด ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ ํ•„์š”์„ฑ์ด ๋Š๊ปด์ง€์ง€ ์•Š์•„ commentId๋งŒ ๋ฐ›๊ฒŒ ์ฒ˜๋ฆฌํ•จ. ์ด์— ๋”ฐ๋ผ validation ๋„ ๊ฐ™์ด ์ˆ˜์ •ํ•จ.
  • Services์—์„œ ๋„ค์ด๋ฐ ๊ทœ์น™์— ์–ด๊ธ‹๋‚˜ ์ˆ˜์ •ํ•จ

Profile, Chat, Room Refactoring

1์ฐจ ๋ฆฌํŒฉํ† ๋ง

Refactor - Profile ๋ฆฌํŒฉํ† ๋ง

  • User ๋ž˜ํฌ์ง€ํ† ๋ฆฌ -> findById, findByIdWithData , ๋‹ค ๊ฐ™์€ userId๋ฅผ ํ†ตํ•ด ์ฐพ์Œ,
  • Follow ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ• ๋•Œ, ๋ž˜ํฌ์ง€ํ† ๋ฆฌ ์ฝ”๋“œ์—์„œ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ ์•ˆ์“ฐ๋Š” ๋ž˜ํฌ์ง€ํ† ๋ฆฌ ์ฝ”๋“œ ํ•จ์ˆ˜ ์ œ๊ฑฐ
    • (ํŒ”๋กœ์šฐ ํŒ”๋กœ์œ™ ์š”์ฒญํ•œ ์œ ์ €์— ๋งž๊ฒŒ ์ •๋ ฌํ•ด์ฃผ๋Š” ์ฝ”๋“œ,)

Refactor - Chat

  • ์ฑ„ํŒ…๊ด€๋ จ ๋ž˜ํฌ์ง€ํ† ๋ฆฌ ์ฝ”๋“œ์˜ ์œ„์น˜๊ฐ€ ์ฑ„๋„์ด๋‚˜ ๋‹ค๋ฅธ ๊ณณ์— ์œ„์น˜ํ•œ ๊ณณ ์ˆ˜์ •

Refactor- Room

  • ์ฑ„ํŒ…๋ฐฉ ์˜ˆ์•ฝ์‹œ๊ฐ„์— ์ œํ•œ ์‹œ๊ฐ„(1์ฃผ์ผ) ๋‘๊ธฐ
  • ๊ธฐ์กด์— ๋ฆฌ๋ทฐ๋ฅผ Room์—์„œ ์ƒ์„ฑ, Profile์—์„œ ์กฐํšŒ๋ฅผ ํ–ˆ๋Š”๋ฐ, ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌ ์˜ˆ์ •.

Bug: ์ฑ„๋„ ์นดํ…Œ๊ณ ๋ฆฌ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ํ›„ ์ฑ„๋„ ์นดํ…Œ๊ณ ๋ฆฌ ์ ์šฉ ๋ถˆ๊ฐ€

๋ฒ„๊ทธ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”
์ฑ„๋„ ์นดํ…Œ๊ณ ๋ฆฌ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ดํ›„ ์ฑ„๋„์ƒ์„ฑ, ์ฑ„๋„ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์žฌํ˜„๋ฐฉ๋ฒ•
๋ฒ„๊ทธ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด...

  1. ํ˜„์žฌ dev ๋ธŒ๋žœ์น˜ ๋ฒ„์ „์œผ๋กœ ์„œ๋ฒ„๋ฅผ ํ‚จ๋‹ค.(๋ฐฐํฌํŒ๋„ ํ˜„์žฌ ๋ฒ„์ „์œผ๋กœ ๋˜์žˆ์Œ)
  2. ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ‚จ๋‹ค.
  3. ๋””๋ฒ„๊น…ํ•  ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ์˜ setUpProxy ํŒŒ์ผ์—์„œ ์„ค์ •ํ•˜์—ฌ ์—ฐ๊ฒฐํ•œ๋‹ค.
  4. ์ฑ„๋„ ๋งŒ๋“ค๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์‹œ ์„œ๋ฒ„์— ์ฐํžˆ๋Š” ์—๋Ÿฌ ๋กœ๊ทธ ํ™•์ธ.

๋งž๋Š” ๋™์ž‘
์ฑ„๋„ ์ƒ์„ฑ๊ณผ ์ฑ„๋„ ์ •๋ณด ์ˆ˜์ •์ด ์ด๋ฃจ์–ด์ ธ์•ผํ•จ.

์Šคํฌ๋ฆฐ์ƒท
๋ฐฐํฌ ์„œ๋ฒ„ ์—๋Ÿฌ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์บก์ฒ˜3

PrismaClientKnownRequestError2 [PrismaClientKnownRequestError]: An operation failed because it depends on one or more records that were required but not found. No 'Category' record (needed to inline connect on create for 'ChannelCategory' record) was found for a nested connect on one-to-one relation 'CategoryToChannelCategory'.
    at cb (/usr/app/node_modules/@prisma/client/runtime/index.js:34800:17)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'P2025',
  clientVersion: '2.28.0',
  meta: {
    cause: "No 'Category' record (needed to inline connect on create for 'ChannelCategory' record) was found for a nested connect on one-to-one relation 'CategoryToChannelCategory'."
  }
}

์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ
@iqeq1945 ํด๋ผ ๋ ˆํฌ์— ํ•ด๋‹น api ์ˆ˜์ • ์ด์Šˆ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„<->์ฝ”๋“œ ๋”•์…”๋„ˆ๋ฆฌ ์ „๋‹ฌํ•˜๋Š” ์ด์Šˆ ์ƒ์„ฑํ•ด์„œ ํด๋ผ ์ˆ˜์ •์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์„ธ์š”.

์ฑ„ํŒ…๋ฐฉ - archive ์—ฐ๋™ API

๊ฐœ๋ฐœ์‚ฌํ•ญ

  1. ๋กœ๊ทธ์ธํ•œ ์œ ์ €๊ฐ€ ์ฑ„ํŒ…๋ฐฉ ์ฃผ์ธ์ธ ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ API
  2. ์ฑ„ํŒ…๋ฐฉ์˜ ์งˆ๋ฌธ๋‹ต์žฅ์Œ API
  3. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํ•จ์ˆ˜ ์ž‘์„ฑ
  4. ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์„ฑ

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.