Amazon Q?
Amazon Q는 소프트웨어 개발을 가속화하고 기업의 내부 데이터 활용 능력이 가장 뛰어난 생성형 AI 기반 도우미입니다.

Q에는 아래와 같은 각각 기능에 특화되어 분리된 제품을 제공됩니다.
- Q Business : 기업용 생성형 AI 기반 어시스턴트
- Q Developer : 소프트웨어 개발을 위한 AI 코딩 어시스턴트
- Amazon Q in QuickSight : BI 대시보드 구축, 시각화 생성, 복잡한 계산을 자연어로 수행하고, AI 기반 인사이트 요약 및 데이터 스토리를 제공하는 생성형 BI 도우미
- Amazon Q in Connect : 콜센터 에이전트에게 실시간 고객 대화를 분석하여 적절한 응답과 조치를 추천하고 관련 회사 콘텐츠를 제공하는 AI 기반 고객 서비스 지원 도구
- Amazon Q in Supply Chain : 급망 관리자들이 자연어로 공급망 상황을 질문하고 지능적인 답변을 얻으며, 다양한 시나리오를 탐색할 수 있게 해주는 AI 기반 공급망 분석 도구
본 글에서는 Q Developer에 대해서 탐구해보도록 하겠습니다.
Q Developer ?
Q Developer는 이름에서 알 수 있는 것 처럼 개발자를 위해 특화된 서비스입니다.(유사한 서비스로는 Copilot이 있습니다.)
Q Developer를 IDE와 통합하여 사용하면 개발 생산성을 높일 수 있습니다.
IDE 내에서 코드에 대해 채팅(질의/응답), 새로운 코드를 생성, 보안 취약점을 스캔, 특정 언어의 버젼 업그레이드 등 개발에서 필요한 전반적인 스킬에 대해 도움을 주는 도구입니다.
25년 01월 기준 지원되는 IDE는 아래와 같습니다.
- Visual Studio Code
- JetBrains
- AWS Toolkit for Visual Studio
- Eclipse(Preview)
프리티어 / Pro
Q Developer는 프리티어, Pro(유료, 사용자당 월 19$) 두가지로 제공됩니다.
Pro에서는 프리티어에서 제공되는 모든 기능을 포함하여 제공하며, 일부 기능들에 대해서는 Limit이 더 높아 사용에 용이합니다.
가장 크게 기능적으로 차이를 보이는 것은 아래와 같습니다.
- Customization(사용자 지정) : 팀의 내부 라이브러리, 독점 알고리즘 기술 및 엔터프라이즈 코드 스타일을 준수하는 방식으로 소프트웨어 개발을 지원

- Management(대시보드, 사용자 관리) : 서비스를 사용하는 방법에 대한 유용한 데이터가 요약, Identity Center를 통한 사용자 관리

자세한 비용과 기능 비교는 https://aws.amazon.com/ko/q/developer/pricing/ 에서 확인 가능합니다.
Q Developer 기능 살펴보기
* 본 글에서는 Q Developer를 설치하는 방법에 대해서는 다루지 않으며, Pro 기준으로 사용하기 때문에 프리티어와는 차이가 있을 수 있습니다.기능을 살펴보기위한 환경은 VScode(IDE)로 구성하였습니다.
VScode에 Q Developer Extensions을 설치하고 나면 아래와 같이 사용준비가 되며, 채팅 명령으로는 5가지에 대한 기능을 제공합니다.
- /transform : 전체 프로젝트의 코드 언어 버전을 업데이트
- /dev : Amazon Q를 사용하여 기능 개발을 위한 구현 계획 가져오기
- /test : Amazon Q를 사용해 코드에 대한 단위 테스트 생성
- /review : 보안 취약성 및 코드 품질 문제를 검토
- /doc : 코드를 이해하고 코드에 README 생성 및 업데이트
- /clear : 현재 대화를 지우고 이전 대화 컨텍스트 제거
- /help : Amazon Q의 가능한 작업, 불가능한 작업, 예시 질문, 빠른 명령 개요 확인

채팅을 통한 기능 이외에도 인라인 제안도 아래와 같이 제공됩니다.


직접 코드 블록을 설정하고 우클릭을 통해 원하는 부분을 바로 채팅에 기능으로 전달할 수 있습니다.

지원되는 언어로는 많이 사용되는 java, python을 지원하며, SAP에서 사용되는 ABAP도 지원하며,
상세한 지원 언어 목록은 https://github.com/aws/aws-toolkit-vscode/blob/master/packages/core/src/shared/filetypes.ts 에서 확인 할 수 있습니다.
Q Developer 사용해보기
제공되는 몇가지 기능에 대해서 VSCode내에서 간단하게 사용하는 예시를 알아보도록 하겠습니다./dev 기능
코드를 생성하거나, 업데이트, 최적화 등 어플리케이션을 구축하는데 도움이 될 수 있습니다.아래는 /Dev를 통해 10개의 난수를 발생시키고, 선택 정렬을 실행하는 C 코드 결과입니다.
- /dev "write a C code to randomly generate 10 numbers and sort them in ascending order."

