@@ -650,6 +650,27 @@ section.closing::before {
650650 top : 330px ;
651651}
652652
653+ .closing-links {
654+ display : grid ;
655+ font-size : 26px ;
656+ gap : 8px ;
657+ left : 0 ;
658+ position : absolute ;
659+ right : 0 ;
660+ text-align : center ;
661+ top : 470px ;
662+ }
663+
664+ .closing-links a {
665+ color : #ffffff ;
666+ text-decoration : none ;
667+ }
668+
669+ .closing-links strong {
670+ display : inline-block ;
671+ margin-right : 8px ;
672+ }
673+
653674.closing-speaker {
654675 align-items : center ;
655676 bottom : 92px ;
@@ -1162,10 +1183,15 @@ AI 에이전트는 <em>내 권한으로</em>,<br>
11621183
11631184<!-- ## 데모 #1: Docker 샌드박스에서 Java 앱 현대화하기 -->
11641185## 데모 #1 : Docker 샌드박스에서 .NET 앱 현대화하기
1165- ``` bash
1186+ <!-- ```bash
11661187sbx secret set github --command 'gh auth token'
11671188sbx run --clone --name java-appmod copilot .
11681189sbx exec -it java-appmod bash
1190+ ``` -->
1191+ ``` bash
1192+ sbx secret set github --command ' gh auth token'
1193+ sbx run --clone --name dotnet-appmod copilot .
1194+ sbx exec -it dotnet-appmod bash
11691195```
11701196
11711197<div class =" flow " >
@@ -1196,10 +1222,9 @@ sbx exec -it java-appmod bash
11961222<!--
11971223발표자 노트 · 11:10–12:10 · 1분
11981224
1199- 앞 페이지의 sbx run 명령으로 진입한 GitHub Copilot CLI 화면에서 플러그인 설치를 진행합니다.
1200- 첫 번째 슬래시 명령으로 Microsoft의 GitHub Copilot modernization 마켓플레이스를 추가하고, 두 번째 슬래시 명령으로 플러그인을 설치합니다.
1201- 설치 후 Copilot CLI에서 /plugin list를 실행하면 github-copilot-modernization 플러그인을 확인할 수 있습니다.
1202- 플러그인 설치 과정의 네트워크 요청이 샌드박스 정책을 통과하는지도 함께 확인합니다.
1225+ - 플러그인 설치
1226+ - 플러그인 설치 중 관련 MCP 서버도 함께 설치
1227+ - MCP 실행 실패는 샌드박스의 환경 설정 때문인 것 보여줌
12031228-->
12041229
12051230---
@@ -1226,12 +1251,9 @@ sbx exec -it java-appmod bash
12261251<!--
12271252발표자 노트 · 12:10–13:40 · 1분 30초
12281253
1229- 샌드박스 셸에서 copilot 명령으로 GitHub Copilot CLI를 실행합니다.
1230- Copilot CLI 안에서 /agent를 실행하고 github-copilot-modernization:modernize 에이전트를 선택합니다.
1231- 이 에이전트는 요청을 Assessment, Planning, Execution의 세 단계로 오케스트레이션합니다.
1232- Assessment 단계에서는 Java 버전, 프레임워크, 의존성과 위험을 분석하고 .github/modernize/assessment에 결과를 저장합니다.
1233- Planning 단계에서는 plan.md와 tasks.json을 생성하며, Execution 단계에서는 전문 실행 에이전트가 작업을 수행하고 작업별 커밋을 남깁니다.
1234- 이 구조 덕분에 관객은 단일 프롬프트 뒤에서 어떤 단계와 산출물이 만들어지는지 확인할 수 있습니다.
1254+ - /agent 실행 후 github-copilot-modernization:modernize 선택
1255+ - 현대화 에이전트는 알아서 Assessment, Planning, Execution 단계를 진행함
1256+ - 이미 GHCP는 --allow-all 옵션을 자동으로 적용시켜 놨기 때문에 맨 마지막에 진행할까요? 정도만 남겨두고 알아서 진행함
12351257-->
12361258
12371259---
@@ -1244,12 +1266,11 @@ Planning 단계에서는 plan.md와 tasks.json을 생성하며, Execution 단계
12441266<!--
12451267발표자 노트 · 13:40–17:00 · 3분 20초
12461268
1247- modernize 에이전트를 선택한 뒤 자연어로 구체적인 목표를 전달합니다.
1248- 광범위하게 '이 애플리케이션을 현대화해 줘'라고 요청하면 진단부터 전체 파이프라인을 실행합니다.
1249- 여기서는 Java 21과 Spring Boot 4.1 업그레이드라는 구체적인 작업을 요청해 계획과 실행에 집중합니다.
1250- 자율 실행이 필요하면 Copilot CLI를 --allow-all 옵션으로 시작할 수 있지만, 샌드박스의 네트워크와 파일 경계는 외부에서 계속 적용됩니다.
1251- 완료되면 변경된 코드, 빌드 결과, 취약점 검사, 작업별 커밋과 Git hooks를 검토합니다.
1252- 시간이 지연되면 미리 녹화한 결과 화면으로 즉시 전환합니다.
1269+ - 프롬프트 실행
1270+ - 화면처럼 얘기할 수도 있고, 아예 "해줘!" 라고 해도 됨
1271+ - 여기서는 .NET 10으로 현대화 해달라고 했음
1272+ - 여기서는 Java 21과 Spring Boot 4.1로 현대화 해달라고 했음
1273+ - 시간이 오래 걸리므로 우선 여기까지 진행하는 것 보여주고 다음으로 넘어감
12531274-->
12541275
12551276---
@@ -1268,10 +1289,10 @@ modernize 에이전트를 선택한 뒤 자연어로 구체적인 목표를 전
12681289<!--
12691290발표자 노트 · 17:00–17:30 · 30초
12701291
1271- Docker 샌드박스는 개발자 로컬 워크플로에 매우 잘 맞습니다.
1272- 하지만 제품 기능으로 에이전트를 제공하거나 팀 단위로 많은 작업을 동시에 실행하려면 노트북을 운영 기반으로 사용할 수 없습니다.
1273- 이때 필요한 것은 원격 격리, 자동화 가능한 수명주기, 대규모 동시 실행입니다.
1274- ACA 샌드박스는 Docker 샌드박스의 단순한 클라우드 복사판이 아니라 이 운영 문제를 다루는 별도의 모델입니다.
1292+ - 지금까지 도커 샌드박스 안에서 GHCP CLI로 앱 현대화 하는 과정을 보여줬음
1293+ - 이번에는 팀 단위로 많은 작업을 동시에 실행시켜야 한다면? 그땐 개발자 개인 PC에 의존할 수 없음
1294+ - 이때부터는 클라우드에 올라간 샌드박스를 고려해야 함
1295+ - ACA 샌드박스가 이 문제를 해결할 수 있음
12751296-->
12761297
12771298---
@@ -1285,7 +1306,7 @@ ACA 샌드박스는 Docker 샌드박스의 단순한 클라우드 복사판이
12851306<!--
12861307발표자 노트 · 17:30–17:40 · 10초
12871308
1288- 이제 로컬 개발 환경의 격리를 넘어 팀과 서비스 규모에서 샌드박스를 운영하는 방법을 살펴봅니다.
1309+ - 로컬 개발환경 격리를 넘어, 클라우드 규모에서 샌드박스를 운영해 보쟈
12891310-->
12901311
12911312---
@@ -1306,11 +1327,11 @@ ACA 샌드박스는 Docker 샌드박스의 단순한 클라우드 복사판이
13061327<!--
13071328발표자 노트 · 17:40–19:00 · 1분 20초
13081329
1309- ACA 샌드박스는 샌드박스 그룹 아래에 생성하는 일급 Azure 리소스입니다.
1310- Portal , CLI, SDK, Bicep, Skills를 통해 샌드박스를 생성하고 관리할 수 있으며, 이 발표의 데모는 ACA CLI를 사용합니다.
1311- 각 샌드박스는 격리된 실행 환경이며 OCI 이미지를 루트 파일시스템으로 사용할 수 있습니다.
1312- 중요한 차이는 상태를 메모리와 디스크 스냅샷으로 보존한 채 suspend하고, 이후 resume할 수 있다는 점입니다.
1313- 현재 미리 보기 기능이므로 CLI와 SDK의 호환성 변경 가능성도 발표에서 분명히 밝힙니다.
1330+ - ACA 샌드박스는 컨테이너 앱 기반의 리소스임. 현재 프리뷰 상태
1331+ - 포탈 , CLI, 파이썬 SDK, Skills 등으로 샌드박스를 생성하고 관리할 수 있음
1332+ - 오늘은 ACA CLI를 사용할 거임
1333+ - 각각의 샌드박스는 격리된 실행환경이고 도커에서 제공하는 컨테이너 이미지를 루트 파일 시스템으로 사용함
1334+ - 샌드박스마다 스냅샷을 제공해서 사용하지 않을 경우에는 컨테이너를 멈추고 필요한 경우 다시 실행시킬 수 있음
13141335-->
13151336
13161337---
@@ -1327,11 +1348,10 @@ Portal, CLI, SDK, Bicep, Skills를 통해 샌드박스를 생성하고 관리할
13271348<!--
13281349발표자 노트 · 19:00–20:20 · 1분 20초
13291350
1330- ACA가 더하는 가치는 여섯 가지입니다.
1331- 빠른 시작, 수천 단위 확장, suspend와 resume, Azure 거버넌스, 네트워크 통제, 사용자 OCI 이미지입니다.
1332- 이 기능들은 단일 개발자 경험보다 서비스 운영과 멀티테넌트 실행에 초점이 있습니다.
1333- 중지 상태에서는 CPU와 메모리 비용이 발생하지 않지만, 저장된 상태나 관련 리소스 비용은 별도로 확인해야 합니다.
1334- 또한 샌드박스를 생성·관리하는 사용자에게는 Container Apps SandboxGroup Data Owner 역할이 필요합니다.
1351+ - 로컬에서 돌아가는 도커 샌드박스에 더해 이런 장점이 있음
1352+ - 빠른 시작, 스케일링, 스냅샷, 클라우드 거버넌스, 네트워크 통제, 커스텀 OCI 이미지
1353+ - 중지상태에서는 스냅샷 저장 공간을 제외한 나머지 비용이 발생하지 않음
1354+ - 샌드박스 사용자는 별도의 RBAC 권한이 필요함
13351355-->
13361356
13371357---
@@ -1345,7 +1365,7 @@ ACA가 더하는 가치는 여섯 가지입니다.
13451365<!--
13461366발표자 노트 · 20:20–20:30 · 10초
13471367
1348- 두 번째 데모에서는 ACA 샌드박스를 생성하고 원격에서 Copilot CLI를 실행한 뒤 Suspend와 Resume까지 확인합니다.
1368+ - 쟈 그러면 두번째 데모를 한 번 볼까?
13491369-->
13501370
13511371---
@@ -1378,12 +1398,10 @@ ACA가 더하는 가치는 여섯 가지입니다.
13781398<!--
13791399발표자 노트 · 20:30–21:30 · 1분
13801400
1381- 먼저 aca sandboxgroup create 명령으로 샌드박스 그룹을 만들고 --set-config 옵션으로 이후 명령에 사용할 기본 구성을 저장합니다.
1382- 샌드박스 그룹을 생성하거나 수정하려면 Container Apps SandboxGroup Contributor 역할이 필요합니다.
1383- 이어서 aca sandbox create 명령으로 GitHub Copilot CLI가 포함된 공개 copilot 디스크 이미지를 사용하는 샌드박스를 생성합니다.
1384- 사전에 만든 GitHub Copilot 자격 증명 ID를 --credential 옵션으로 연결해 Copilot CLI가 인증된 상태로 시작되도록 합니다.
1385- 그룹 내부의 샌드박스와 이미지 같은 데이터 영역 작업에는 Container Apps SandboxGroup Data Owner 역할이 필요합니다.
1386- 반환된 샌드박스 ID와 Running 상태를 확인한 뒤 다음 단계에서 Copilot CLI를 실행합니다.
1401+ - aca sandboxgroup create 명령으로 샌드박스 그룹 생성 - 모든 샌드박스가 여기서 돌아감
1402+ - aca sandbox create 명령으로 샌드박스 생성
1403+ - 샌드박스 안으로 들어가서 로그인해도 되지만, 그 전에 GitHub PAT 활용해서 사전에 로그인할 수 있음
1404+ - 이후 샌드박스 안으로 들어가면 됨
13871405-->
13881406
13891407---
@@ -1394,9 +1412,9 @@ ACA가 더하는 가치는 여섯 가지입니다.
13941412
13951413<pre ><code ><span class =" shell-prompt " >$</span > <span class =" shell-command " >aca sandbox shell</span > <span class =" shell-value " >-l name=ghcp-demo</span >
13961414
1397- <span class =" shell-prompt " >ghcp-demo $</span > <span class =" shell-command " >git clone</span > <span class =" shell-url " >https://github.com/devkimchi/battle-school-lunch.git</span >
1398- <span class =" shell-prompt " >ghcp-demo $</span > <span class =" shell-command " >cd</span > <span class =" shell-value " >battle-school-lunch</span >
1399- <span class =" shell-prompt " >ghcp-demo $</span > <span class =" shell-command " >copilot</span ></code ></pre >
1415+ <span class =" shell-prompt " >workspaces $</span > <span class =" shell-command " >git clone</span > <span class =" shell-url " >https://github.com/devkimchi/battle-school-lunch.git</span >
1416+ <span class =" shell-prompt " >workspaces $</span > <span class =" shell-command " >cd</span > <span class =" shell-value " >battle-school-lunch</span >
1417+ <span class =" shell-prompt " >workspaces $</span > <span class =" shell-command " >copilot</span ></code ></pre >
14001418
14011419<div class =" creation-result " >
14021420 <b >Clone</b ><span class =" arrow " >→</span >
@@ -1407,10 +1425,8 @@ ACA가 더하는 가치는 여섯 가지입니다.
14071425<!--
14081426발표자 노트 · 21:30–22:30 · 1분
14091427
1410- aca sandbox shell 명령으로 생성한 샌드박스의 대화형 셸에 접속합니다.
1411- 샌드박스 안에서 GitHub 저장소를 복제하고 작업 디렉터리로 이동한 뒤 Copilot CLI를 실행합니다.
1412- 비공개 저장소는 Contents 읽기 권한이 있는 별도 GitHub 자격 증명이 필요하며, github.com에 대한 egress 정책도 허용해야 합니다.
1413- 데모에서는 인증과 네트워크 정책을 미리 구성해 명령 흐름에 집중합니다.
1428+ - aca sandbox shell 명령어로 샌드박스에 접속
1429+ - 깃헙 리포 클론, GHCP CLI 실행
14141430-->
14151431
14161432---
@@ -1422,9 +1438,7 @@ aca sandbox shell 명령으로 생성한 샌드박스의 대화형 셸에 접속
14221438<!--
14231439발표자 노트 · 22:30–23:30 · 1분
14241440
1425- Copilot CLI가 시작되면 실제 코드 수정 대신 변경 계획만 작성하도록 요청합니다.
1426- 프롬프트는 Web UI를 Brutal Design 스타일로 바꾸는 계획을 design-update.md 파일에 저장하도록 지시합니다.
1427- 생성된 파일은 다음 슬라이드에서 Suspend와 Resume 이후에도 작업 상태가 유지되는지 확인하는 기준으로 사용합니다.
1441+ - 프롬프트 실행
14281442-->
14291443
14301444---
@@ -1453,13 +1467,9 @@ Copilot CLI가 시작되면 실제 코드 수정 대신 변경 계획만 작성
14531467<!--
14541468발표자 노트 · 23:30–24:30 · 1분
14551469
1456- ACA CLI에서는 aca sandbox stop 명령으로 샌드박스를 중지합니다.
1457- 중지할 때 설정된 Suspend Mode에 따라 디스크 또는 메모리와 디스크 상태를 스냅샷으로 보존합니다.
1458- 이 상태에서는 CPU와 메모리 컴퓨팅 비용이 발생하지 않으며, 필요할 때 빠르게 Resume할 수 있습니다.
1459- aca sandbox resume 명령으로 같은 샌드박스를 다시 실행합니다.
1460- 재개한 뒤 동일한 샌드박스 ID와 작업 디렉터리를 확인하고, 앞에서 만든 design-update.md 파일이 유지되는지 검증합니다.
1461- Suspend는 단순한 프로세스 종료가 아니라 실행 컨텍스트를 보존하는 수명주기 기능입니다.
1462- 이 기능은 긴 에이전트 작업의 대기 시간과 사용자 세션 사이의 유휴 비용을 줄이는 핵심 운영 가치입니다.
1470+ - aca sandbox stop 명령어로 샌드박스 중단
1471+ - aca sandbox resume 명령어로 다시 샌드박스 실행
1472+ - design-update.md 파일 보이는지 확인
14631473-->
14641474
14651475---
@@ -1473,7 +1483,7 @@ Suspend는 단순한 프로세스 종료가 아니라 실행 컨텍스트를 보
14731483<!--
14741484발표자 노트 · 24:30–24:40 · 10초
14751485
1476- 마지막으로 Docker 샌드박스와 ACA 샌드박스의 선택 기준을 비교하고 샌드박스를 사용해도 남는 위험을 정리합니다.
1486+ - 하지만 과연 샌드박스가 보안 관점에서 만능칼일까? 여전히 조심해야 할 부분이 있음
14771487-->
14781488
14791489---
@@ -1491,11 +1501,8 @@ Suspend는 단순한 프로세스 종료가 아니라 실행 컨텍스트를 보
14911501<!--
14921502발표자 노트 · 24:40–25:40 · 1분
14931503
1494- 두 제품을 우열로 비교하지 않고 선택 기준으로 정리합니다.
1495- 로컬에서 개발자가 에이전트를 안전하게 사용하려면 Docker 샌드박스가 자연스럽습니다.
1496- 서비스에서 사용자별 또는 작업별 실행 환경을 동적으로 제공하려면 ACA 샌드박스가 맞습니다.
1497- Docker에도 조직 정책 기능이 있으므로 '중앙 거버넌스가 없습니다'라고 단정하지 않습니다.
1498- 핵심 차이는 실행 위치와 자동화 가능한 수명주기, 그리고 동시성의 규모입니다.
1504+ - 로컬에서 개발자가 에이전트를 안전하게 사용하려면 Docker 샌드박스가 자연스러움
1505+ - 원격에서 동적으로 샌드박스 기능을 여러개 동시다발적으로 돌리려면 ACA 샌드박스가 자연스러움
14991506-->
15001507
15011508---
@@ -1511,10 +1518,10 @@ Docker에도 조직 정책 기능이 있으므로 '중앙 거버넌스가 없습
15111518<!--
15121519발표자 노트 · 25:40–26:40 · 1분
15131520
1514- 두 제품 모두 샌드박스 경계 밖으로 연결되는 통로가 있으므로 공통 위험이 남습니다.
1515- 허용된 네트워크와 자격 증명은 정보 유출과 권한 오용의 경로가 될 수 있습니다.
1516- 패키지와 이미지의 공급망, 에이전트가 만든 코드와 설정, 외부 MCP 서버와 Skills도 별도로 신뢰하고 검토해야 합니다.
1517- 샌드박스는 이 위험을 없애기보다 영향을 받을 수 있는 범위를 제한합니다.
1521+ - 여전히 위험요소는 남아있음
1522+ - 네트워크, 토큰 등은 정보 유출 및 권한 오남용의 경로가 될 수 있음
1523+ - 서플라이 체인 어택, 플러그인, 설치 스크립트 등 별도로 검토해야 함
1524+ - 샌드박스는 이런 영향을 받을 수 있는 범위를 제한함
15181525-->
15191526
15201527---
@@ -1536,9 +1543,9 @@ Docker에도 조직 정책 기능이 있으므로 '중앙 거버넌스가 없습
15361543<!--
15371544발표자 노트 · 26:40–27:40 · 1분
15381545
1539- Docker 샌드박스에서는 Direct 모드의 호스트 파일 변경과 microVM 밖에서 실행되는 로컬 MCP, 공유 Skills를 주의해야 합니다.
1540- ACA 샌드박스에서는 Contributor와 Data Owner의 RBAC 범위, 멀티테넌트 사용자와 샌드박스 매핑을 정확히 통제해야 합니다.
1541- 또한 Snapshot과 Volume은 작업 상태를 보존하는 장점이 있지만 민감한 데이터의 잔존 경로가 될 수 있으므로 수명주기와 삭제 정책이 필요합니다.
1546+ - 도커 샌드박스에서는 Direct 모드 사용시 조심할 것, 샌드 박스 밖에서 실행되는 로컬 MCP, 공유 스킬 등을 조심해야 함
1547+ - ACA 샌드박스에서는 RBAC 권한 등을 정확하게 통제해야 함
1548+ - 스냅샷은 작업 상태를 보존해 준다는 장점도 있지만, 결국 데이터가 남아있으니 라이프사이클 관리에 조심해야 함
15421549-->
15431550
15441551---
@@ -1555,8 +1562,8 @@ GitHub Copilot과 같은 <strong>AI 코딩 에이전트</strong>의<br>
15551562<!--
15561563발표자 노트 · 27:40–28:00 · 20초
15571564
1558- 따라서 샌드박스는 GitHub Copilot과 같은 AI 코딩 에이전트를 무조건 안전하게 만들어 주거나 신뢰와 검토를 대체하는 장치가 아닙니다.
1559- 에이전트가 실패하거나 공격받았을 때 영향을 받을 수 있는 범위를 최소화하는 방어 계층에 가깝습니다.
1565+ - 따라서, 샌드박스는 GHCP 같은 AI 코딩 에이전트를 무조건 안전하게 만들어주거나 하는 장치가 아님
1566+ - 오히려 무슨 문제가 생겼을 경우 피해를 최소하 시켜주는 방어 계층임
15601567-->
15611568
15621569---
@@ -1569,11 +1576,10 @@ GitHub Copilot과 같은 <strong>AI 코딩 에이전트</strong>의<br>
15691576<!--
15701577발표자 노트 · 28:00–29:00 · 1분
15711578
1572- 오늘의 결론은 세 문장입니다.
1573- 첫째, 에이전트에게 일할 권한은 주되 실행 경계는 외부 정책으로 강제합니다.
1574- 둘째, GitHub Copilot CLI를 개발자 PC에서 대화형으로 실행할 때는 Docker 샌드박스, 원격에서 자동화하거나 여러 작업을 동시에 실행할 때는 ACA 샌드박스를 선택합니다.
1575- 셋째, 샌드박스는 에이전트를 완전히 신뢰하게 만드는 것이 아니라 실패의 피해 범위를 작고 관찰 가능하고 폐기 가능하게 만듭니다.
1576- 감사합니다.
1579+ - 오늘 세션 내용은 요렇게 세가지로 정리 가능함
1580+ - 1. 에이전트에게 일할 권한은 주되 실행 경계는 외부 정책으로 강제
1581+ - 2. GHCP CLI를 개발자 PC에서 대화형으로 실행할 때는 Docker 샌드박스, 원격에서 자동화하거나 여러 작업을 동시에 실행할 때는 ACA 샌드박스
1582+ - 3. 샌드박스는 에이전트를 완전히 믿고 실행하는 대신 문제 발생시 피해 범위를 작고 관찰 가능하고 폐기 가능하게 만들어줌
15771583-->
15781584
15791585---
@@ -1597,9 +1603,7 @@ GitHub Copilot과 같은 <strong>AI 코딩 에이전트</strong>의<br>
15971603<!--
15981604발표자 노트 · 29:00–29:20 · 20초
15991605
1600- 질문을 받을 때 사용할 공식 문서 링크입니다.
1601- Docker 명령은 최신 sbx CLI를 기준으로 작성했습니다.
1602- ACA 샌드박스는 미리 보기 상태이므로 실제 발표 직전에 공식 문서와 CLI/SDK 예제를 다시 확인합니다.
1606+ - 샌드박스와 관련해서 더욱 궁금하다면? 링크 찾아봐라
16031607-->
16041608
16051609---
@@ -1613,6 +1617,10 @@ ACA 샌드박스는 미리 보기 상태이므로 실제 발표 직전에 공식
16131617우분투에서 AI 에이전트 샌드박싱하기
16141618</div >
16151619
1620+ <div class =" closing-links " >
1621+ <a href =" https://devkimchi.com/github-copilot-sandbox " >devkimchi.com/github-copilot-sandbox</a >
1622+ </div >
1623+
16161624<div class =" closing-speaker " >
16171625 <span >유저스틴</span ><span >|</span >
16181626 <span >수석 디벨로퍼 아드보캇</span ><span >|</span >
@@ -1625,7 +1633,5 @@ ACA 샌드박스는 미리 보기 상태이므로 실제 발표 직전에 공식
16251633<!--
16261634발표자 노트 · 29:20–30:00 · 40초
16271635
1628- 경청해 주셔서 감사합니다.
1629- 질문이 있으시면 편하게 말씀해 주세요.
1630- 발표 자료와 추가 정보는 GitHub와 LinkedIn의 @justinyoo 계정에서 확인할 수 있습니다.
1636+ - 땡큐베리감사!
16311637-->
0 commit comments