{"id":706028,"date":"2026-05-08T13:58:22","date_gmt":"2026-05-08T12:58:22","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=ai&#038;p=706028"},"modified":"2026-05-08T14:00:02","modified_gmt":"2026-05-08T13:00:02","slug":"our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides","status":"publish","type":"ai","link":"https:\/\/blog.jetbrains.com\/ko\/ai\/2026\/05\/our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides\/","title":{"rendered":"JetBrains\uc758 2026\ub144 \ubc29\ud5a5\uc131: JetBrains IDE \ub0b4 AI\uc640 \uae30\uc874 \uc6cc\ud06c\ud50c\ub85c"},"content":{"rendered":"\n<p><strong>\ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294 \ub450 \uac00\uc9c0 \uc720\ud6a8\ud55c \ubc29\uc2dd. \uadf8 \ubaa8\ub4e0 \uac8c \uac00\ub2a5\ud55c \ud558\ub098\uc758 \uacf5\uac04.<\/strong><\/p>\n\n\n\n<div class=\"jb-quick-controls\" data-jb-quick-controls>\n  <p>\n    <strong>AI \ub274\uc2a4\uc5d0 \ud53c\ub85c\uac10\uc744 \ub290\ub07c\ub294 \ubd84\ub4e4\uc744 \uc704\ud55c \uc694\uc57d:<\/strong>\n    <button type=\"button\" class=\"jb-quick-toggle\" aria-pressed=\"false\">\uc5ec\uae30\ub97c \ub204\ub974\uc138\uc694<\/button>\n    <span class=\"jb-quick-status\" aria-live=\"polite\"><\/span>\n  <\/p>\n<\/div>\n\n<style>\n  .jb-quick-controls {\n    display: none;\n    margin: 0 0 1em;\n  }\n\n  .jb-quick-controls.jb-quick-ready {\n    display: block;\n  }\n\n  .jb-quick-controls p {\n    margin: 0 0 1em;\n  }\n\n  .jb-quick-controls button {\n    -webkit-appearance: none;\n    appearance: none;\n    border: 0;\n    background: none;\n    padding: 0;\n    margin: 0 0 0 .25em;\n    color: inherit;\n    font: inherit;\n    cursor: pointer;\n    text-decoration: underline;\n    text-underline-offset: .12em;\n  }\n\n  .jb-quick-controls .jb-quick-toggle {\n    position: relative;\n    display: inline-block;\n    color: #6B57FF;\n    text-decoration: none;\n    box-shadow: inset 0 -1px 0 currentColor;\n  }\n\n  .jb-quick-controls .jb-quick-toggle:hover {\n    box-shadow: inset 0 -2px 0 currentColor;\n  }\n\n  .jb-quick-controls[data-jb-mode=\"short\"] .jb-quick-toggle {\n    color: #19191C;\n    background-image: none;\n    -webkit-text-fill-color: currentColor;\n    box-shadow: inset 0 -1px 0 currentColor;\n    animation: none;\n  }\n\n  .jb-quick-controls[data-jb-mode=\"short\"] .jb-quick-toggle::after {\n    display: none;\n  }\n\n  .jb-quick-controls button:focus {\n    outline: 2px solid currentColor;\n    outline-offset: 2px;\n  }\n\n  .jb-quick-controls .jb-quick-status {\n    margin-left: .5em;\n    opacity: .7;\n    font-size: .95em;\n  }\n\n  .jb-quick-hide {\n    overflow: hidden;\n  }\n\n  .jb-matrix-host {\n    position: fixed;\n    left: 0;\n    top: 0;\n    width: 0;\n    height: 0;\n    overflow: visible;\n    pointer-events: none;\n    z-index: 2147483000;\n  }\n\n  .jb-matrix-wrap {\n    position: fixed;\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n    overflow: visible;\n    pointer-events: none;\n    z-index: 1;\n    color: inherit;\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0);\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    contain: layout style paint;\n  }\n\n  .jb-matrix-wrap > * {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .jb-matrix-wrap.jb-matrix-active {\n    animation-name: jbMatrixBlockOut;\n    animation-duration: 980ms;\n    animation-timing-function: cubic-bezier(.2, .72, .22, 1);\n    animation-fill-mode: forwards;\n  }\n\n  @keyframes jbMatrixBlockOut {\n    0% {\n      opacity: 1;\n      transform: translate3d(0, 0, 0);\n    }\n    35% {\n      opacity: .94;\n      transform: translate3d(0, 0, 0);\n    }\n    72% {\n      opacity: .74;\n      transform: translate3d(0, 4px, 0);\n    }\n    100% {\n      opacity: 0;\n      transform: translate3d(0, 14px, 0);\n    }\n  }\n\n  @keyframes jbQuickGradientShift {\n    0% {\n      background-position: 0% 50%;\n    }\n\n    50% {\n      background-position: 100% 50%;\n    }\n\n    100% {\n      background-position: 0% 50%;\n    }\n  }\n\n  @supports ((-webkit-background-clip: text) or (background-clip: text)) {\n    .jb-quick-controls .jb-quick-toggle {\n      background-image: linear-gradient(90deg, #6B57FF 0%, #00A3FF 28%, #39CC8F 55%, #FF7A00 78%, #6B57FF 100%);\n      background-size: 260% 100%;\n      background-position: 0% 50%;\n      -webkit-background-clip: text;\n      background-clip: text;\n      -webkit-text-fill-color: transparent;\n      box-shadow: none;\n      animation: jbQuickGradientShift 9s ease-in-out infinite;\n    }\n\n    .jb-quick-controls .jb-quick-toggle::after {\n      content: '';\n      position: absolute;\n      left: 0;\n      right: 0;\n      bottom: .05em;\n      height: 1px;\n      background-image: linear-gradient(90deg, #6B57FF 0%, #00A3FF 28%, #39CC8F 55%, #FF7A00 78%, #6B57FF 100%);\n      background-size: 260% 100%;\n      background-position: 0% 50%;\n      animation: jbQuickGradientShift 9s ease-in-out infinite;\n      opacity: .95;\n    }\n\n    .jb-quick-controls .jb-quick-toggle:hover::after {\n      height: 2px;\n    }\n  }\n<\/style>\n\n<script>\n(function () {\n  function ready(fn) {\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', fn);\n    } else {\n      fn();\n    }\n  }\n\n  function toArray(list) {\n    if (list) {\n      return Array.prototype.slice.call(list);\n    }\n    return [];\n  }\n\n  function findAncestorByClass(node, className) {\n    while (node) {\n      if (node === document.body) {\n        break;\n      }\n\n      if (node.classList) {\n        if (node.classList.contains(className)) {\n          return node;\n        }\n      }\n\n      node = node.parentNode;\n    }\n\n    return null;\n  }\n\n  function isSupported() {\n    if (!document.querySelector) {\n      return false;\n    }\n\n    if (!document.addEventListener) {\n      return false;\n    }\n\n    if (!window.requestAnimationFrame) {\n      return false;\n    }\n\n    if (!window.getComputedStyle) {\n      return false;\n    }\n\n    if (!document.body) {\n      return false;\n    }\n\n    var styleProbe = document.createElement('span').style;\n    var hasTransform = false;\n    var hasAnimation = false;\n\n    if (typeof styleProbe.transform !== 'undefined') {\n      hasTransform = true;\n    } else {\n      if (typeof styleProbe.webkitTransform !== 'undefined') {\n        hasTransform = true;\n      }\n    }\n\n    if (typeof styleProbe.animationName !== 'undefined') {\n      hasAnimation = true;\n    } else {\n      if (typeof styleProbe.webkitAnimationName !== 'undefined') {\n        hasAnimation = true;\n      }\n    }\n\n    if (!hasTransform) {\n      return false;\n    }\n\n    if (!hasAnimation) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function prefersReducedMotion() {\n    var result = false;\n\n    try {\n      if (window.matchMedia) {\n        result = !!window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      }\n    } catch (error) {\n      result = false;\n    }\n\n    return result;\n  }\n\n  function isRectOnScreen(rect) {\n    if (rect.bottom <= -40) {\n      return false;\n    }\n\n    if (rect.top >= window.innerHeight + 40) {\n      return false;\n    }\n\n    if (rect.right <= -40) {\n      return false;\n    }\n\n    if (rect.left >= window.innerWidth + 40) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function removeUiNoise(node) {\n    if (!node) {\n      return;\n    }\n\n    if (node.nodeType !== 1) {\n      return;\n    }\n\n    if (node.removeAttribute) {\n      node.removeAttribute('id');\n      node.removeAttribute('aria-describedby');\n      node.removeAttribute('aria-labelledby');\n    }\n\n    var selectors = [\n      'script',\n      'style',\n      'noscript',\n      'button',\n      '.copy-button',\n      '.sr-only',\n      '[aria-hidden=\"true\"]'\n    ];\n\n    var i;\n    for (i = 0; i < selectors.length; i += 1) {\n      var matches = node.querySelectorAll(selectors[i]);\n      var j;\n\n      for (j = matches.length - 1; j >= 0; j -= 1) {\n        var currentMatch = matches[j];\n\n        if (currentMatch) {\n          if (currentMatch.parentNode) {\n            currentMatch.parentNode.removeChild(currentMatch);\n          }\n        }\n      }\n    }\n\n    var descendants = node.getElementsByTagName('*');\n    for (i = 0; i < descendants.length; i += 1) {\n      descendants[i].removeAttribute('id');\n      descendants[i].removeAttribute('aria-describedby');\n      descendants[i].removeAttribute('aria-labelledby');\n    }\n  }\n\n  function copyBoxTextStyle(source, target) {\n    var computed = window.getComputedStyle(source);\n    var props = [\n      'fontFamily',\n      'fontSize',\n      'fontStyle',\n      'fontWeight',\n      'lineHeight',\n      'letterSpacing',\n      'textAlign',\n      'textTransform',\n      'color',\n      'paddingTop',\n      'paddingRight',\n      'paddingBottom',\n      'paddingLeft',\n      'listStyleType',\n      'listStylePosition'\n    ];\n    var i;\n\n    for (i = 0; i < props.length; i += 1) {\n      try {\n        target.style[props[i]] = computed[props[i]];\n      } catch (error) {}\n    }\n\n    target.style.marginTop = '0px';\n    target.style.marginBottom = '0px';\n  }\n\n  function cleanText(text) {\n    var value = text ? text : '';\n    value = value.replace(\/Copy heading link\/g, ' ');\n    value = value.replace(\/\\s+\/g, ' ');\n    value = value.replace(\/^\\s+\/, '');\n    value = value.replace(\/\\s+$\/, '');\n    return value;\n  }\n\n  function shouldSkipTextWalkElement(node) {\n    if (!node) {\n      return true;\n    }\n\n    if (node.nodeType !== 1) {\n      return false;\n    }\n\n    var tag = node.tagName;\n    if (tag === 'SCRIPT') {\n      return true;\n    }\n    if (tag === 'STYLE') {\n      return true;\n    }\n    if (tag === 'NOSCRIPT') {\n      return true;\n    }\n    if (tag === 'BUTTON') {\n      return true;\n    }\n\n    return false;\n  }\n\n  function collectTextNodes(root, maxCharacters) {\n    var items = [];\n    var total = 0;\n\n    function walk(node) {\n      if (total >= maxCharacters) {\n        return;\n      }\n\n      if (!node) {\n        return;\n      }\n\n      if (node.nodeType === 3) {\n        var value = node.nodeValue;\n        if (value) {\n          if (\/\\S\/.test(value)) {\n            items.push({ node: node, original: value });\n            total += value.length;\n          }\n        }\n        return;\n      }\n\n      if (shouldSkipTextWalkElement(node)) {\n        return;\n      }\n\n      var child = node.firstChild;\n      while (child) {\n        walk(child);\n        if (total >= maxCharacters) {\n          break;\n        }\n        child = child.nextSibling;\n      }\n    }\n\n    walk(root);\n    return items;\n  }\n\n  function scrambleValue(value, progress) {\n    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#%*+-\/=';\n    var keepRatio = progress * progress;\n    var output = '';\n    var i;\n\n    for (i = 0; i < value.length; i += 1) {\n      var ch = value.charAt(i);\n\n      if (\/\\s\/.test(ch)) {\n        output += ch;\n      } else {\n        if (Math.random() < keepRatio) {\n          output += ch;\n        } else {\n          output += chars.charAt(Math.floor(Math.random() * chars.length));\n        }\n      }\n    }\n\n    return output;\n  }\n\n  function runMatrixTextPass(root) {\n    var items = collectTextNodes(root, 1400);\n    var startTime = 0;\n    var duration = 680;\n    var lastUpdate = 0;\n\n    function tick(now) {\n      var i;\n\n      if (!startTime) {\n        startTime = now;\n      }\n\n      var elapsed = now - startTime;\n      var progress = elapsed \/ duration;\n\n      if (progress > 1) {\n        progress = 1;\n      }\n\n      if (now - lastUpdate > 36) {\n        lastUpdate = now;\n        for (i = 0; i < items.length; i += 1) {\n          items[i].node.nodeValue = scrambleValue(items[i].original, progress);\n        }\n      }\n\n      if (progress < 1) {\n        if (root.parentNode) {\n          requestAnimationFrame(tick);\n        }\n      } else {\n        for (i = 0; i < items.length; i += 1) {\n          items[i].node.nodeValue = items[i].original;\n        }\n      }\n    }\n\n    requestAnimationFrame(tick);\n  }\n\n  function buildFixedCloneFromElement(element, host) {\n    var rect = element.getBoundingClientRect();\n\n    if (!isRectOnScreen(rect)) {\n      return null;\n    }\n\n    if (rect.width < 12) {\n      return null;\n    }\n\n    if (rect.height < 8) {\n      return null;\n    }\n\n    var wrapper = document.createElement('div');\n    wrapper.className = 'jb-matrix-wrap';\n    wrapper._jbSourceElement = element;\n    wrapper.setAttribute('aria-hidden', 'true');\n    wrapper.style.left = rect.left + 'px';\n    wrapper.style.top = rect.top + 'px';\n    wrapper.style.width = rect.width + 'px';\n    wrapper.style.minHeight = rect.height + 'px';\n\n    var computed = window.getComputedStyle(element);\n    wrapper.style.color = computed.color;\n\n    var clone = element.cloneNode(true);\n    removeUiNoise(clone);\n    copyBoxTextStyle(element, clone);\n\n    wrapper.appendChild(clone);\n    host.appendChild(wrapper);\n\n    return wrapper;\n  }\n\n  function shouldUseIntroCandidate(candidate, controls) {\n    if (!candidate) {\n      return false;\n    }\n\n    if (controls.contains(candidate)) {\n      return false;\n    }\n\n    if (findAncestorByClass(candidate, 'jb-quick-hide')) {\n      return false;\n    }\n\n    if (findAncestorByClass(candidate, 'author-post')) {\n      return false;\n    }\n\n    if (findAncestorByClass(candidate, 'content__row')) {\n      return false;\n    }\n\n    if (findAncestorByClass(candidate, 'content__form')) {\n      return false;\n    }\n\n    if (findAncestorByClass(candidate, 'form-subscribe')) {\n      return false;\n    }\n\n    var text = cleanText(candidate.textContent);\n    if (text.length < 8) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function collectIntroCandidates(contentRoot, controls) {\n    var result = [];\n    var candidates = contentRoot.querySelectorAll('h1, p, ol, ul');\n    var started = false;\n    var i;\n\n    for (i = 0; i < candidates.length; i += 1) {\n      var candidate = candidates[i];\n\n      if (!shouldUseIntroCandidate(candidate, controls)) {\n        continue;\n      }\n\n      var candidateText = cleanText(candidate.textContent);\n      var tagName = candidate.tagName ? candidate.tagName.toUpperCase() : '';\n\n      if (!started) {\n        if (tagName === 'H1') {\n          started = true;\n        } else {\n          if (candidateText.indexOf('Two valid ways of writing code') !== -1) {\n            started = true;\n          } else {\n            if (candidateText.indexOf('There are two ways developers create code now') !== -1) {\n              started = true;\n            }\n          }\n        }\n      }\n\n      if (!started) {\n        continue;\n      }\n\n      result.push(candidate);\n\n      if (candidateText.indexOf('Either way, one thing') !== -1) {\n        break;\n      }\n    }\n\n    return result;\n  }\n\n  function buildFallbackIntroClones(introCandidates, host, controls) {\n    var wrappers = [];\n    var controlRect = controls.getBoundingClientRect();\n    var top = controlRect.bottom + 18;\n    var i;\n\n    if (top < 24) {\n      top = 24;\n    }\n\n    if (top > window.innerHeight - 160) {\n      top = Math.max(24, window.innerHeight - 260);\n    }\n\n    for (i = 0; i < introCandidates.length; i += 1) {\n      var candidate = introCandidates[i];\n      var candidateText = cleanText(candidate.textContent);\n      var tagName = candidate.tagName ? candidate.tagName.toUpperCase() : '';\n\n      if (tagName === 'H1') {\n        continue;\n      }\n\n      if (controls.contains(candidate)) {\n        continue;\n      }\n\n      var rect = candidate.getBoundingClientRect();\n      if (rect.width < 12) {\n        continue;\n      }\n      if (rect.height < 8) {\n        continue;\n      }\n\n      var wrapper = document.createElement('div');\n      wrapper.className = 'jb-matrix-wrap';\n      wrapper._jbSourceElement = null;\n      wrapper.setAttribute('aria-hidden', 'true');\n      wrapper.style.left = rect.left + 'px';\n      wrapper.style.top = top + 'px';\n      wrapper.style.width = rect.width + 'px';\n      wrapper.style.minHeight = rect.height + 'px';\n\n      var computed = window.getComputedStyle(candidate);\n      wrapper.style.color = computed.color;\n\n      var clone = candidate.cloneNode(true);\n      removeUiNoise(clone);\n      copyBoxTextStyle(candidate, clone);\n\n      wrapper.appendChild(clone);\n      host.appendChild(wrapper);\n      wrappers.push(wrapper);\n\n      top += rect.height + 16;\n\n      if (candidateText.indexOf('Either way, one thing') !== -1) {\n        break;\n      }\n\n      if (wrappers.length >= 6) {\n        break;\n      }\n\n      if (top > window.innerHeight - 16) {\n        break;\n      }\n    }\n\n    return wrappers;\n  }\n\n  function buildIntroClones(contentRoot, controls, host) {\n    var wrappers = [];\n    var introCandidates = collectIntroCandidates(contentRoot, controls);\n    var i;\n\n    for (i = 0; i < introCandidates.length; i += 1) {\n      var candidate = introCandidates[i];\n      var rect = candidate.getBoundingClientRect();\n\n      if (!isRectOnScreen(rect)) {\n        continue;\n      }\n\n      var wrapper = buildFixedCloneFromElement(candidate, host);\n      if (wrapper) {\n        wrappers.push(wrapper);\n      }\n    }\n\n    if (!wrappers.length) {\n      wrappers = buildFallbackIntroClones(introCandidates, host, controls);\n    }\n\n    return wrappers;\n  }\n\n  function sourceIsHiddenSection(source) {\n    if (!source) {\n      return false;\n    }\n\n    if (source.classList) {\n      if (source.classList.contains('jb-quick-hide')) {\n        return true;\n      }\n    }\n\n    if (findAncestorByClass(source, 'jb-quick-hide')) {\n      return true;\n    }\n\n    return false;\n  }\n\n  function collectSourcesFromWrappers(wrappers) {\n    var sources = [];\n    var i;\n\n    for (i = 0; i < wrappers.length; i += 1) {\n      var wrapper = wrappers[i];\n      var source = wrapper ? wrapper._jbSourceElement : null;\n\n      if (!source) {\n        continue;\n      }\n\n      var alreadyAdded = false;\n      var j;\n      for (j = 0; j < sources.length; j += 1) {\n        if (sources[j] === source) {\n          alreadyAdded = true;\n          break;\n        }\n      }\n\n      if (!alreadyAdded) {\n        sources.push(source);\n      }\n    }\n\n    return sources;\n  }\n\n  function rememberSourceOpacity(source) {\n    if (!source) {\n      return;\n    }\n\n    if (source._jbQuickOpacityMemory) {\n      return;\n    }\n\n    source._jbQuickOpacityMemory = {\n      opacity: source.style.opacity,\n      transition: source.style.transition,\n      webkitTransition: source.style.webkitTransition\n    };\n  }\n\n  function fadeSourcesToZero(wrappers) {\n    var sources = collectSourcesFromWrappers(wrappers);\n    var i;\n\n    for (i = 0; i < sources.length; i += 1) {\n      rememberSourceOpacity(sources[i]);\n      sources[i].style.webkitTransition = 'opacity 460ms cubic-bezier(.22, 1, .36, 1)';\n      sources[i].style.transition = 'opacity 460ms cubic-bezier(.22, 1, .36, 1)';\n    }\n\n    requestAnimationFrame(function () {\n      var j;\n      for (j = 0; j < sources.length; j += 1) {\n        sources[j].style.opacity = '0';\n      }\n    });\n  }\n\n  function restoreSourcesFromZero(wrappers) {\n    var sources = collectSourcesFromWrappers(wrappers);\n    var i;\n\n    for (i = 0; i < sources.length; i += 1) {\n      var source = sources[i];\n      if (sourceIsHiddenSection(source)) {\n        continue;\n      }\n\n      rememberSourceOpacity(source);\n      source.style.webkitTransition = 'opacity 420ms cubic-bezier(.22, 1, .36, 1)';\n      source.style.transition = 'opacity 420ms cubic-bezier(.22, 1, .36, 1)';\n      source.style.opacity = '1';\n    }\n\n    window.setTimeout(function () {\n      var j;\n      for (j = 0; j < sources.length; j += 1) {\n        var current = sources[j];\n        var memory = current ? current._jbQuickOpacityMemory : null;\n\n        if (!memory) {\n          continue;\n        }\n\n        if (sourceIsHiddenSection(current)) {\n          continue;\n        }\n\n        current.style.opacity = memory.opacity;\n        current.style.transition = memory.transition;\n        current.style.webkitTransition = memory.webkitTransition;\n        current._jbQuickOpacityMemory = null;\n      }\n    }, 460);\n  }\n\n  function animateWrapper(wrapper) {\n    if (wrapper.classList) {\n      wrapper.classList.add('jb-matrix-active');\n    } else {\n      wrapper.className += ' jb-matrix-active';\n    }\n\n    runMatrixTextPass(wrapper);\n    return 1020;\n  }\n\n  function setTocVisibility(section, visible) {\n    var toc = document.querySelector('.js-toc');\n    if (!toc) {\n      return;\n    }\n\n    var headings = section.querySelectorAll('h1, h2, h3, h4, h5, h6');\n    var links = toc.querySelectorAll('a');\n    var i;\n\n    for (i = 0; i < headings.length; i += 1) {\n      var heading = headings[i];\n      if (!heading.id) {\n        continue;\n      }\n\n      var j;\n      for (j = 0; j < links.length; j += 1) {\n        var href = links[j].getAttribute('href') ? links[j].getAttribute('href') : '';\n        if (href.indexOf('#' + heading.id) !== -1) {\n          var item = findAncestorByClass(links[j], 'toc-list-item');\n          if (!item) {\n            item = links[j].parentNode;\n          }\n          if (item) {\n            item.style.display = visible ? '' : 'none';\n          }\n        }\n      }\n    }\n  }\n\n  function collapseSection(section, immediate) {\n    var computedStyle = window.getComputedStyle(section);\n\n    section.setAttribute('data-jb-height', section.offsetHeight);\n    section.setAttribute('data-jb-margin-top', computedStyle.marginTop);\n    section.setAttribute('data-jb-margin-bottom', computedStyle.marginBottom);\n\n    section.style.height = section.offsetHeight + 'px';\n    section.style.marginTop = computedStyle.marginTop;\n    section.style.marginBottom = computedStyle.marginBottom;\n    if (section.style.opacity === '0') {\n      section.style.opacity = '0';\n    } else {\n      section.style.opacity = '1';\n    }\n    section.style.visibility = 'hidden';\n    section.style.pointerEvents = 'none';\n    section.style.overflow = 'hidden';\n\n    if (immediate) {\n      section.style.height = '0px';\n      section.style.marginTop = '0px';\n      section.style.marginBottom = '0px';\n      section.style.opacity = '0';\n      return;\n    }\n\n    section.style.webkitTransition = 'height 460ms ease, margin 460ms ease, opacity 220ms ease';\n    section.style.transition = 'height 460ms ease, margin 460ms ease, opacity 220ms ease';\n\n    requestAnimationFrame(function () {\n      section.style.height = '0px';\n      section.style.marginTop = '0px';\n      section.style.marginBottom = '0px';\n      section.style.opacity = '0';\n    });\n  }\n\n  function expandSection(section, immediate) {\n    var targetHeight = section.getAttribute('data-jb-height') ? section.getAttribute('data-jb-height') : section.scrollHeight;\n    var targetMarginTop = section.getAttribute('data-jb-margin-top') ? section.getAttribute('data-jb-margin-top') : '';\n    var targetMarginBottom = section.getAttribute('data-jb-margin-bottom') ? section.getAttribute('data-jb-margin-bottom') : '';\n\n    section.style.display = '';\n    section.style.overflow = 'hidden';\n    section.style.pointerEvents = 'none';\n    section.style.visibility = '';\n\n    if (immediate) {\n      section.style.height = '';\n      section.style.marginTop = '';\n      section.style.marginBottom = '';\n      section.style.opacity = '';\n      section.style.visibility = '';\n      section.style.pointerEvents = '';\n      section.style.overflow = '';\n      section.style.webkitTransition = '';\n      section.style.transition = '';\n      section._jbQuickOpacityMemory = null;\n      return;\n    }\n\n    section.style.height = '0px';\n    section.style.marginTop = '0px';\n    section.style.marginBottom = '0px';\n    section.style.opacity = '0';\n    section.style.webkitTransition = 'height 460ms ease, margin 460ms ease, opacity 260ms ease';\n    section.style.transition = 'height 460ms ease, margin 460ms ease, opacity 260ms ease';\n\n    requestAnimationFrame(function () {\n      section.style.height = targetHeight + 'px';\n      section.style.marginTop = targetMarginTop;\n      section.style.marginBottom = targetMarginBottom;\n      section.style.opacity = '1';\n    });\n\n    window.setTimeout(function () {\n      section.style.height = '';\n      section.style.marginTop = '';\n      section.style.marginBottom = '';\n      section.style.opacity = '';\n      section.style.visibility = '';\n      section.style.pointerEvents = '';\n      section.style.overflow = '';\n      section.style.webkitTransition = '';\n      section.style.transition = '';\n      section._jbQuickOpacityMemory = null;\n    }, 520);\n  }\n\n  ready(function () {\n    var controls = document.querySelector('[data-jb-quick-controls]');\n    if (!controls) {\n      return;\n    }\n\n    if (!isSupported()) {\n      controls.style.display = 'none';\n      return;\n    }\n\n    var toggleButton = controls.querySelector('.jb-quick-toggle');\n    var status = controls.querySelector('.jb-quick-status');\n    var sections = toArray(document.querySelectorAll('.jb-quick-hide'));\n\n    if (!toggleButton) {\n      controls.style.display = 'none';\n      return;\n    }\n\n    if (!status) {\n      controls.style.display = 'none';\n      return;\n    }\n\n    if (!sections.length) {\n      controls.style.display = 'none';\n      return;\n    }\n\n    var contentRoot = findAncestorByClass(controls, 'js-toc-content');\n    if (!contentRoot) {\n      contentRoot = findAncestorByClass(controls, 'content');\n    }\n    if (!contentRoot) {\n      contentRoot = document.body;\n    }\n\n    var overlayHost = contentRoot.querySelector('.jb-matrix-host');\n    if (!overlayHost) {\n      overlayHost = document.createElement('div');\n      overlayHost.className = 'jb-matrix-host';\n      overlayHost.setAttribute('aria-hidden', 'true');\n      contentRoot.appendChild(overlayHost);\n    }\n\n    if (controls.classList) {\n      controls.classList.add('jb-quick-ready');\n    } else {\n      controls.className += ' jb-quick-ready';\n    }\n\n    controls.setAttribute('data-jb-mode', 'full');\n\n    var shortModeOn = false;\n    var busy = false;\n    var reduceMotion = prefersReducedMotion();\n\n    function runVisibleMatrixPass() {\n      var pass = { wrappers: [], longestAnimation: 0 };\n      var i;\n\n      if (reduceMotion) {\n        return pass;\n      }\n\n      pass.wrappers = buildIntroClones(contentRoot, controls, overlayHost);\n\n      if (pass.wrappers.length) {\n        fadeSourcesToZero(pass.wrappers);\n      }\n\n      for (i = 0; i < pass.wrappers.length; i += 1) {\n        var animationTime = animateWrapper(pass.wrappers[i]);\n        if (animationTime > pass.longestAnimation) {\n          pass.longestAnimation = animationTime;\n        }\n      }\n\n      return pass;\n    }\n\n    function cleanupMatrixPass(wrappers) {\n      var i;\n\n      restoreSourcesFromZero(wrappers);\n\n      for (i = 0; i < wrappers.length; i += 1) {\n        var currentWrapper = wrappers[i];\n        if (currentWrapper) {\n          if (currentWrapper.parentNode) {\n            currentWrapper.parentNode.removeChild(currentWrapper);\n          }\n        }\n      }\n    }\n\n    function hideMode() {\n      if (busy) {\n        return;\n      }\n\n      if (shortModeOn) {\n        return;\n      }\n\n      busy = true;\n      status.textContent = '';\n\n      var wrappers = [];\n      var i;\n      var longestAnimation = 0;\n\n      if (!reduceMotion) {\n        for (i = 0; i < sections.length; i += 1) {\n          setTocVisibility(sections[i], false);\n\n          var sectionWrapper = buildFixedCloneFromElement(sections[i], overlayHost);\n          if (sectionWrapper) {\n            wrappers.push(sectionWrapper);\n          }\n        }\n\n        if (!wrappers.length) {\n          wrappers = buildIntroClones(contentRoot, controls, overlayHost);\n        }\n\n        if (wrappers.length) {\n          fadeSourcesToZero(wrappers);\n        }\n\n        for (i = 0; i < wrappers.length; i += 1) {\n          var animationTime = animateWrapper(wrappers[i]);\n          if (animationTime > longestAnimation) {\n            longestAnimation = animationTime;\n          }\n        }\n      } else {\n        for (i = 0; i < sections.length; i += 1) {\n          setTocVisibility(sections[i], false);\n        }\n      }\n\n      var collapseDelay = longestAnimation + 40;\n      if (collapseDelay < 180) {\n        collapseDelay = 180;\n      }\n\n      window.setTimeout(function () {\n        var j;\n        for (j = 0; j < sections.length; j += 1) {\n          collapseSection(sections[j], reduceMotion);\n        }\n      }, reduceMotion ? 0 : collapseDelay);\n\n      var cleanupDelay = longestAnimation + 90;\n      if (cleanupDelay < 900) {\n        cleanupDelay = 900;\n      }\n\n      window.setTimeout(function () {\n        cleanupMatrixPass(wrappers);\n\n        shortModeOn = true;\n        busy = false;\n        controls.setAttribute('data-jb-mode', 'short');\n        toggleButton.textContent = '\uc6d0\ubb38\uc73c\ub85c \ub3cc\uc544\uac00\uae30';\n        toggleButton.setAttribute('aria-pressed', 'true');\n        status.textContent = '\uc694\uc57d \uc0dd\uc131 \uc644\ub8cc.';\n      }, reduceMotion ? 40 : cleanupDelay);\n    }\n\n    function showMode() {\n      if (busy) {\n        return;\n      }\n\n      if (!shortModeOn) {\n        return;\n      }\n\n      busy = true;\n      status.textContent = '';\n\n      var matrixPass = runVisibleMatrixPass();\n      var expandDelay = matrixPass.longestAnimation ? 160 : 0;\n\n      window.setTimeout(function () {\n        var i;\n        for (i = 0; i < sections.length; i += 1) {\n          setTocVisibility(sections[i], true);\n          expandSection(sections[i], reduceMotion);\n        }\n      }, reduceMotion ? 0 : expandDelay);\n\n      var cleanupDelay = matrixPass.longestAnimation + 90;\n      if (cleanupDelay < 900) {\n        cleanupDelay = 900;\n      }\n\n      window.setTimeout(function () {\n        cleanupMatrixPass(matrixPass.wrappers);\n\n        shortModeOn = false;\n        busy = false;\n        controls.setAttribute('data-jb-mode', 'full');\n        toggleButton.textContent = '\uc5ec\uae30\ub97c \ub204\ub974\uc138\uc694';\n        toggleButton.setAttribute('aria-pressed', 'false');\n        status.textContent = '\uc6d0\ubb38\uc73c\ub85c \ubcf5\uadc0.';\n      }, reduceMotion ? 40 : cleanupDelay);\n    }\n\n    toggleButton.addEventListener('click', function () {\n      if (shortModeOn) {\n        showMode();\n      } else {\n        hideMode();\n      }\n    });\n  });\n}());\n<\/script>\n\n\n\n<p>\uc624\ub298\ub0a0 \uac1c\ubc1c\uc790\ub294 \ub450 \uac00\uc9c0 \ubc29\uc2dd\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ol>\n<li>\uae30\uc874 \ubc29\uc2dd: \uc9c1\uc811 \uc785\ub825\ud558\uace0, \ub9ac\ud329\ud130\ub9c1\ud558\uba70, \ub514\ubc84\uadf8\ud558\uc5ec \ucf54\ub4dc\uc758 \uc758\ub3c4\ub97c \ud55c\uc904 \ud55c\uc904 \uc644\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc0c8\ub85c\uc6b4 \ubc29\uc2dd: AI\uc640 \ud611\uc5c5\ud558\uc5ec \uc790\ub3d9 \uc644\uc131\uc744 \uc0ac\uc6a9\ud558\uac70\ub098 \uc804\uccb4 \uc791\uc5c5\uc758 \ucd08\uc548\uc744 \uc791\uc131\ud558\ub294 \uc5d0\uc774\uc804\ud2b8\ub97c \ud65c\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p><strong>\ub450 \ubc29\uc2dd \uac04 \uc6b0\uc5f4\uc740 \uc5c6\uc2b5\ub2c8\ub2e4.<\/strong><\/p>\n\n\n\n<p>\ub530\ub77c\uc11c JetBrains\ub294 <strong>\ub450 \ubc29\uc2dd\uc744 JetBrains IDE \ub0b4\uc5d0 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uacf5\uc874<\/strong>\uc2dc\ud0a4\ub294 \uac83\uc744 \ubaa9\ud45c\ub85c \ud569\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \uc774\ub7ec\ud55c \uacf5\uc874\uc740 \ub2e4\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul>\n<li>\uc0ac\uc6a9\uc790\uac00 \uc9c1\uc811 \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \ub54c IDE\ub294 \ucf54\ub4dc \uc791\uc131\uc744 \uc911\uc2ec\uc73c\ub85c \uc2e4\ud589\ub418\uace0 AI\ub294 \ud575\uc2ec \ucf54\ub529 \uacbd\ud5d8\uc744 \ubc29\ud574\ud558\uc9c0 \uc54a\uc544\uc57c \ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>AI\ub85c \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uac70\ub098 \uc5d0\uc774\uc804\ud2b8\uc5d0 \uc791\uc5c5\uc744 \uc704\uc784\ud558\ub824\uba74 IDE\ub294 UX\uc640 \uae30\ub2a5 \uce21\uba74\uc5d0\uc11c \uc790\uc5f0\uc2a4\ub7fd\uace0 \uac15\ub825\ud55c \uacbd\ud5d8\uc744 \uc81c\uacf5\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p>\uc5b4\ub290 \ucabd\uc744 \ud0dd\ud558\ub4e0 \ubcc0\ud558\uc9c0 \uc54a\ub294 \ud55c \uac00\uc9c0 \uc0ac\uc2e4\uc740 <strong>\ucd5c\uc885 \ucf54\ub4dc\uc5d0 \ub300\ud55c \ucc45\uc784\uc740 \ud56d\uc0c1 \uac1c\ubc1c\uc790\uc5d0\uac8c \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. <\/strong>\uadf8\ub9ac\uace0 \uadf8 \ucf54\ub4dc\ub97c \uc77d\uace0 \uc774\ud574\ud558\uba70 \uc18c\uc720\ud558\ub294 \uc791\uc5c5\uc740 \uc5ec\uc804\ud788 IDE \uc911\uc2ec\uc73c\ub85c \uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-group jb-quick-hide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group__inner-container\"><hr class=\"wp-block-separator has-alpha-channel-opacity\">\n<h2 class=\"wp-block-heading\"><strong>\uacfc\uc7a5 \uc5c6\uc774 \ubcf4\ub294 'IDE \ub0b4 AI'\uc758 \uc758\ubbf8<\/strong><\/h2>\n<p>JetBrains\ub294 IDE \ub0b4 AI\ub97c \ud558\ub098\uc758 '\uacf5\uc2dd' \uc791\uc5c5 \ubc29\uc2dd\uc73c\ub85c \uad6d\ud55c\ud558\uc9c0 \uc54a\uc73c\ub824 \ud569\ub2c8\ub2e4. \uc2dc\uc7a5\uc740 \ube60\ub974\uac8c \uc9c4\ud654\ud558\uace0 \uc788\uc73c\uba70, \uac1c\ubc1c\uc790 \ub610\ud55c \ud558\ub098\uc758 \ubc29\uc2dd\uc73c\ub85c \ubb36\uc744 \uc218 \uc5c6\uc744 \ub9cc\ud07c \ub2e4\uc591\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2f9\uc0ac\uc5d0\uc11c \ub9d0\ud558\ub294 'JetBrains IDE \ub0b4 AI'\ub780 \uc5d0\uc774\uc804\ud2f1 \ubd80\uac00 \uac00\uce58, \uc989 \ud544\uc694\ud560 \ub54c\ub9c8\ub2e4 \ud65c\uc6a9 \uac00\ub2a5\ud55c UX \ubc0f \uae30\ub2a5\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><em>AI Chat(AI \ucc44\ud305)<\/em> \ub3c4\uad6c \ucc3d\uc5d0\uc11c\ub294 <strong>\ucc44\ud305 \uc911\uc2ec<\/strong> \ubc29\uc2dd\uc73c\ub85c \uc791\uc5c5\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>IDE<\/strong> <strong>\ud130\ubbf8\ub110<\/strong>\uc5d0\uc11c\ub294 \uae30\uc874 CLI \uc6cc\ud06c\ud50c\ub85c\ub97c \uadf8\ub300\ub85c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uc5d0\uc774\uc804\ud2f1 \uc2dc\uc2a4\ud15c\uc744 \uc704\ud574 \uc124\uacc4\ub41c \uc0c8\ub85c\uc6b4 <strong>\uc635\ud2b8\uc778 \ubaa8\ub4dc<\/strong>\uc5d0\uc11c\ub294 \uc5d0\uc774\uc804\ud2b8\ub97c \uc2e4\ud589\ud558\uace0 \uba87 \uc2dc\uac04 \ub3d9\uc548 \uc791\uc5c5\uc744 \ub9e1\uae38 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc989, \ud558\ub098\uc758 IDE \uc548\uc5d0\uc11c AI\ub97c \ud65c\uc6a9\ud574 \uc77c\uc744 \ub05d\ub0b4\ub294 \uc5ec\ub7ec \uac00\uc9c0 \ubc29\uc2dd\uc774 \uacf5\uc874\ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \uc120\ud0dd\ud558\uace0, \ud300\uc774 \ub2e4\ub4ec\uc73c\uba70, \uc2e4\uc81c \uac1c\ubc1c \ud604\uc7a5\uc758 \uae30\ub300\uc640 \uae30\uc900 \uc548\uc5d0\uc11c \uc791\ub3d9\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group jb-quick-hide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group__inner-container\"><hr class=\"wp-block-separator has-alpha-channel-opacity\">\n<h2 class=\"wp-block-heading\"><strong>AI \uc804\ub7b5: \ubca4\ub354 \uc885\uc18d\uc131 \ubc29\uc9c0 \ubc0f \uc6cc\ud06c\ud50c\ub85c \ud638\ud658\uc131 \uc720\uc9c0<\/strong><\/h2>\n<p>\ud55c \uac00\uc9c0 \ubd84\uba85\ud55c \uc0ac\uc2e4\uc740 \ud604\uc7ac '\ucd5c\uace0'\ub85c \ud3c9\uac00\ub418\ub294 \ubaa8\ub378\uc774\ub098 \uacf5\uae09\uc790, \uc5d0\uc774\uc804\ud2b8\uac00 \uc601\uc6d0\ud788 \ucd5c\uace0\uc758 \uc790\ub9ac\ub97c \uc9c0\ud0a4\uc9c0\ub294 \ubabb\ud558\uba70, \ub2f9\uc7a5 \ub2e4\uc74c \ub2ec\uc5d0\ub3c4 \uc21c\uc704\uac00 \ubc14\ub014 \uc218 \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7f0 \uc774\uc720\ub85c \ud2b9\uc815 \ubca4\ub354\uc758 \ub85c\ub4dc\ub9f5\uc5d0 <strong>\uc758\uc874\ud558\uc9c0 \uc54a\ub294<\/strong> IDE \uacbd\ud5d8\uc744 \uc758\ub3c4\uc801\uc73c\ub85c \uad6c\ucd95\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc2e4\uc81c\ub85c \uc774\ub294 AI \ucc44\ud305 \ud658\uacbd\uc5d0\uc11c \uacf5\uae09\uc790\uc758 \uc815\ucc45\uacfc \uc0ac\uc6a9\uc790\uc758 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub530\ub978 \ub2e4\uc591\ud55c \uc5f0\uacb0 \ubc29\uc2dd\uc744 \uc9c0\uc6d0\ud558\ub294 \uac83\uc73c\ub85c \uc774\uc5b4\uc9d1\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>JetBrains AI \uad00\ub9ac\ud615 \uc124\uc815<\/strong>(JetBrains AI \uad6c\ub3c5 \uc0ac\uc6a9 \uc2dc)<\/li>\n<li><strong>BYOK<\/strong>: \uc790\uccb4 API \ud0a4 \uc0ac\uc6a9<\/li>\n<li><strong>OAuth \ub85c\uadf8\uc778<\/strong>: \uc9c0\uc6d0\ub418\ub294 \uacf5\uae09\uc790 \uacc4\uc815\uc6a9(\uacf5\uae09\uc790\uac00 \uc9c0\uc6d0\ud558\ub294 \uacbd\uc6b0)<\/li>\n<li><strong>ACP \uc5d0\uc774\uc804\ud2b8<\/strong>: \ud45c\uc900 \ud504\ub85c\ud1a0\ucf5c\uc744 \ud1b5\ud574 \uc678\ubd80 \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8 \uc5f0\uacb0<\/li>\n<\/ul>\n<p>\uc8fc\uc758\ud560 \uc0ac\ud56d\uc740 <strong>OAuth\uac00 \ud56d\uc0c1 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc778\uc99d \ubc29\uc2dd\uc740 \uc544\ub2c8\ub77c\ub294 \uac83\uc785\ub2c8\ub2e4.<\/strong> \uc5d0\uc774\uc804\ud2b8 \uacf5\uae09\uc790\uac00 OAuth\ub97c \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uac70\ub098 IDE\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubc29\uc2dd\uc73c\ub85c \uc81c\uacf5\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0, \uc774\ub97c \uc784\uc758\ub85c \uad6c\ud604\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group jb-quick-hide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group__inner-container\"><hr class=\"wp-block-separator has-alpha-channel-opacity\">\n<h2 class=\"wp-block-heading\">\uc5d0\uc774\uc804\ud2b8 \ud074\ub77c\uc774\uc5b8\ud2b8 \ud504\ub85c\ud1a0\ucf5c(ACP): '\uc790\uccb4 \uc5d0\uc774\uc804\ud2b8 \uc0ac\uc6a9'<\/h2>\n<p>ACP\ub294 \ud45c\uc900 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud1b5\ud574 \uc678\ubd80 \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\ub97c JetBrains IDE\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\uba70, \uc5d0\uc774\uc804\ud2b8\ubcc4 \ub9de\ucda4\ud615 \ud1b5\ud569\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc5d0\uc774\uc804\ud2b8\ub294 \uc5c4\uc120\ub41c <a href=\"https:\/\/github.com\/agentclientprotocol\/registry\" target=\"_blank\" rel=\"noopener\">\ub808\uc9c0\uc2a4\ud2b8\ub9ac<\/a>\uc5d0\uc11c \uc124\uce58\ud558\uac70\ub098 \uc218\ub3d9\uc73c\ub85c \uad6c\uc131\ud560 \uc218 \uc788\uc73c\uba70, \uc124\uce58\ub41c \uc5d0\uc774\uc804\ud2b8\ub294 AI \ucc44\ud305 \ub0b4\ubd80\uc5d0 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc0ac\uc6a9\uc790 \uc694\uccad\uc774 \ub9ce\uc558\ub358 \ub300\ud45c\uc801\uc778 \uc608\ub294 <strong>Cursor \uc5d0\uc774\uc804\ud2b8<\/strong>\uc785\ub2c8\ub2e4. Cursor\ub294 \uc774\ubbf8 ACP\ub97c \ud1b5\ud574 JetBrains IDE \ub0b4\uc5d0\uc11c AI \uc5d0\uc774\uc804\ud2b8\ub85c \uc81c\uacf5\ub418\ubbc0\ub85c, \uc5d0\uc774\uc804\ud2b8 \uc120\ud0dd\uae30\uc5d0\uc11c \uc120\ud0dd\ud574 \ud574\ub2f9 \uc5d0\uc774\uc804\ud2f1 \uc6cc\ud06c\ud50c\ub85c\ub97c IDE \ub0b4\uc5d0\uc11c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>JetBrains\uac00 \uae30\ub300\ud558\ub294 \ubaa8\uc2b5\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc0ac\uc6a9\uc790\ub294 \uc790\uc2e0\uc758 \uc6cc\ud06c\ud50c\ub85c\ub098 \ud300\uc5d0 \uc801\ud569\ud55c \uc5d0\uc774\uc804\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4.<\/li>\n<li>\uae30\uc874\uc5d0 \uc0ac\uc6a9\ud558\ub358 IDE \ud658\uacbd\uc744 \uadf8\ub300\ub85c \uc720\uc9c0\ud569\ub2c8\ub2e4.<\/li>\n<li>\uae30\uc874 IDE \uc911\uc2ec \uc6cc\ud06c\ud50c\ub85c\ub294 '\uc5d0\uc774\uc804\ud2b8 \ubaa8\ub4dc'\ub85c \ub300\uccb4\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group jb-quick-hide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group__inner-container\"><hr class=\"wp-block-separator has-alpha-channel-opacity\">\n<h2 class=\"wp-block-heading\"><strong>\ub354 \ud070 \ucc45\uc784\uc744 \uc694\uad6c\ud558\ub294 'AI \uae30\ubc18 \uc804\ubb38 \ucf54\ub529'<\/strong><\/h2>\n<p>JetBrains\ub294 AI\ub97c \ubc18\ub300\ud558\uc9c0 \uc54a\uc9c0\ub9cc \ud63c\ub780\uc740 \uc9c0\uc591\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc77c\ud68c\uc131 \uc0b0\ucd9c\ubb3c\uc5d0 \ucd5c\uc801\ud654\ub41c \ucf54\ub529 \ubc29\uc2dd\ub3c4 \uc788\uc73c\uba70, \uc774\ub294 \uc0c1\ud669\uc5d0 \ub530\ub77c \ucda9\ubd84\ud788 \uc720\ud6a8\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 JetBrains IDE\ub294 \uc77c\ud68c\uc6a9\uc774 \uc544\ub2cc, \uc7a5\uae30\uc801\uc73c\ub85c \uc0ac\uc6a9\ub420 \ucf54\ub4dc\ub97c \uc704\ud574 \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc124\uacc4 \uc6d0\uce59\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <strong>\uc0dd\uc131\ub41c \ucf54\ub4dc\ub97c \ub300\uc0c1\uc73c\ub85c \uc2e4\uc81c \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud558\uac8c <\/strong>\ub2e4\uc74c \uc791\uc5c5\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ucf54\ub4dc \uc77d\uae30<\/li>\n<li>\ucf54\ub4dc \uac80\ud1a0<\/li>\n<li>\ucf54\ub4dc \ubcc0\uacbd<\/li>\n<li>\uc624\ub958 \ubc1c\uc0dd \uc2dc \ub864\ubc31<\/li>\n<li>\ucf54\ub4dc\ubca0\uc774\uc2a4\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5 \uc774\ud574<\/li>\n<\/ul>\n<p>\uae30\ubcf8\uc801\uc778 \uae30\ub300 \uc0ac\ud56d\uc740 \ud3c9\ubc94\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ubcc0\uacbd \uc0ac\ud56d\uc740 <strong>\uac00\uc2dc\uc801<\/strong>\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ubcc0\uacbd \uc0ac\ud56d\uc740 <strong>\uac00\uc5ed\uc801<\/strong>\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\ud504\ub85c\uc81d\ud2b8\ub294 \uc190\uc0c1\ub41c \uc0c1\ud0dc\ub85c \ub0a8\uc544\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4('red code\uac00 \uc5c6\ub294 \uc0c1\ud0dc'\uc5ec\uc57c \uc791\uc5c5\uc744 \uc2dc\uc791\ud560 \uc218 \uc788\uc74c).<\/li>\n<\/ul>\n<p>\uc5d0\uc774\uc804\ud2b8\ub294 \uc5ec\ub7ec \ud30c\uc77c\uc744 \ud3b8\uc9d1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uac15\ub825\ud55c \uae30\ub2a5\uc774 \ub420 \uc218 \uc788\uc9c0\ub9cc, \uc0ac\uc6a9\uc790\uac00 \uacb0\uacfc\ub97c \uc644\uc804\ud788 \uac80\ud1a0\ud558\uace0 \uc774\ud574\ud558\uba70 \uc218\uc815\ud560 \uc218 \uc788\uc744 \ub54c\ub9cc \uadf8\ub807\uc2b5\ub2c8\ub2e4. \uc774\uac83\uc774 IDE\uac00 \uc911\uc694\ud55c \uc774\uc720\uc785\ub2c8\ub2e4. \uc0ac\ub78c\uc774 \uc0dd\uc131\ud588\ub4e0 AI\uac00 \uc0dd\uc131\ud588\ub4e0 \uc0dd\uc131\ub41c \ucf54\ub4dc\uc5d0 \ub300\ud574 \uac00\uc2dc\uc131\uacfc \uc81c\uc5b4 \uad8c\ud55c\uc744 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc81c\uacf5\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">AI \ud65c\uc6a9 \ubc29\uc2dd\uc740 \uc0ac\uc6a9\uc790 \uc120\ud0dd: \ub2f9\uc0ac\uc758 \uc81c\ud488 \uc6d0\uce59<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. AI\uc640 \uae30\uc874 \ubaa8\ub4dc \uacf5\uc874<\/h3>\n\n\n\n<p>\uc785\ub825 \uc911\uc2ec \uc6cc\ud06c\ud50c\ub85c\uc640 AI \uc911\uc2ec \uc6cc\ud06c\ud50c\ub85c \ubaa8\ub450 \uc720\ud6a8\ud569\ub2c8\ub2e4. JetBrains\ub294 \uac1c\ubc1c\uc790\ub97c \ub300\uccb4\ud558\uae30 \uc704\ud574 \uc124\uacc4\ud558\uc9c0 \uc54a\uc73c\uba70, \ud558\ub098\uc758 '\uc815\uc2dd' \uc6cc\ud06c\ud50c\ub85c\ub85c \uc0ac\uc6a9\uc790\ub97c \uc720\ub3c4\ud558\ub294 IDE\ub97c \uc124\uacc4\ud558\uc9c0\ub3c4 \uc54a\uc2b5\ub2c8\ub2e4. \ub450 \ubc29\uc2dd \ubaa8\ub450\ub97c \uc874\uc911\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. AI \uc5d0\uc774\uc804\ud2b8\ub294 IDE\uc758 \ud575\uc2ec \uac00\uce58\ub97c \uc874\uc911\ud574\uc57c \ud568<\/h3>\n\n\n\n<p>\uc5d0\uc774\uc804\ud2b8\ub97c \uc704\ud55c \ubaa8\ub4e0 \ubc1c\uc804\uc740 IDE\uc758 \ud575\uc2ec \uac00\uce58\uc778 \uae4a\uc774 \uc788\ub294 \ucf54\ub4dc \uc778\ud154\ub9ac\uc804\uc2a4, \uc548\uc804\ud55c \ub9ac\ud329\ud130\ub9c1, \ub514\ubc84\uadf8, \ud0d0\uc0c9, \uac80\uc0ac, \uac80\ud1a0 \ub4f1 \uc804\ubb38 \uac1c\ubc1c\uc758 \uad6c\uc131 \uc694\uc18c\ub97c \uc720\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-group jb-quick-hide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group__inner-container\">\n<h3 class=\"wp-block-heading\">3. \ubca4\ub354 \uc885\uc18d\uc131 \uc5c6\uc74c<\/h3>\n<p>\ub2e4\uc591\ud55c \ud65c\uc131\ud654 \uacbd\ub85c(\uad6c\ub3c5, BYOK, OAuth(\uac00\ub2a5\ud55c \uacbd\uc6b0), ACP \uc5d0\uc774\uc804\ud2b8)\ub294 '\uc788\uc73c\uba74 \uc88b\uc740 \uac83'\uc774 \uc544\ub2d9\ub2c8\ub2e4. JetBrains\ub294 \uc0ac\uc6a9\uc790\uc758 \uc6cc\ud06c\ud50c\ub85c\uac00 \ud2b9\uc815 \ubca4\ub354\uc5d0 \uc885\uc18d\ub418\uc9c0 \uc54a\ub3c4\ub85d \ubcf4\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">4. \uacfc\uc7a5\ubcf4\ub2e4 \uc7a5\uae30\uc801 \ud6a8\uc6a9<\/h3>\n<p>\uba87 \uc8fc \ud6c4\uc5d0\ub3c4 \uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc774 \uc6cc\ud06c\ud50c\ub85c\ub97c \uacc4\uc18d \uc0ac\uc6a9\ud55c\ub2e4\uba74(\uc2e4\uc81c \uc720\uc9c0\uc728, \uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8), \uadf8\uac83\uc774 \uc2e0\ud638\uc785\ub2c8\ub2e4. \uc9c0\uae08\uc758 \ub9ce\uc740 AI \uc6cc\ud06c\ud50c\ub85c\ub294 \uacfc\uc7a5\uc5d0 \uac00\uae5d\uc2b5\ub2c8\ub2e4(\ub784\ud504 \ub8e8\ud504\ub3c4 \ud55c \uc608\uc785\ub2c8\ub2e4).<\/p>\n<h3 class=\"wp-block-heading\">5. \uc194\uc9c1\ud55c \ucee4\ubba4\ub2c8\ud2f0 \ud53c\ub4dc\ubc31 \uc6b0\uc120<\/h3>\n<p>JetBrains\ub294 Reddit \uc0ac\uc6a9\uc790, Marketplace \ub9ac\ubdf0\uc5b4, \uac00\uac10 \uc5c6\uc774 \uc758\uacac\uc744 \uc804\ub2ec\ud558\ub294 \ucee4\ubba4\ub2c8\ud2f0 \uad6c\uc131\uc6d0\uc758 \ubaa9\uc18c\ub9ac\ub97c \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud569\ub2c8\ub2e4. \ubc14\ub85c \uadf8\ub7f0 \uc0ac\uc6a9\uc790\ub4e4\uc774 \ub2f9\uc0ac\uc758 \uc131\uacfc\ub97c \ud3c9\uac00\ud574 \uc8fc\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>AI\ub294 \ub9ce\uc740 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uac8c \ub420 \uac83\uc785\ub2c8\ub2e4. \uc774\ub294 \ub354 \uc774\uc0c1 \uc608\uce21\uc774 \uc544\ub2c8\ub77c 2026\ub144 4\uc6d4\uc758 \ud604\uc2e4\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub7ec\ub098 \ucf54\ub4dc\uc5d0 \ub300\ud55c \ucc45\uc784\uc740 \uc5ec\uc804\ud788 \uc0ac\ub78c\uc5d0\uac8c \uc788\uc2b5\ub2c8\ub2e4. \ucf54\ub4dc\ub97c \ubcd1\ud569\ud558\uae30 \uc804\uc5d0 \ub204\uad70\uac00\ub294 \ubc18\ub4dc\uc2dc \ucf54\ub4dc\ub97c \uc77d\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc5d0\uc774\uc804\ud2b8\ub294 \uc18d\ub3c4\ub97c \ub192\uc5ec\uc8fc\uc9c0\ub9cc, \uc704\ud5d8\uc744 \ucc45\uc784\uc838 \uc8fc\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>JetBrains\uac00 \ub4dc\ub9ac\ub294 \uc57d\uc18d\uc740 \uba85\ud655\ud569\ub2c8\ub2e4:<\/p>\n\n\n\n<p><strong>\ucf54\ub4dc \uc0dd\uc131 \uc18d\ub3c4\ub97c \ud5a5\uc0c1\ud558\ub294 AI \uc6cc\ud06c\ud50c\ub85c\ub97c \uc9c0\uc18d\uc801\uc73c\ub85c \uac1c\ubc1c\ud558\ub294 \ub3d9\uc2dc\uc5d0, \uc0b0\ucd9c\ubb3c\uc5d0 \ub300\ud55c \uac80\ud1a0, \uc774\ud574, \uc18c\uc720\uac00 \uac00\ub2a5\ud55c \ud575\uc2ec \ud658\uacbd\uc73c\ub85c\uc11c IDE\ub97c \uacc4\uc18d \ubc1c\uc804\uc2dc\ucf1c \ub098\uac08 \uac83\uc785\ub2c8\ub2e4.<\/strong><\/p>\n\n\n\n<p>\uc5ec\ub7ec\ubd84\uc740 AI \ud65c\uc6a9 \uc218\uc900\uc744 \uacb0\uc815\ud558\uc138\uc694. JetBrains\ub294 AI \uc9c0\uc6d0 \ubc29\uc2dd\uacfc \uae30\uc874 \ubc29\uc2dd\uc774 \ud568\uaed8 \uc6d0\ud65c\ud788 \uc791\ub3d9\ud558\ub3c4\ub85d \ubcf4\uc7a5\ud558\uc5ec \uc5ec\ub7ec\ubd84\uc774 \uc6d0\ud558\ub294 \ubc29\uc2dd\uc744 \uacc4\uc18d \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/10\/IMG_6963-e1759851102680-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Denis Shiryaev\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Denis Shiryaev<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1191,"featured_media":706078,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[8168],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai\/706028"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/ai"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/1191"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=706028"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai\/706028\/revisions"}],"predecessor-version":[{"id":706113,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai\/706028\/revisions\/706113"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/706078"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=706028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=706028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=706028"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=706028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}