Avatar
๐Ÿ˜‰

Organizations

  • Grafana Dashboard ์„ค์ •

    {
      "annotations": {
        "list": [
          {
            "builtIn": 1,
            "datasource": {
              "type": "grafana",
              "uid": "-- Grafana --"
            },
            "enable": true,
            "hide": true,
            "iconColor": "rgba(0, 211, 255, 1)",
            "name": "Annotations & Alerts",
            "type": "dashboard"
          }
        ]
      },
      "editable": false,
      "fiscalYearStartMonth": 0,
      "graphTooltip": 0,
      "links": [],
      "liveNow": false,
      "panels": [
        {
          "datasource": {
            "type": "prometheus",
            "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
          },
          "gridPos": {
            "h": 3,
            "w": 24,
            "x": 0,
            "y": 0
          },
          "id": 1,
          "targets": [
            {
              "datasource": {
                "type": "prometheus",
                "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
              },
              "refId": "A"
            }
          ],
          "type": "welcome"
        },
        {
          "datasource": {
            "type": "prometheus",
            "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
          },
          "gridPos": {
            "h": 9,
            "w": 24,
            "x": 0,
            "y": 3
          },
          "id": 123123,
          "targets": [
            {
              "datasource": {
                "type": "prometheus",
                "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
              },
              "refId": "A"
            }
          ],
          "type": "gettingstarted"
        },
        {
          "datasource": {
            "type": "prometheus",
            "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
          },
          "gridPos": {
            "h": 15,
            "w": 12,
            "x": 0,
            "y": 12
          },
          "id": 3,
          "links": [],
          "options": {
            "folderUID": "",
            "includeVars": false,
            "keepTime": false,
            "maxItems": 30,
            "query": "",
            "showHeadings": true,
            "showRecentlyViewed": true,
            "showSearch": false,
            "showStarred": true,
            "tags": []
          },
          "pluginVersion": "10.3.3",
          "targets": [
            {
              "datasource": {
                "type": "prometheus",
                "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
              },
              "refId": "A"
            }
          ],
          "title": "Dashboards",
          "type": "dashlist"
        },
        {
          "datasource": {
            "type": "prometheus",
            "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
          },
          "gridPos": {
            "h": 15,
            "w": 12,
            "x": 12,
            "y": 12
          },
          "id": 4,
          "links": [],
          "options": {
            "feedUrl": "https://grafana.com/blog/news.xml",
            "showImage": true
          },
          "targets": [
            {
              "datasource": {
                "type": "prometheus",
                "uid": "d594a822-806b-41e9-8c74-135eb41505a2"
              },
              "refId": "A"
            }
          ],
          "title": "Latest from the blog",
          "type": "news"
        }
      ],
      "refresh": "",
      "schemaVersion": 39,
      "tags": [],
      "templating": {
        "list": []
      },
      "time": {
        "from": "now-6h",
        "to": "now"
      },
      "timepicker": {
        "hidden": true,
        "refresh_intervals": [
          "5s",
          "10s",
          "30s",
          "1m",
          "5m",
          "15m",
          "30m",
          "1h",
          "2h",
          "1d"
        ],
        "time_options": [
          "5m",
          "15m",
          "1h",
          "6h",
          "12h",
          "24h",
          "2d",
          "7d",
          "30d"
        ],
        "type": "timepicker"
      },
      "timezone": "browser",
      "title": "Home",
      "version": 0,
      "weekStart": ""
    }
    

    ์ด JSON์€ Grafana ๋Œ€์‹œ๋ณด๋“œ ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” Grafana์—์„œ “Home"์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๊ธฐ๋ณธ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ •์˜ํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ฃผ์š” ํ•ญ๋ชฉ๋“ค์„ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

    Created Tue, 20 May 2025 20:20:45 +0900
  • ๋™์˜์ƒ ์ŠคํŠธ๋ฆฌ๋ฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ๊ธฐ์ˆ  ๋ฐ ํˆด์€ ๋‹ค์–‘ํ•œ ๋ชฉ์ (์˜ˆ: ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, VOD, ์ฝ˜ํ…์ธ  ์ „์†ก, ์ธ์ฝ”๋”ฉ, ํ”Œ๋ ˆ์ด์–ด ๊ตฌํ˜„ ๋“ฑ)์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ฃผ์š” ๊ธฐ์ˆ ๊ณผ ํˆด์„ ์˜์—ญ๋ณ„๋กœ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š”.


    1. ๋น„๋””์˜ค ์ธ์ฝ”๋”ฉ ๋ฐ ํŠธ๋žœ์Šค์ฝ”๋”ฉ

    • FFmpeg: ์˜คํ”ˆ์†Œ์Šค ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ ๋„๊ตฌ. ์ธ์ฝ”๋”ฉ, ๋””์ฝ”๋”ฉ, ํŠธ๋žœ์Šค์ฝ”๋”ฉ, ํฌ๋งท ๋ณ€๊ฒฝ, ํ•„ํ„ฐ๋ง ๋“ฑ์— ์‚ฌ์šฉ.
    • x264 / x265: ๊ฐ๊ฐ H.264, H.265 ํ‘œ์ค€ ์ธ์ฝ”๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
    • AWS Elemental MediaConvert: AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šค์ฝ”๋”ฉ ์„œ๋น„์Šค.

    2. ์ŠคํŠธ๋ฆฌ๋ฐ ํ”„๋กœํ† ์ฝœ

    • HLS (HTTP Live Streaming): ์• ํ”Œ์ด ๊ฐœ๋ฐœ. ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋žซํผ์—์„œ ์ง€์›๋˜๋ฉฐ, ์„ธ๊ทธ๋จผํŠธ ๋ฐฉ์‹.
    • DASH (Dynamic Adaptive Streaming over HTTP): MPEG ํ‘œ์ค€ ๊ธฐ๋ฐ˜์œผ๋กœ, HLS์™€ ๋น„์Šทํ•˜์ง€๋งŒ ํ”Œ๋žซํผ ๋…๋ฆฝ์ .
    • RTMP (Real-Time Messaging Protocol): ์ฃผ๋กœ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก์— ์‚ฌ์šฉ๋˜๋ฉฐ, YouTube Live, Twitch ๋“ฑ์—์„œ ์—ฌ์ „ํžˆ ํ™œ์šฉ.
    • WebRTC: ์ง€์—ฐ์ด ๊ทนํžˆ ๋‚ฎ์€ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์— ์ตœ์ ํ™”๋œ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”„๋กœํ† ์ฝœ.

    3. ์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ (CDN)

    • Cloudflare Stream / CDN: ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์ฝ˜ํ…์ธ  ์ „์†ก์„ ์œ„ํ•œ ๊ธ€๋กœ๋ฒŒ ๋„คํŠธ์›Œํฌ.
    • AWS CloudFront, Akamai, Fastly: ๋Œ€ํ˜• ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉ.

    4. ํ”Œ๋ ˆ์ด์–ด ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ๋„๊ตฌ

    • Video.js: HTML5 ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด.
    • Shaka Player: ๊ตฌ๊ธ€์ด ๋งŒ๋“  MPEG-DASH ๋ฐ HLS ์ง€์› ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋ ˆ์ด์–ด.
    • HLS.js: JavaScript ๊ธฐ๋ฐ˜ HLS ์žฌ์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
    • ExoPlayer (Android), AVPlayer (iOS): ๋ชจ๋ฐ”์ผ ์•ฑ์šฉ ๊ธฐ๋ณธ ํ”Œ๋ ˆ์ด์–ด SDK.

    5. ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ/์„œ๋น„์Šค

    • OBS Studio (Open Broadcaster Software): ๋ฌด๋ฃŒ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก ๋„๊ตฌ, Twitch, YouTube์— ๋ฐฉ์†ก ๊ฐ€๋Šฅ.
    • StreamYard, Restream, Wirecast: ๋ผ์ด๋ธŒ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ์ŠคํŠธ๋ฆฌ๋ฐ ํˆด.
    • Wowza Streaming Engine: ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ผ์ด๋ธŒ ๋ฐ VOD ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„.

    6. DRM (๋””์ง€ํ„ธ ์ €์ž‘๊ถŒ ๊ด€๋ฆฌ) ๋ฐ ๋ณด์•ˆ

    • Widevine (Google), PlayReady (Microsoft), FairPlay (Apple): ๊ฐ ํ”Œ๋žซํผ์šฉ DRM ์‹œ์Šคํ…œ.
    • AES-128 Encryption: HLS์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ์ฝ˜ํ…์ธ  ์•”ํ˜ธํ™” ํ‘œ์ค€.

    7. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ„์„

    • Mux, Conviva, Bitmovin Analytics: ์‚ฌ์šฉ์ž ๊ฒฝํ—˜, ๋ฒ„ํผ๋ง, ์‹œ์ฒญ ํ–‰๋™ ๋ถ„์„ ๋“ฑ ์ œ๊ณต.
    • Prometheus + Grafana: ์„œ๋ฒ„ ์ธก ์ŠคํŠธ๋ฆฌ๋ฐ ์„ฑ๋Šฅ ๋ฐ ์ง€ํ‘œ ๋ชจ๋‹ˆํ„ฐ๋ง.

    Created Sun, 18 May 2025 20:20:45 +0900
  • MySQL์—์„œ Slow Query(์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ) ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•๋“ค์ž…๋‹ˆ๋‹ค:


    1. ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ๋กœ๊ทธ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

    ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด MySQL ์„ค์ •์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐฉ๋ฒ• 1: my.cnf ๋˜๋Š” my.ini ํŒŒ์ผ ์ˆ˜์ •

    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 1
    log_queries_not_using_indexes = 1
    
    • slow_query_log: ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ๋กœ๊ทธ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”
    • slow_query_log_file: ๋กœ๊ทธ ํŒŒ์ผ ์œ„์น˜
    • long_query_time: ๋ช‡ ์ดˆ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋А๋ฆฐ ์ฟผ๋ฆฌ๋กœ ๊ฐ„์ฃผํ• ์ง€ ์„ค์ • (์ดˆ ๋‹จ์œ„)
    • log_queries_not_using_indexes: ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ๋„ ๋กœ๊ทธ์— ๊ธฐ๋ก

    ์„ค์ • ํ›„ MySQL์„ ์žฌ์‹œ์ž‘ํ•ด์•ผ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

    Created Tue, 13 May 2025 20:20:45 +0900
  • temperature์™€ top-p(๋˜๋Š” nucleus sampling)๋Š” ์ž์—ฐ์–ด ์ƒ์„ฑ ๋ชจ๋ธ์ด ์ถœ๋ ฅํ•  ๋‹จ์–ด๋ฅผ ์„ ํƒํ•  ๋•Œ์˜ ๋žœ๋ค์„ฑ ์กฐ์ ˆ ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋…์€ ์œ ์‚ฌํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ ์ž‘๋™ ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์•„๋ž˜์— ๊ฐ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


    ๐Ÿ”ฅ Temperature: “์„ ํƒ์˜ ํ™•๋ฅ ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์กฐ์ •”

    ๊ฐœ๋…

    • temperature๋Š” ๋ชจ๋ธ์ด ๋‹ค์Œ ๋‹จ์–ด๋ฅผ ์„ ํƒํ•  ๋•Œ์˜ ํ™•๋ฅ  ๋ถ„ํฌ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ‰ํƒ„ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ 1.0์ด๋ฉฐ, ์ด ๊ฐ’์„ ๋‚ฎ์ถ”๋ฉด ๋” ๊ฒฐ์ •๋ก ์ (deterministic), **๋†’์ด๋ฉด ๋” ์ฐฝ์˜์ (random)**์ด ๋ฉ๋‹ˆ๋‹ค.

    ์ž‘๋™ ๋ฐฉ์‹

    • ๋ชจ๋ธ์ด ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด์— ๋Œ€ํ•ด logit(์ ์ˆ˜)์„ ๋ถ€์—ฌํ•œ ํ›„ softmax ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ™•๋ฅ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    Created Tue, 13 May 2025 18:20:45 +0900
  • CQRS (Command Query Responsibility Segregation)๋Š” **๋ช…๋ น(Command)**๊ณผ **์กฐํšŒ(Query)**์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์˜ ๋ชจ๋ธ์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


    ๐Ÿ”น ํ•ต์‹ฌ ๊ฐœ๋…

    1. Command (๋ช…๋ น)

      • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์š”์ฒญ (์˜ˆ: ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ)
      • ์˜ˆ: createUser(), updateOrderStatus()
    2. Query (์กฐํšŒ)

      • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์š”์ฒญ (๋‹จ์ˆœํžˆ ์ฝ๊ธฐ๋งŒ ํ•จ, ๋ณ€๊ฒฝ X)
      • ์˜ˆ: getUserById(), getOrderListByUser()
    3. ์ฑ…์ž„ ๋ถ„๋ฆฌ

      • ์“ฐ๊ธฐ ๋ชจ๋ธ(Command Model): ๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํฌํ•จ
      • ์ฝ๊ธฐ ๋ชจ๋ธ(Query Model): ์ฃผ๋กœ DTO๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ „์šฉ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง (์˜ˆ: denormalized view)

    ๐Ÿ”น ์ „ํ†ต์ ์ธ CRUD ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ 

    ํ•ญ๋ชฉ ์ „ํ†ต์  CRUD CQRS
    ๋ชจ๋ธ ๊ณต์œ  ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋™์ผํ•œ ๋ชจ๋ธ ์‚ฌ์šฉ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๋ชจ๋ธ ๋ถ„๋ฆฌ
    ํ™•์žฅ์„ฑ ์ œํ•œ์  ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ฐ๊ฐ ํ™•์žฅ ๊ฐ€๋Šฅ
    ๋ณต์žก๋„ ๋‚ฎ์Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์Œ
    ์„ฑ๋Šฅ ์ตœ์ ํ™” ์–ด๋ ต๋‹ค ์ฝ๊ธฐ์— ์ตœ์ ํ™”๋œ ๊ตฌ์กฐ ๊ฐ€๋Šฅ

    ๐Ÿ”น ์‚ฌ์šฉ ์˜ˆ์‹œ

    • ์ด์ปค๋จธ์Šค ์‹œ์Šคํ…œ: ์ฃผ๋ฌธ์€ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋งŽ๊ณ , ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ๋Š” ๋น ๋ฅธ ์‘๋‹ต์ด ์ค‘์š”ํ•  ๋•Œ
    • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค: ์„œ๋น„์Šค๋ณ„ ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ฅผ ํ•  ๋•Œ Command/Query ๋ชจ๋ธ์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ

    ๐Ÿ”น ์žฅ์ 

    • ํ™•์žฅ์„ฑ ํ–ฅ์ƒ: ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ
    • ์„ฑ๋Šฅ ์ตœ์ ํ™” ์šฉ์ด: ์กฐํšŒ ์ „์šฉ ๋ชจ๋ธ์„ ์บ์‹œ๋‚˜ ๋น„์ •๊ทœํ™”๋œ DB๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
    • ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ๋‹จ์ˆœํ™”: Command ๋ชจ๋ธ์—๋งŒ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๊ทœ์น™์„ ์ ์šฉ ๊ฐ€๋Šฅ

    ๐Ÿ”น ๋‹จ์ 

    • ๋ณต์žก๋„ ์ฆ๊ฐ€: ์ฝ”๋“œ ๊ตฌ์กฐ์™€ ์šด์˜ ํ™˜๊ฒฝ์ด ๋ณต์žกํ•ด์ง
    • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ฒ˜๋ฆฌ ํ•„์š”: Command/Query ๋ชจ๋ธ ๊ฐ„ ๋™๊ธฐํ™” ํ•„์š” (์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๋“ฑ)
    • ๋Ÿฌ๋‹ ์ปค๋ธŒ: ๋„์ž… ์‹œ ๊ฐœ๋ฐœ์ž์˜ ์ดํ•ด๋„ ์š”๊ตฌ

    ๐Ÿ”น CQRS์™€ Event Sourcing์˜ ์กฐํ•ฉ

    CQRS๋Š” ์ข…์ข… Event Sourcing๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    Created Fri, 09 May 2025 09:20:45 +0900
  • @Transactional ์–ด๋…ธํ…Œ์ด์…˜์€ Java์—์„œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•ต์‹ฌ ์ˆ˜๋‹จ์œผ๋กœ, springframework.transaction.annotation.Transactional๊ณผ jakarta.transaction.Transactional์€ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:


    1. ํŒจํ‚ค์ง€ ์ถœ์ฒ˜

    ํ•ญ๋ชฉ Spring ์–ด๋…ธํ…Œ์ด์…˜ Jakarta ์–ด๋…ธํ…Œ์ด์…˜
    ์–ด๋…ธํ…Œ์ด์…˜ ๊ฒฝ๋กœ org.springframework.transaction.annotation.Transactional jakarta.transaction.Transactional
    ์†Œ์† Spring Framework Jakarta EE (๊ตฌ Java EE)
    API ๋ ˆ๋ฒจ Spring ์ „์šฉ ๊ธฐ๋Šฅ Java ํ‘œ์ค€ ์‚ฌ์–‘ (JSR-907 ๋“ฑ) ๊ธฐ๋ฐ˜

    2. ์ ์šฉ ๋Œ€์ƒ์˜ ์ฐจ์ด

    • Spring @Transactional

      • Spring AOP ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘.
      • ํ”„๋ก์‹œ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌ.
      • Spring Data JPA, Spring JDBC, MyBatis ๋“ฑ ๋‹ค์–‘ํ•œ Spring ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ๋จ.
      • ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅ: propagation, isolation, timeout, rollbackFor, readOnly ๋“ฑ ์†์„ฑ ๋‹ค์–‘.
    • Jakarta @Transactional

    Created Thu, 01 May 2025 23:40:45 +0900