묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Access 어노테이션 관련 질문
책으로 복습하니 @Access 애노테이션에서 property 접근 방식, getter 이용 field 접근 방식 이렇게 두가지 경우가 있는데 프로퍼티 접근 방식은 어떤 것인지 잘 알겠으나, 필드 접근 방식은 어떤 것인지 잘 이해가 되지 않습니다. 1. 필드 접근 방식에서 필드에 직접 접근한다는 것이 무슨 의미인지 2. 어떤 경우에 필드 접근, 프로퍼티 접근 방식을 사용하는 게 적합한지 답변주시면 정말 감사드리겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Form 전송 객체 분리시 domain 객체에 validation 설정 관련
사용하는 API 마다 전송 객체의 요구 사항이 달라,DTO를 따로 만들어 주고, validation 역시 따로 적용하는 것이 좋다는 것은 알겠습니다. 그러면, DTO와 별개적으로 domain 객체에는 validation 을 적용하지 않나요? 아니면 방어로직? 으로써 domain에도 validation 을 적용해주는 것이 좋나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
외래키를 string으로 설정하는 법
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(http://bit.ly/3fX6ygx)을 먼저 확인해주세요. 3. 질문 잘하기 메뉴얼(http://bit.ly/2UfeqCG)을 먼저 읽어주세요. 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요, 영한님 연관관계를 맺다보니 string인 로그인 id로 외래키를 설정하고 싶은데, 제대로 mapped by를 설정하고 해봐도 외래키 부분이 bigint로 처리가 되더라고요, 이때는 방법이 있나요?
-
미해결그림으로 배우는 자바, 파트2: 객체지향!
Team 클래스와 Player 클래스
Team 클래스와 Player 클래스는 서로 다른 스코프를 가지는데 어떻게 Team 클래스의 변수 타입을 Player[]으로 설정하고 어떻게 Team 클래스의 메소드 안에서 totalPoints(); 메소드(Player 클래스의 메소드에 해당..)를 가져와서 사용할 수 있는건가요? 전체 코드 흐름은 이해되는데 이 부분이 마음에 걸리네요
-
미해결실전 프로젝트로 배우는 타입스크립트
판교님 질문있습니다....
AxiosResponse 하는 부분에서 아래와 같이 에러가 뜹니다.. (Cannot find name 'AxiosResponse'.) axios 설치 다시하고 무엇을 설정해야 할지 잘 모르겠습니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
revalidate 오류 문제
안녕하세요 제로초님, 늘 명강의 잘 듣고 있습니다. 현재 워크스페이스 만들기와 SWR 설정 단계를 듣고 있던 도중 SWR에 revalidate가 아무리 해도 불러들이지 않습니다. 그대로 따라한다고는 따라했는데.. 제가 어떤걸 놓쳤을까요? 도움을 좀 부탁 드리겠습니다..ㅠㅠ 에러 메시지는 아래처럼 뜹니다... All destructured elements are unused.ts(6198) Property 'revalidate' does not exist on type 'SWRResponse<any, any>'.ts(2339) const revalidate: any
-
미해결취미로 해킹#1(OverTheWire - Bandit)
command가 없다고 합니다
안녕하세요. weechat을 설치하는 과정에서 cygwin터미널 상에서 apt-sig install weechat 이라고 치면 계속해서 커맨드 에러가 발생합니다.
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
Spring Boot 버전 질문(2.5.x)
안녕하세요. 스프링 부트 버전이 현재(2.5.x)와 많이 다른데 차이가 큰가요?? 아마 개발할 때는 2.1.x 버전보다 최근에 나온 버전을 사용하게 될 거 같은데 많이 다를까봐 걱정돼서 질문드립니다!
-
해결됨스프링 핵심 원리 - 기본편
lombok 플러그인 설치 문제 도와주세요..
setting에 lombok을 검색해봐도 나오지가 않아요 ㅠㅠ 혹시 배포판이라 검색이 안되는건가요? 수동설치하려해도 버전이 맞지 않는다는 에러만 생기네요..
-
미해결블렌더 파이썬 BPY 입문강의
면적수치표시하기
안녕하세요. 수강생입니다. '면적 수치 표시하기' 강의에 '수치 표시하기' 강의가 올라와있어서 문의 드립니다. 면적 수치 강의 부탁드릴게요. 감사합니다.
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
expect(res.statusCode).toBe(500);
it('should handle errors', async () => { const errorMessage = {message: 'errors'}; const rejectedPromise = Promise.reject(errorMessage); Product.findByIdAndUpdate.mockReturnValue(rejectedPromise); await productController.updateProduct(req, res, next); expect(next).toHaveBeenCalledWith(errorMessage); // expect(res.statusCode).toBe(500); // Received: 200 }); server.js 에 작성된 오류 처리기에서는 500으로 처리하도록 되어 있는데, 위와 같이 500으로 처리되는지 확인해보면 200이 response되고 있습니다. next에 대한 테스트는 의도대로 되는 것으로 보아서 테스트는 문제가 없는 것 같은데, 왜 express 오류처리기의 response코드 500이 아닌 200으로 처리되는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
pdf
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(http://bit.ly/3fX6ygx)을 먼저 확인해주세요. 3. 질문 잘하기 메뉴얼(http://bit.ly/2UfeqCG)을 먼저 읽어주세요. 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의 잘듣고 있는 수강생입니다 다름이아니라 강사님이 중간 중간에 사용하시는 pdf파일 같은거는 다운 받을 수 없나요 ? 첫 자료에 있는 강의자료는 1과 자료밖에 없고 뒤에 자료는 없어서 그 자료를 다운로드 받을 수 없는지 궁금합니다.
-
해결됨[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드
B1 대한은행 공지사항 문제는 해결했는데, 네비게이션은 어떻게 해야 할 지 질문입니다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>대한 은행</title> <link href="css/style.css" rel="stylesheet"> </head> <body> <div class="container"> <header> <div class="header-logo"> <a href="#"> <img src="images/logo-header.png" alt="header logo"> </a> </div><!--.header-logo--> <div class="navi"> <ul class="menu"> <li><a href="#">개인</a> <div class="sub-menu"> <a href="#">조회</a> <a href="#">이체</a> <a href="#">공과금</a> <a href="#">예금/신탁</a> </div><!--.sub-menu--> </li> <li><a href="#">기업</a> <div class="sub-menu"> <a href="#">조회</a> <a href="#">이체</a> <a href="#">전자결재</a> <a href="#">수표/어음</a> </div><!--.sub-menu--> </li> <li><a href="#">금융상품</a> <div class="sub-menu"> <a href="#">저축상품</a> <a href="#">대출상품</a> <a href="#">투자상품</a> </div><!--.sub-menu--> </li> <li><a href="#">카드</a> <div class="sub-menu"> <a href="#">카드 정보</a> <a href="#">카드 신청</a> <a href="#">이용내역조회</a> </div><!--.sub-menu--> </li> </ul><!--.menu--> </div><!--.navi--> </header> <div class="slide"> <div> <a href="#"> <img src="images/slide-01.jpg" alt="image slide1"> </a> <a href="#"> <img src="images/slide-02.jpg" alt="image slide2"> </a> <a href="#"> <img src="images/slide-03.jpg" alt="image slide3"> </a> </div> </div><!--.slide--> <div class="items"> <div class="news"> <div class="tab-inner"> <div class="btn"> <a href="#none" class="active"> 공지사항 </a> <a href="#none"> 갤러리 </a> </div><!--.btn--> <div class="tabs"> <div class="tab1"> <ul> <li><a href="#none" class="open-modal"><em>「2021년 하반기 경제통계지표 해설 강좌 실시</em><b>2021.08.21</b></a></li> <li><a href="#none"><em>2021년 화폐사랑 UCC 공모전</em><b>2021.08.14</b></a></li> <li><a href="#none"><em>「2021년 상반기 경제통계지표 해설 강좌」 실시</em><b>2021.08.02</b></a></li> <li><a href="#none"><em>「2020년 하반기 경제통계지표 해설 강좌」 실시</em><b>2021.07.21</b></a></li> <li><a href="#none"><em>「2020년 상반기 경제통계지표 해설 강좌」 실시</em><b>2021.06.21</b></a></li> </ul> </div><!--.tab1--> <div class="tab2"> <a href="#none"> <img src="images/gallery-01.jpg" alt="gallery image1"> </a> <a href="#none"> <img src="images/gallery-02.jpg" alt="gallery image2"> </a> <a href="#none"> <img src="images/gallery-03.jpg" alt="gallery image3"> </a> </div><!--.tab2--> </div><!--.tabs--> </div><!--.tab-inner--> </div><!--.news--> <div class="banner"> <a href="#"> <img src="images/banner.jpg" alt="banner"> </a> </div><!--.banner--> <div class="shortcut"> <a href="#"> <img src="images/shortcut.jpg" alt="short cut"> </a> </div><!--.shortcut--> </div><!--.items--> <footer> <div class="footer-logo"> <a href="#"> <img src="images/logo-footer.png" alt="footer logo"> </a> </div><!--.footer-logo--> <div class="footer-wrap"> <div class="footer-menu"> <ul> <li><a href="#">저작권 보호방침</a></li> <li><a href="#">개인정보 처리방침</a></li> <li><a href="#">이메일 무단수집거부</a></li> <li><a href="#">홈페이지 이용안내</a></li> <li><a href="#">Contact Us</a></li> <li><a href="#">관련 사이트</a></li> </ul> </div><!--.footer-menu--> <div class="copywirte"> Copyright(c) Bank of Hankok. All rights reserved. </div><!--.copywirht--> </div><!--.footer-wrap--> </footer> </div><!--.container--> <div class="modal"> <div class="modal-content"> <h2>「2021년 하반기 경제통계지표 해설 강좌」 실시</h2> <p> 1. 목 적 : 국민의 경제통계지표에 대한 이해 및 활용도 제고<br> 2. 실시기간 : 2021. 10. 13.(수) ~ 12. 10.(금)(토요일, 공휴일 제외)<br> 3. 대상기관 : 전국 소재 교육기관(대학 이상) 및 공공·금융·기타 기관<br> 4. 수강방법 : 대면강의*, 실시간 온라인강의*(zoom 강의 등 포함), VOD를 활용한 강의중 선택<br> * 수강기관 내 대면이 필요한 강의는 코로나19와 관련한 정부의 방역관리지침을 준수하여야 함<br> 5. 수강장소 : 수강기관 내 희망 장소(화상강의는 별도 장소)<br> 6. 주 제 : 주요 경제통계지표* 중 희망 분야를 수강기관 별 강의주제로 선정<br> * 주요 경제통계지표 전반, 통화금융, 자금순환표, 물가, 국민소득, 산업연관표, 국민대차대조표,<br> 국제수지표, 국제투자대조표, 경제심리지수, 기업경영분석지표<br> 7. 수강비용 : 없음<br> 8. 강의 신청방법 및 수강기관 선정<br> □ (신청방법) 신청서*에 강의 희망일시 등을 기재한 후 e-mail(est@bok.or.kr)또는 fax(02-759-4430) 송부<br> * 신청서 및 「경제통계지표 해설 강좌」 안내문은 (붙임 1) 및 (붙임 2) 참조<br> ㅇ 강의 신청기간 : 2021. 8. 20.(금) 13:00 ~ 9. 10.(금) 17:00<br> □ (기관 선정기준) 교육기관을 우선 고려하되, 지역 및 신청순서 등도 감안하여 선정(40개 기관 내외)<br> □ (선정기관 통보) 선정된 기관을 「경제통계시스템 홈페이지」(ecos.bok.or.kr) ‘공지사항’에 게시*하고<br> 신청 시 기입한 e-mail로도 통보<br> * 게시일 : 2021. 9. 16.(목) 17:00<br> 9. 문의처 : (02)759-5672, 5692 </p> <a href="#none" class="close-modal">닫기</a> </div> </div><!--.modal--> <script src="script/jquery-1.12.4.js"></script> <script src="script/custom.js"></script> </body> </html> @charset "utf-8"; body{ color:222323; list-style: none; } a{ text-decoration: none; } .container{ width:1200px; border: 1px solid red; margin:0 auto; } header{ position: relative; z-index:10; } header > div{ height:100px; } .header-logo{ width:20%; float: left; line-height: 130px; } .navi{ width:60%; float: right; } .menu{ list-style: none; } .menu li{ width:25%; float: left; text-align: center; } .menu li a{ display: block; padding:10px; background: #0a4594; color:#fff; } .menu>li:hover>a{ background: #ababab; } .sub-menu{ display: none; } .sub-menu a:hover{ background: #ababab; } .slide{ position: relative; width:100%; height:300px; overflow: hidden; } .slide > div{ width:3600px; height:300px; border: 1px solid orangered; animation: slide 10s linear infinite; font-size: 0; } .sldie > div > a{ position: absolute; top:0; left:0; } @keyframes slide{ 0%{ margin-left:0; } 30%{ margin-left:0; } 35%{ margin-left:-1200px; } 65%{ margin-left:-1200px; } 70%{ margin-left:-2400px; } 95%{ margin-left:-2400px; } 100%{ margin-left:0; } } .items{ } .items > div{ height:200px; border: 1px solid greenyellow; box-sizing: border-box; float: left; } .news{ width:500px; } /* tab-inner */ .tab-inner{ width: 95%; margin: auto; } .btn{} .btn a{ border: 1px solid #0a4594; display: inline-block; width: 100px; text-align: center; padding: 5px; border-radius: 5px 5px 0 0; margin-right: -6px; border-bottom: none; margin-bottom: -1px; background-color: #0a4594; color:#fff; } .btn a.active{ background-color: #ababab; } .tabs{list-style: none;} .tab1{ border: 1px solid #0a4594; padding: 0 2px; height:170px; box-sizing: border-box; } .tab1 a{ display: inline-block; padding:0 5px; border-bottom: 1px solid #0a4594; box-sizing: border-box; } .tab1 a:last-child{ border-bottom: none; } .tab1>ul{ list-style: none; margin: auto; } .tab1>ul>li{ display: block; } .tab1>ul>li>a>em{ float: left; font-style: normal; } .tab1>ul>li>a>b{ float: right; font-style: normal; } .tab2{ display: none; border: 1px solid #0a4594; height: 169px; text-align: center; padding-top: 20px; box-sizing: border-box; } .tab2 img{ width:130px; } .banner{ width:350px; } .shortcut{ width:350px; } footer{} footer > div{ height:100px; border: 1px solid skyblue; box-sizing: border-box; float: left; } .footer-logo{ width:20%; line-height: 130px; } .footer-wrap{ width:80%; } .footer-wrap > div{ height: 50%; border: 1px solid skyblue; box-sizing: border-box; line-height: 50%; text-align: center; } .footer-menu ul{ list-style: none; text-decoration: none; } .footer-menu ul li{ float:left; padding:5px; } .footer-menu ul li a{ color:#0a4594; font-weight: bold; } .copywirte{ padding-top:20px; box-sizing: border-box; } /* Modal */ .modal{ background-color: rgba(0, 0, 0, 0.5); position: absolute; top:0; left:0; width:100%; height: 100%; z-index: 100; display: none; } .modal-content{ width:750px; background-color: #fff; top:50%; left:50%; position: absolute; transform: translate(-50%, -50%); padding:20px; border-radius: 10px; } .close-modal{ float: right; border: 1px solid #000; padding: 5px 10px; } /* Navigation */ $('.menu li').mouseenter(function(){ $('.sub-menu').stop().slideDown() }); $('.menu li').mouseleave(function(){ $('.sub-menu').stop().slideUp() }); /* Tab menu */ $('.btn a:first-child').click(function(){ $('.tab1').show() $('.tab2').hide() $(this).addClass('active') $(this).siblings().removeClass('active') }); $('.btn a:last-child').click(function(){ $('.tab1').hide() $('.tab2').show() $(this).addClass('active') $(this).siblings().removeClass('active') }); /* modal */ $('.open-modal').click(function(){ $('.modal').fadeIn() }); $('.close-modal').click(function(){ $('.modal').fadeOut() });
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
res._isEndCalled() 는 테스트를 못해보나요?
it('should return 404 when productId is not exist', async () => { const res = await request(app).get('/products/610a7f33b63caa3699ed9911'); expect(res.statusCode).toBe(404); // expect(res._isEndCalled()).toBeTruthy(); // 이건 왜 안될까요? }); 단위 테스트에서 수행하던 res._isEndCalled()는 node-mocks-http에서 createResponse()를 통해서 생성된 경우에만 테스트가 가능한 걸까요?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
mongoose 6.0.2 버전 오류
안녕하세요 강의가 너무 좋아서 한번더 퀵하게 복습 중인데, 그 사이에 mongoose의 메이저버전이 6으로 올라갔습니다. getProducts 통합 테스트할때, 전체 테스트(npm test)를 하면 오류가 안나지만, jest extension을 이용해서 아래 테스트만 진행하면 오류가 나네요. it('GET /products', async () => { const res = await request(app).get('/products'); expect(res.statusCode).toBe(200); expect(Array.isArray(res.body)).toBeTruthy(); expect(res.body[0].name).toBeDefined(); expect(res.body[0].description).toBeDefined(); }); 검색해서 좀 알아봐도 뚜렷한 답이 안나와서 혹시 아시는 내용인지 문의 드립니다. 참고로 결과 공유 드립니다 ➜ tdd2 node '/Users/lyunhokim/dev/tdd2/node_modules/.bin/jest' '/Users/lyunhokim/dev/tdd2/test/integration/products.int.test.js' -t 'GET /products' console.log Server is running... at Server.<anonymous> (server.js:23:11) console.log connected at server.js:11:11 FAIL test/integration/products.int.test.js (5.734 s) ✕ GET /products (5007 ms) ○ skipped POST /products ○ skipped should return 500 on POST /products ● GET /products MongoInvalidArgumentError: Method "collection.find()" accepts at most two arguments at Collection.find (node_modules/mongodb/src/collection.ts:733:13) at NativeCollection.<computed> [as find] (node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:191:33) at NativeCollection.Object.<anonymous>.Collection.doQueue (node_modules/mongoose/lib/collection.js:135:23) at node_modules/mongoose/lib/collection.js:82:24 ● GET /products thrown: "Exceeded timeout of 5000 ms for a test. Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test." 22 | }); 23 | > 24 | it('GET /products', async () => { | ^ 25 | const res = await request(app).get('/products'); 26 | expect(res.statusCode).toBe(200); 27 | expect(Array.isArray(res.body)).toBeTruthy(); at Object.<anonymous> (test/integration/products.int.test.js:24:1) at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13) Test Suites: 1 failed, 1 total Tests: 1 failed, 2 skipped, 3 total Snapshots: 0 total Time: 5.778 s Ran all test suites matching /\/Users\/lyunhokim\/dev\/tdd2\/test\/integration\/products.int.test.js/i with tests matching "GET /products". Jest did not exit one second after the test run has completed. This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.
-
해결됨리눅스 입문 - 개념으로 탄탄히!!
표준 스트림과 파일 디스크립터에서 헷갈리는 부분
[표준 스트림과 파일 디스크립터] 강좌를 보는데, 프로세스의 표준 입출력은 모두 파일 디스크립터라고 말씀해주셨는데, 파일 디스크립터 설명 부분에서 파일 디스크립터는 "파일을 대변하는 객체" 라고 말씀해주셨습니다. 그렇다면 표준 입출력은 "어떤 파일"을 대변하는 건가요??
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
몬스터가 벽을 뚫고 맵 밖으로 나가버립니다 ㅜㅜ
제목 그대로 collision 처리해놓은 벽을 뚫고 그대로 나가버리는데 해결 방법을 모르겠습니다 .. 대각선으로 이동하면서 나가버리던데 이 부분에 대해서 질문 드리고 싶습니다..
-
미해결하루만에 만드는 깃허브 블로그
에러
Liquid Exception: Invalid character in host: '<username>.github.io' in /_layouts/base.html jekyll 3.8.6 | Error: Invalid character in host: '<username>.github.io' . . . C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/addressable-2.7.0/lib/addressable/uri.rb:2475:in `validate': Invalid character in host: '<username>.github.io' (Addressable::URI::InvalidURIError) 이런 오류는 어떤식으로 해결해야 할까요??
-
미해결Data Engineering Course (1) : 빅데이터 하둡 직접 설치하기
log4j...에러문제입니다 ! ㅠㅠ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님! 이러한 에러가 납니다. . . log4j를 잘못설정한것같습니다 log4j 를 잘못설정한 것일까요?? 혹시 몰라서 다른 부분도 첨부해보겠습니다 -Mapper -Reducer -Driver pom.xml Run Configuration
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
9-5강 승부 판단하기 부분 문의드립니다.
const checkWinner = (target) => { let rowIndex; let cellIndex; rows.forEach((row, ri) => { row.forEach((cell, ci) => { if(cell === target) { rowIndex = ri; cellIndex = ci; console.log(ri,ci) } }) }) let hasWinner = false; if( rows[rowIndex][0].textContent === turn && rows[rowIndex][1].textContent === turn && rows[rowIndex][2].textContent === turn ){ hasWinner = true; } console.log(hasWinner) } 소스를 보면 위와같이 forEach문을 사용해서 현재 내가 클릭한 row,cells의 index값을 가져오는 소스입니다. 소스를 분석해보면 클릭한 위치를 찾기 위해서는 위와같은 소스가 만들어져야 한다는 것을 알 수 있습니다. 그런데 앞장부터 책을 보면서 진행을 하다보면 생각하는 과정이 어떻게 되서 위와같은 checkWinner라는 함수를 만들고 그 안에서 forEach를 사용해서 만들어지는지 전혀 모르겠어요.ㅠㅠ 그러니까.. [ [td],[td],[td] [td],[td],[td] [td],[td],[td] ] 이런식으로 배열이 만들어져서 그중에 2행 2열의 td의 클릭한 값을 가져오기 위해서는 제로초님이 만드신 forEach문을 사용해서 가져오면 된다는것은 알 수 있는데.. 그런 소스가 만들어지기까지의 과정을 모르겠습니다. 어떻게 생각을 하고, 어떤 방향으로 고민을 해야 만들어질 수 있는지 훈련을 할려면 어떻게 해야할까요?? 결론적으로. 소스를 보면 과정들이 이해가 가는데.. checkWinner라는 함수를 생각해내는 것 까지는 어렵지는 않은데(복잡해지니까 기능단위로 따로 빼면 되니까요) checkWinner라는 함수 안에 forEach를 사용해서 문제를 하결하는 과정은 입문자 입장에서는 아무리 고민을 하고, 이해를 하려고 해도 쉽지가 않습니다.ㅠㅠ 이럴 경우에는 어떤식으로 진행을 하고, 고민을 하고 공부를 해야하는지 조언 부탁드립니다.ㅜㅠㅜ