Home > DB > ๐Ÿ’พ[Database] MySQL์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ SQL ์ฟผ๋ฆฌ ๋ถ„์„.

๐Ÿ’พ[Database] MySQL์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ SQL ์ฟผ๋ฆฌ ๋ถ„์„.
Database Native SQL Query MySQL

๐Ÿ’พ[Database] MySQL์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ SQL ์ฟผ๋ฆฌ ๋ถ„์„.

๐Ÿ“ Intro

  • ์•„๋ž˜์˜ Query ๋ฌธ์€ โ€œMySQLโ€์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ Native SQL Query์ž…๋‹ˆ๋‹ค.
    • โ€œSpring Data JPAโ€์—์„œ @Query ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠน์ • boardId์— ์†ํ•œ ๊ฒŒ์‹œ๋ฌผ(Article)์„ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
@Query(
    value = "SELECT article.article_id, article.title, article.board_id, article.writer_id, " +
			"article.created_at, article.modified_at " +
			"FROM (" +
			"   SELECT article_id FROM article " +
			"   WHERE board_id = :boardId " +
			"   ORDER BY article_id DESC " +
			"   LIMIT :limit OFFSET :offset " +
			") t LEFT JOIN article ON t.article_id = article.article_id ",
	nativeQuery = true
)
List<Article> findAll(
	@Param("boardId") Long boardId,
	@Param("offset") Long offset,
	@Param("limit") Long limit
);

โœ…1๏ธโƒฃ Query ๋ฌธ ๋ถ„์„.

SELECT article.article_id, article.title, article.board_id, article.writer_id,
       article.created_at, article.modified_at
FROM (
    SELECT article_id
    FROM article
    WHERE board_id = :boardId
    ORDER BY article_id DESC
    LIMIT :limit OFFSET :offset
) t
LEFT JOIN article ON t.article_id = article_article_id

1๏ธโƒฃ ๋‚ด๋ถ€ ์„œ๋ธŒ์ฟผ๋ฆฌ.

SELECT article_id
FROM article
WHERE board_id = :boardId
ORDER BY article_id DESC
LIMIT :limit OFFSET :offset
  • ๋ชฉ์  : ํŠน์ • ๊ฒŒ์‹œํŒ(board_id)์—์„œ ํ•„์š”ํ•œ ๊ฒŒ์‹œ๋ฌผ์˜ ID๋งŒ ์ถ”์ถœ.
  • ์„ธ๋ถ€ ๋‚ด์šฉ:
    • board_id = :boardId
      • โ†˜๏ธŽ ์ „๋‹ฌ ๋ฐ›์€ boardID์— ํ•ด๋‹นํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ๋งŒ ์กฐํšŒ
    • ORDER BY article_id DESC
      • โ†˜๏ธŽ article_id๋ฅผ ์ง€๊ตฐ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ.(์ตœ์‹  ๊ฒŒ์‹œ๋ฌผ ์ˆœ)
    • LIMIT :limit OFFSET :offset
      • โ†˜๏ธŽ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ‚ค์›Œ๋“œ.
        • :limit ๐Ÿ‘‰ ํ•œ ํŽ˜์ด์ง€์— ํ‘œ์‹œํ•  ๊ฒŒ์‹œ๋ฌผ ์ˆ˜.
        • :offset ๐Ÿ‘‰ ๋ช‡ ๋ฒˆ์งธ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ์ง€ ๊ฒฐ์ •.

2๏ธโƒฃ ์™ธ๋ถ€ ์ฟผ๋ฆฌ.

SELECT article.article_id, article.title, article.board_id, article.writer_id,
       article.created_at, article.modified_at
FROM ... LEFT JOIN article ON t.article_id = article.article_id
  • ๋ชฉ์  : ์„œ๋ธŒ์ฟผ๋ฆฌ์„ธ์–ด ๊ฐ€์ ธ์˜จ article_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ์„ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒ.
  • ์„ธ๋ถ€ ๋‚ด์šฉ :
    • LEFT JOIN
      • โ†˜๏ธŽ ์„œ๋ธŒ์ฟผ๋ฆฌ(t)์™€ article ํ…Œ์ด๋ธ”์„ ์กฐ์ธ.
      • โ†˜๏ธŽ t.article_id์™€ article.article_id๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด.
    • SELECT โ€ฆ
      • โ†˜๏ธŽ ๊ฒŒ์‹œ๋ฌผ์˜ ์ฃผ์š” ์ •๋ณด๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ด.

3๏ธโƒฃ Query์˜ ๋™์ž‘ ๊ณผ์ •.

1๏ธโƒฃ ์„œ๋ธŒ์ฟผ๋ฆฌ ์‹คํ–‰.

  • โ†˜๏ธŽ article ํ…Œ์ด๋ธ”์—์„œ board_id๊ฐ€ :boardId์ธ ๊ฒŒ์‹œ๋ฌผ์˜ ID๋ฅผ ์ตœ์‹  ์ˆœ์œผ๋กœ ์ •๋ ฌ.
  • โ†˜๏ธŽ LIMIT์™€ OFFSET์„ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ๊ฒŒ์‹œ๋ฌผ ID๋งŒ ์„ ํƒ.

4๏ธโƒฃ ์™ธ๋ถ€ ์ฟผ๋ฆฌ ์‹คํ–‰.

  • โ†˜๏ธŽ ์„œ๋ธŒ ์ฟผ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ article_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ article ํ…Œ์ด๋ธ”์˜ ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด.
  • โ†˜๏ธŽ ๊ฐ ๊ฒŒ์‹œ๋ฌผ์˜ ID, ์ œ๋ชฉ, ๊ฒŒ์‹œํŒ ID, ์ž‘์„ฑ์ž ID, ์ƒ์„ฑ/์ˆ˜์ • ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜.

4๏ธโƒฃ ํŒŒ๋ผ๋ฏธํ„ฐ.

  • @Param(โ€œboardIdโ€) Long boardId
    • โ†˜๏ธŽ ํŠน์ • ๊ฒŒ์‹œํŒ์˜ ID๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • โ†˜๏ธŽ WHERE board_id = :boardId ์กฐ๊ฑด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • @Param(โ€œoffsetโ€) Long offset
    • โ†˜๏ธŽ ํŽ˜์ด์ง€๋„ค์ด์…˜์˜ ์‹œ์ž‘ ์ง€์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • โ†˜๏ธŽ ์˜ˆ: 0์ด๋ฉด ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ, 10์ด๋ฉด 11๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์กฐํšŒ.
  • @Param(โ€œlimitโ€) Long limit
    • โ†˜๏ธŽ ํ•œ ํŽ˜์ด์ง€์— ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • โ†˜๏ธŽ ์˜ˆ: 10์ด๋ฉด ํ•œ ๋ฒˆ์— 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜.