์ฟผ๋ฆฌ ์ตœ์ ํ™” ํ•˜๊ธฐ 1๋‹จ๊ณ„

์ธ๋ฑ์Šค ๋„ฃ๊ธฐ & ์“ธ๋ฐ์—†๋Š” ์ฟผ๋ฆฌ ์ค„์ด๊ธฐ

Profile Picture
JangAJang
2023-12-05

์›๋ณธ

๊ณฐํ„ฐ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์ „์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•ญ์ƒ 13~16์ดˆ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ์•ฝ 260๊ฐœ์ •๋„์˜€์„ ๋•Œ ์ด ์ •๋„๊ฐ€ ๋‚˜์˜จ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ดˆ๋‹น 20๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ์•„๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๋”, ๋” ๋นจ๋ผ์ง€๊ธธ ์›ํ–ˆ๋‹ค...

๊ทธ๋ž˜์„œ ๋ชจ๋“  API์˜ ์ฟผ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๋กœ๊น…์„ true๋กœ ์„ค์ •ํ•˜๊ณ , ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๋ฉด์„œ ์กฐ๊ธˆ์”ฉ ๋ฉ”๋ชจ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

์“ฐ๋‹ค๋ณด๋‹ˆ, ํ•„์š”ํ•œ ๋ถ€๋ถ„๊ณผ, ์ด๊ฒŒ ๊ผญ ์žˆ์–ด์•ผ ํ• ๊นŒ ์‹ถ์€ ๋ถ€๋ถ„๋“ค์ด ์žˆ์—ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ๋“ค๊ณผ, ์šฐ๋ฆฌ ํŒ€์—์„œ ์ฒ˜๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


SAVE

epository.save๋ผ๋Š” ๋กœ์ง์„ ์ •๋ง ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด์œ ๋Š”? ๊ฒ๋‚˜๊ฒŒ ํŽธํ–ˆ๋‹ค. ์ง„์งœ ๋‹ค๋ฅธ ๋ญ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŽธํ•˜๋‹ค๋Š”๊ฑด? ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ๊ทธ ์†์—์„œ ๊ฒ๋‚˜๊ฒŒ ๋งŽ์€ ์ผ๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค. ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด insert, ์กด์žฌํ•œ๋‹ค๋ฉด update๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

START TRANSACTION
INSERT INTO ~~~~;
SELECT `Workbook` ~~~~;
COMMIT

ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ, ํŠธ๋žœ์žญ์…˜์€ ํ›„์— ๋” ํฌ๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋” ๋น ๋ฅด๊ฒŒ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋ณด์•˜์„ ๋•Œ, select๋ฅผ ๋ฌด์กฐ๊ฑด ๋‚˜๊ฐ€๋Š” ์ด๋Ÿฐ ์ฟผ๋ฆฌ๊ฐ€ ์ข‹์„์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ, save๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง์„ ๋ถ€๋ฅผ ๊ฒฝ์šฐ, insert(entity)๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ์ž.
  • ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด, ๊ฒ€์ฆ์„ ์œ„ํ•ด select & validate๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ด๋Ÿด ๋•Œ update({id: entity.id}, entity)๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์ž. ๋ผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

ํ•˜๊ณ ๋‚˜๋‹ˆ ๋ถˆํ•„์š”ํ•œ select๊ฐ€ ํ•˜๋‚˜์”ฉ ์ค„์–ด๋“œ๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

EAGER

๊ธฐ์กด์—๋Š” ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•ด eager๋ฅผ entity์˜ ์—ฐ๊ด€๊ด€๊ณ„์— ๋“ฑ๋กํ•ด๋‘์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์žฅ์ ์ด์ž ๋‹จ์ ์ด ์žˆ๋‹ค.

๋งค ์ˆœ๊ฐ„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ left joinํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

์ด๊ฒŒ ํ™•์‹คํžˆ ๋ชจ๋“  select ๋กœ์ง์—์„œ ์กฐ์ธํ•œ ๊ฐ์ฒด๋ฅผ ์“ด๋‹ค๋ฉด ์ข‹์ง€๋งŒ,

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋…์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฑด๋“œ๋ฆฌ์ง„ ๋ชปํ•˜๊ณ ์žˆ์—ˆ๋‹ค(...๋‚˜์ž์‹  ๋ฐ˜์„ฑํ•ด...)

