From ef7deb8f09df2d7680fe312fb71a7490432140d1 Mon Sep 17 00:00:00 2001 From: DongHoon Lee Date: Fri, 25 Apr 2025 14:08:05 +0900 Subject: [PATCH 1/3] =?UTF-8?q?chore:=20=EC=9D=B4=EB=AA=A8=EC=A7=80=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/makers/vo/slack/block/HeaderBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/makers/vo/slack/block/HeaderBlock.java b/src/main/java/org/sopt/makers/vo/slack/block/HeaderBlock.java index 9249d96..35e8703 100644 --- a/src/main/java/org/sopt/makers/vo/slack/block/HeaderBlock.java +++ b/src/main/java/org/sopt/makers/vo/slack/block/HeaderBlock.java @@ -10,6 +10,6 @@ public record HeaderBlock( Text text ) implements Block { public static HeaderBlock newInstance(String text) { - return new HeaderBlock(BLOCK_TYPE_HEADER, PlainText.newInstance("๐Ÿšจ " + text, true)); + return new HeaderBlock(BLOCK_TYPE_HEADER, PlainText.newInstance(text, true)); } } From d0656f8aa2d34e814af5d803ef35968ddb66b935 Mon Sep 17 00:00:00 2001 From: DongHoon Lee Date: Fri, 25 Apr 2025 14:08:33 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20150=EC=9E=90=20=EC=B4=88=EA=B3=BC?= =?UTF-8?q?=EC=8B=9C=20=EC=B5=9C=EB=8C=80=20=ED=97=88=EC=9A=A9=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=EA=B9=8C=EC=A7=80=20=EC=9E=98=EB=9D=BC=EC=84=9C=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/makers/global/constant/SlackConstant.java | 5 +++++ .../sopt/makers/service/SlackNotificationService.java | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/makers/global/constant/SlackConstant.java b/src/main/java/org/sopt/makers/global/constant/SlackConstant.java index 3598695..9ca9ded 100644 --- a/src/main/java/org/sopt/makers/global/constant/SlackConstant.java +++ b/src/main/java/org/sopt/makers/global/constant/SlackConstant.java @@ -41,6 +41,11 @@ public final class SlackConstant { public static final String ERROR = "error"; public static final String CODE = "code"; + // ํ—ค๋” ๊ด€๋ จ ์ƒ์ˆ˜ + public static final int MAX_HEADER_LENGTH = 150; + public static final String EMOJI_PREFIX = "๐Ÿšจ "; + public static final String TRUNCATION_SUFFIX = "..."; + // ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ public static final String SUCCESS_MESSAGE = "์•Œ๋ฆผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค"; diff --git a/src/main/java/org/sopt/makers/service/SlackNotificationService.java b/src/main/java/org/sopt/makers/service/SlackNotificationService.java index 47c0dbf..6f83c1b 100644 --- a/src/main/java/org/sopt/makers/service/SlackNotificationService.java +++ b/src/main/java/org/sopt/makers/service/SlackNotificationService.java @@ -106,11 +106,18 @@ private SlackMessage buildSlackMessage(String team, String type, String stage, return SlackMessage.newInstance(blocks, color); } - /** + /* * ํ—ค๋” ๋ธ”๋ก ๊ตฌ์„ฑ */ private Block buildHeaderBlock(String message) { - return HeaderBlock.newInstance(message); + String fullMessage = EMOJI_PREFIX + message; + + if (fullMessage.length() > MAX_HEADER_LENGTH) { + int maxLength = MAX_HEADER_LENGTH - EMOJI_PREFIX.length() - TRUNCATION_SUFFIX.length(); + fullMessage = EMOJI_PREFIX + message.substring(0, maxLength) + TRUNCATION_SUFFIX; + } + + return HeaderBlock.newInstance(fullMessage); } /** From dc00fa6a51d750227695d00ea78bc6bf429073c7 Mon Sep 17 00:00:00 2001 From: DongHoon Lee Date: Fri, 25 Apr 2025 14:24:26 +0900 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20README=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 724c7cf..9543a5f 100644 --- a/README.md +++ b/README.md @@ -14,25 +14,17 @@ Spring ์—†์ด Java๋งŒ์œผ๋กœ ๊ฒฝ๋Ÿ‰ ๊ตฌํ˜„๋œ ์ด Lambda ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™ ## ๐ŸŽฏ Motivation -Sentry๋Š” **๋›ฐ์–ด๋‚œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ**์ง€๋งŒ, Slack๊ณผ์˜ ๊ณต์‹ ์—ฐ๋™ ๊ธฐ๋Šฅ์€ -**ํŒ€ ํ”Œ๋žœ ์ด์ƒ(์›” $26, ์•ฝ 37,000์›)์˜ ์œ ๋ฃŒ ์š”๊ธˆ์ œ**๋ฅผ ๊ตฌ๋…ํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Sentry๋Š” **ํƒ์›”ํ•œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ**์ง€๋งŒ, Slack๊ณผ์˜ ๊ณต์‹ ์—ฐ๋™ ๊ธฐ๋Šฅ์€ **ํŒ€ ํ”Œ๋žœ ์ด์ƒ(์›” $26, ์•ฝ 37,000์›)์˜ ์œ ๋ฃŒ ์š”๊ธˆ์ œ**๋ฅผ ๊ตฌ๋…ํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -ํ•˜์ง€๋งŒ **SOPT Makers ์กฐ์ง**์—์„œ๋Š” ์ด ๊ธˆ์•ก์„ ์ •๊ธฐ์ ์œผ๋กœ ๋ถ€๋‹ดํ•˜๊ธฐ์—” ๋น„์šฉ์ ์œผ๋กœ ํฐ ๋ถ€๋‹ด์ด์—ˆ์Šต๋‹ˆ๋‹ค. +**SOPT Makers** ์กฐ์ง์—์„œ๋Š” ์ด ๋น„์šฉ์„ ๋งค๋‹ฌ ์ง€์ถœํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์œผ๋กœ ๋ถ€๋‹ด์Šค๋Ÿฌ์›Œ, **๋ฌด๋ฃŒ ํ”Œ๋žœ ๋‚ด์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ ์•ˆ์—์„œ Sentry๋ฅผ ํ™œ์šฉ**ํ•ด์™”์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ **์—๋Ÿฌ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ๊ธฐ๋Šฅ ์ž์ฒด๋Š” ๋ฌด๋ฃŒ ํ”Œ๋žœ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์œ ์šฉ**ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด์—๋Š” ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์—†์ด๋„ ์—๋Ÿฌ๋ฅผ ๊ด€๋ฆฌํ•ด์™”์Šต๋‹ˆ๋‹ค. ---- +ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก, **์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์ด ์—†๋‹ค๋Š” ์ ์ด ์—๋Ÿฌ ๋Œ€์‘ ์†๋„์— ํ•œ๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ์ฒด๊ฐ**ํ–ˆ์Šต๋‹ˆ๋‹ค. **Slack๊ณผ ๊ฐ™์€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํˆด๊ณผ ์—ฐ๋™ํ•ด ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์•ผ** ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋” **์‹ ์†ํ•˜๊ณ  ํšจ๊ณผ์ ์ธ ๋Œ€์‘์ด ๊ฐ€๋Šฅ**ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. -๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , -**Sentry์˜ ๋ฌด๋ฃŒ ํ”Œ๋žœ๋งŒ์œผ๋กœ๋„ ์—๋Ÿฌ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ๊ธฐ๋Šฅ์€ ์ถฉ๋ถ„ํžˆ ์œ ์šฉ**ํ–ˆ๊ณ , **Slack ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํŒ€ ์ „์ฒด์˜ ์—๋Ÿฌ ๋Œ€์‘ ์†๋„์™€ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ**์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. +์กฐ์‚ฌ ๊ณผ์ •์—์„œ **Sentry์˜ ๋ฌด๋ฃŒ ํ”Œ๋žœ์—์„œ๋„ Webhook ๊ธฐ๋Šฅ์€ ์ œ๊ณต**๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ–ˆ๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด **๋ณ„๋„์˜ ์œ ๋ฃŒ ์š”๊ธˆ์ œ ์—†์ด๋„ Slack ์•Œ๋ฆผ ์—ฐ๋™์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค**๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด ๊ธฐ๋Šฅ์„ **AWS Lambda์˜ ๋ฌด๋ฃŒ ์‹คํ–‰ ํ•œ๋„ ๋‚ด์—์„œ ์ถฉ๋ถ„ํžˆ ์šด์˜ ๊ฐ€๋Šฅ**ํ•˜๋‹ค๋Š” ์ ๋„ **๋น„์šฉ ๋ถ€๋‹ด ์—†์ด ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ์ •์  ์žฅ์ **์ด์—ˆ์Šต๋‹ˆ๋‹ค. -๋ฐฉ์•ˆ์„ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ, -**๋ฌด๋ฃŒ ํ”Œ๋žœ์—์„œ๋„ Webhook ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ **์„ ํ™•์ธํ–ˆ๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•ด **์ง์ ‘ Slack ์•Œ๋ฆผ ์—ฐ๋™ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค**๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. -๊ฒŒ๋‹ค๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ **AWS Lambda์˜ ๋ฌด๋ฃŒ ์‹คํ–‰ ํ•œ๋„ ๋‚ด์—์„œ ์ถฉ๋ถ„ํžˆ ์šด์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—**, **๋ณ„๋„์˜ ์„œ๋ฒ„ ๋น„์šฉ ์—†์ด๋„ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋งค์šฐ ๋งค๋ ฅ์ **์ด์—ˆ์Šต๋‹ˆ๋‹ค. +์ด์— **Sentry Webhook ์ด๋ฒคํŠธ๋ฅผ Slack Webhook ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜**ํ•ด ์ „๋‹ฌํ•˜๋Š” **๊ฒฝ๋Ÿ‰ Lambda ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•**ํ–ˆ์Šต๋‹ˆ๋‹ค. -์ด์— ๋”ฐ๋ผ **Sentry Webhook ์ด๋ฒคํŠธ๋ฅผ Slack Webhook ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜**ํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” **๊ฒฝ๋Ÿ‰ Lambda ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•**ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. - ---- - -๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ด ํ”„๋กœ์ ํŠธ๋Š” **๋น„์šฉ ์ ˆ๊ฐ**, **ํŒ€ ์šด์˜ ํšจ์œจ ํ–ฅ์ƒ**, **๊ธฐ์ˆ ์  ๋„์ „์˜ ์˜๋ฏธ**๋ฅผ ๋ชจ๋‘ ๋‹ด๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋กœ ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. +๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ํ”„๋กœ์ ํŠธ๋Š” **๋น„์šฉ ์ ˆ๊ฐ**, **์šด์˜ ํšจ์œจ ํ–ฅ์ƒ**, ๊ทธ๋ฆฌ๊ณ  **๊ธฐ์ˆ ์  ๋„์ „**์ด๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ์˜๋ฏธ๋ฅผ ๋ชจ๋‘ ๋‹ด์€ **์ž‘์ง€๋งŒ ์‹ค์šฉ์ ์ธ ์ธํ”„๋ผ ๊ฐœ์„  ์‚ฌ๋ก€**๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ## ๐Ÿ—๏ธ Tech Stack - **Java 21** โ€“ ์ตœ์‹  LTS(Long-Term Support) ๋ฒ„์ „์œผ๋กœ, ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ณ ๋ คํ•ด ์„ ํƒ