- 명령에 따라 바뀌게 될 내용에 대해서 요약하여 답변을 알려줍니다.

- 결과로 파일이 이미 있는데 해당 파일의 내용을 바꿀것인지에 묻는 답변입니다.

- 파일 명 옆에 체크표시를 누르거나, 답변 제일 마지막에 "Accept all changes"를 누르면 아래와 같이 적용됩니다.

- 위에서 만들어진 C언어 코드를, Python으로 언어를 변경하고 파일 확장자명도 바꾸는 명령을 실행해보도록 하겠습니다.
- /dev "Please change the current code from C language to Python and also change the file extension to .py."

- 동일하게 변경되는 사항들에 대한 답변을 알려주며, 채택(Accept)할지를 확인합니다.

- Accept하게 되면, 기존 파일은 삭제가 된것처럼 되며, 새로운 확장자를 가진 "selection_sort.py"에 Python으로 만들어진 동일한 코드가 생성됩니다.
- 화면 하단에 터미널창에서 처럼 정상적으로 난수 발생 후 정렬하는 정상동작 하는 코드로 변경이 되는것을 확인할 수 있습니다.

/Review 기능
Q Developer의 코드 문제를 검출할때는 CVSS를 고려하여 심각도를 계산하고, Critical ~ Low 등급으로 나눠서 표시해 줍니다.
아래는 취약점이 다수 존재하는 예시 Python 코드입니다.
import os
import sqlite3
from flask import Flask, request, jsonify
app = Flask(__name__)
# CVSS 기준: 기밀성, 무결성 - 명령어 주입 취약점
@app.route('/execute', methods=['POST'])
def execute_command():
command = request.form.get('cmd')
os.system(command) # 사용자 입력을 검증하지 않고 실행
# CVSS 기준: 무결성 - SQL 인젝션 취약점
@app.route('/auth', methods=['POST'])
def authenticate_user():
username = request.form.get('username')
password = request.form.get('password')
conn = sqlite3.connect('data.db')
cursor = conn.cursor()
query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
cursor.execute(query) # 파라미터화된 쿼리 미사용
user = cursor.fetchone()
conn.close()
if user:
return "Authentication successful"
else:
return "Authentication failed"
# CVSS 기준: 가용성 - 파일 리소스 누수
@app.route('/download', methods=['GET'])
def download_file():
filename = request.args.get('file')
file = open(filename, 'r') # 파일 핸들러를 명시적으로 닫지 않음
content = file.read()
return content # 대용량 파일 반환으로 성능 및 가용성 문제
# CVSS 기준: 기밀성 - 민감 정보 하드코딩
@app.route('/config', methods=['GET'])
def get_config():
secret_key = "hardcoded_secret_key_1234" # 하드코딩된 민감 정보
db_password = "hardcoded_db_password"
return jsonify({"secret_key": secret_key, "db_password": db_password})
# CVSS 기준: 기밀성, 무결성 - 디렉터리 탐색 취약점
@app.route('/view', methods=['GET'])
def view_file():
filepath = request.args.get('path')
with open(filepath, 'r') as file: # 경로 검증 없이 파일 열기
content = file.read()
return content
# CVSS 기준: 무결성 - CSRF 방지 미구현
@app.route('/update', methods=['POST'])
def update_settings():
setting_name = request.form.get('setting_name')
setting_value = request.form.get('setting_value')
# CSRF 토큰 없이 상태를 업데이트
return f"Updated {setting_name} to {setting_value}"
# CVSS 기준: 기밀성, 무결성 - 인증 및 권한 부여 누락
@app.route('/admin', methods=['GET'])
def admin_panel():
return "Welcome to the admin panel!" # 인증 없이 민감한 정보에 접근 허용
Chat을 통해 /review 명령어를 타이핑 후 현재 활성화 된 파일을 대상으로 하였습니다.아래 처럼 활성화된 파일을 기준으로 리뷰를 진행하고, 문제 심각도에 대해서 요약된 답변을 알려줍니다.

chat패널이 아닌 코드 문제(CODE ISSUES)를 확인하면 더 상세한 내용을 확인 할 수 있습니다.
특정 이슈를 선택하면 어떠한 부분이 해당 이슈 인것인지 코드 파일에서 연하게 블록이 잡히는것을 확인 할 수 있습니다.
- Critical(CWE-798) : db_password = "hardcoded_db_password"

문제가 된 코드에 대해서 어떻게 수정하면 좋을지에 대한 제안을 아래와 같이 확인 할 수 있습니다.

제안된 코드를 적용할 경우 어떤것이 달라지는지 "Diff" 기능을 활용 할 수 있습니다.

해당 코드로 고치는 것을 적용시키기 위해서 직접 수정할 수도 있으며 "Accept Fix"를 누르게 되면 다음과 같이 자동으로 수정이 됩니다.