๊ทธ๋ž˜์„œ, ํ•ด๋‹น ์™ธ๋ž˜ํ‚ค๋ฅผ eager๋กœ ์„ค์ •ํ•œ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ eager๋ฅผ ๋บ๋‹ค.

async findAll() {
    return this.repository
      .createQueryBuilder('Workbook')
      .leftJoinAndSelect('Workbook.category', 'category')
      .leftJoinAndSelect('Workbook.member', 'member')
      .where('Workbook.isPublic = :state', { state: true })
      .getMany();
  }

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค joinํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์ˆ˜์ •ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์ƒ๊ฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์—ˆ๋‹ค.

INDEX(๋‚˜๋Š” HDEX๊ฐ€ ๋” ์ข‹...์!)

์‚ฌ์‹ค ์ง„์งœ ์ฃผ๋ณ€์— ์ด๊ฑฐ ๋ฌด์„ญ๋‹ค๊ณ  ์นญ์–ผ๊ฑฐ๋ ธ๋‹ค.

sql์— ๋“ค์–ด๊ฐ€์„œ explain์œผ๋กœ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ์ฒดํฌํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ง์ ‘ ์ง‘์–ด๋„ฃ์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ....

nestjs๋Š” ์ฝ”๋“œ๋ ˆ๋ฒจ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ž๋™ ๋“ฑ๋กํ•ด์ค€๋‹ค.

๊ทธ๋ž˜์„œ ๋”ฅ ๋‹ค์ด๋น™ ํ•ด๋ณธ ๊ฒฐ๊ณผ, ์™ธ๋ž˜ํ‚ค๋„ ๋“ฑ๋ก๋  ๋•Œ ์ธ๋ฑ์Šค๋ฅผ ๋“ฑ๋ก์‹œ์ผœ์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๋ฐ”๋กœ ์ฝ”๋“œ๋ ˆ๋ฒจ์—์„œ ๋‹ฌ๋ ค๋“ค์—ˆ๋‹ค.

leftJoin์„ ํ•˜๋Š” ๋ถ€๋ถ„, orderํ•˜๋Š” ๋ถ€๋ถ„, whereํ•˜๋Š” ๋ถ€๋ถ„์„ ์ „๋ถ€ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

๊ฒฐ๊ตญ leftJoin์€ ์™ธ๋ž˜ํ‚ค๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์€ nestjs+type ormํ™˜๊ฒฝ์—์„œ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ž๋™์ ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ์—ˆ๋‹ค.

where๋กœ ์กฐํšŒ๋˜๋Š” ๋ถ€๋ถ„(where/andWhere๋‚˜ where/orWhere)์—์„œ๋Š” ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค

orderBy๋กœ ์ •๋ ฌ๋˜๋Š” ๋ถ€๋ถ„๋„ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ์ „์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋ณด์•˜๋‹ค.

์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š”๋ฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด 8์ดˆ๋Œ€๋กœ ์ค„์—ˆ๋‹ค(์‹ฌ์ง€์–ด ์ด์ „๋ณด๋‹ค ํ…Œ์ŠคํŠธ์ฝ”๋“œ๊ฐ€ 15๊ฐœ ๋Š˜์—ˆ๋‹ค)

ํ…Œ์ŠคํŠธ์—์„œ๋Š” ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์•ผ 20๊ฐœ์ •๋„์ธ ๊ฒƒ์„ ๊ฐ์•ˆํ•˜๋ฉด, ์‹ค์ œ ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋” ์„ฑ๋Šฅ์ ์œผ๋กœ ํ–ฅ์ƒ์„ ์•ผ๊ธฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋น„์žฅ์˜ ํ•œ ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€์— ๊ด€ํ•œ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผ๊ณ˜๋‹ค.

๊ทธ๋Ÿผ...twenty thousand...๐Ÿ”ฅ

ยฉ 2024 Adultlee. All rights reserved.Made with โค by ์ด์„ฑ์ธ