다음으로는 README와 같은 문서를 생성하는 것을 알아보도록 하겠습니다.
/Doc 기능
아래는 간단한 Bubble Sort와 실행에 걸린 시간이 출력되는 Python 코드입니다.
import random
import time
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
numbers = [random.randint(1, 10000) for _ in range(10000)]
# Measure sorting time
print("Starting sort...")
start_time = time.time()
bubble_sort(numbers)
end_time = time.time()
# Calculate and print execution time
execution_time = end_time - start_time
print(f"Time taken to sort: {execution_time:.2f} seconds")
해당 코드를 기준으로 /doc 을 실행하면 아래와 같은 화면을 확인 할 수 있습니다.
해당 제안을 확인하고 추가 변경사항이 있으면 변경을 하면되고, 여기서는 바로 "Accept"로 제안을 수락하면 다음과 같은 파일이 생성됩니다.

그 외 기능
: Customizations
Amazon Q Developer는 팀의 내부 라이브러리, 독점 알고리즘, 그리고 엔터프라이즈 코드 스타일을 반영하여 소프트웨어 개발을 지원할 수 있습니다.
Amazon Q의 사용자 지정 기능은 회사의 코드베이스를 분석하여 이를 기반으로 한 제안을 제공하며, 데이터 소스를 연결하여 개발자 스타일에 최적화된 지원을 제공합니다.
사용자 지정은 계정 내에서 완전히 분리되며, 다른 고객 데이터와도 격리됩니다. Amazon Q Developer 관리자가 권한을 부여한 사용자만 해당 사용자 지정에 접근할 수 있습니다.
아래와 같이 Customizations에서 현황("Activated, Created, Creation Failed")을 확인 할 수 있으며,
생성시에 Customization할 Source를 연결하면 됩니다.
- AWS CodeStar Connections
- S3
또한, 만들기 위해서는 해당 언어로 된 코드가 최소 10개 이상, 총 2MB 이상이 필요합니다.
현재까지 지원되는 파일 확장자는 [java, py, jsx, tsx, js, ts] 입니다.
정상적으로 Created된 Customization을 Activated로 변경한 모습입니다.
중요한 부분은 Evaluation으로 아래와 같은 의미를 갖고 있습니다.
평가 (Evaluation)
이 숫자는 Amazon Q Developer 사용자 지정의 전반적인 효과를 나타내며, 가중된 편집 유사도를 기반으로 측정됩니다. 평균적으로 모델이 얼마나 개선되었는지를 보여주는 지표입니다.
-
8–10 (매우 좋음)
AWS는 이 사용자 지정을 활성화할 것을 권장합니다. -
5–7 (보통)
코드베이스에 대해 기본 Amazon Q Developer 모델보다 약간의 개선을 제공합니다. 사용하기 전에 최적화를 시도하는 것이 좋습니다. -
1–4 (미흡)
이 사용자 지정은 효과적이지 않을 수 있습니다. 사용 전에 최적화를 고려하세요.
정상적으로 만들어진 Customizations를 적용할 사용자 또는 그룹을 지정하여 적용할 수 있습니다.

AWS Console에서 Actiaved 및 사용자 또는 그룹 할당이 완료되면, 사용하고자 하는 IDE에서 해당 Customization을 선택하여 적용할 수 있습니다.

: Console to Code
Console-to-Code는 콘솔 작업을 기록한 다음 생성형 AI를 사용하여 원하는 언어와 형식으로 코드를 제안하는 기능입니다.
아래 예시는 EC2를 만들 때 아래와 캡쳐에서 처럼 "미리보기 코드"로 만들어질 코드를 확인 가능합니다.
현재는 [EC2, VPC, RDS]에서의 작업을 기록하고 Code로 변경하는 기능을 제공합니다.
마찬가지로 해당 기능도 Q Developer에 포함되어있는 것으로 Prompt Logging 활성화 된 경우 해당 S3로 로그가 남게 됩니다.
Q Developer PRO 관리하기
* 프리티어에서는 제공되지 않는 기능이 포함 되어있습니다.
Dashboard 를 통해서 현재 활성화된 Pro 구독 현황을 확인할 수 있으며, 어떤 기능(/dev, /doc, /test 등)을 사용하고 있는지 등 활성화된 사용자를 기준으로 사용현황에 대해 확인 가능합니다.
또한 Language 별로 필터를 적용할 수 있습니다.

Dashboard는 Settings에서 Enable 가능하며, 더 상세한 내용을 확인 하기 위해서는 Prompt Logging 설정을 통해 실제 사용자가 채팅한 내역을 수집하고 확인 할 수 있습니다.

아래와 같이 설정한 S3에 실제 채팅한 내용과 누가(User ID)했는지가 저장됩니다.

해당 자료들을 수집하여 문제가 되는 채팅을 하고 있는 것은 아닌지 감사 및 모니터링을 할 수 있으며,
사용자별 어떤 질의나 기능을 많이 하게 되는지 데이터 분석을 통해 인사이트를 도출할 수 있습니다.
결론
- 생성형 AI 또는 기능이 포함된 서비스의 경우는 사용하는 사용자의 역량만큼 활용도가 결정될 것으로 생각됨.
- Q Develeloper의 아직까지 영어만 지원함.
- 사용법 자체는 어렵지는 않지만, 아직까지 모범사례 또는 예시를 찾아보는 것이 어려움.