묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
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를 사용해서 문제를 하결하는 과정은 입문자 입장에서는 아무리 고민을 하고, 이해를 하려고 해도 쉽지가 않습니다.ㅠㅠ 이럴 경우에는 어떤식으로 진행을 하고, 고민을 하고 공부를 해야하는지 조언 부탁드립니다.ㅜㅠㅜ
-
미해결리눅스 시스템 프로그래밍 - 이론과 실습
virtualbox에 iso이미지 넣고..
virtualbox에 iso이미지 넣고 시작 누르는데 가상머신 세션을 열 수가 없습니다가 떴습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnRead에서 DataSize보다 크다면 false를 뱉어 내는데 그전에 한번더 검사하는 이유를 알고 싶습니다.
감사합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
npm i next-redux-wrapper에서 에러가 발생합니다.
npm i next-redux-wrapper 입력시 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: react-nodebird-front@1.0.0 npm ERR! Found: next@9.5.5 npm ERR! node_modules/next npm ERR! next@"^9.5.5" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer next@">=10.0.3" from next-redux-wrapper@7.0.2 npm ERR! node_modules/next-redux-wrapper npm ERR! next-redux-wrapper@"*" from the root project npm ERR! npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution. npm ERR! npm ERR! See C:\Users\정민수\AppData\Local\npm-cache\eresolve-report.txt for a full report. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\정민수\AppData\Local\npm-cache\_logs\2021-08-29T03_51_14_259Z-debug.log 이런 에러가 발생하는데 혹시 문제점이 어떤 것인지, 그리고 해결방법이 어떻게 되는지 알 수 있을까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
댓글 삭제 기능 오류 발생
제로초 선생님 강의를 듣고 나서 댓글 삭제 기능과 수정 기능 및 좋아요 갯수를 세는 기능 등을 만들어보고 있는데 아직 실력이 부족해서 그런지 상당히 헷갈리네요. 나머지는 추가로 해보려고 하고 댓글 삭제 기능만 먼저 질문드리겠습니다..! CommentEditForm.js ... import CommentRemoveBtn from './CommentRemoveBtn'; const { TextArea } = Input; const CommentEditForm = ({ post }) => { const dispatch = useDispatch(); const id = useSelector((state) => state.user.me?.id); const [editText, setEditText] = useState(''); const [commentEditMode, setCommentEditMode] = useState(false); const onReviseCommentText = useCallback((e) => { setEditText(e.target.value); }); const { reviseCommentLoading } = useSelector((state) => state.post); const onReviseComment = useCallback((CommentId) => () => { dispatch({ type: REVISE_COMMENT_REQUEST, data: { content: editText, PostId: post.id, UserId: id, CommentId, }, }); }, [editText, id]); const onRemoveComment = useCallback((CommentId) => () => { if (!id) { return alert('로그인이 필요합니다'); } return dispatch({ type: REMOVE_COMMENT_REQUEST, data: { CommentId, PostId: post.id, }, }); }, [post.id]); const onClickReviseComment = useCallback(() => { setCommentEditMode(true); }); const onCancelReviseComment = useCallback(() => { setCommentEditMode(false); }, []); return ( <div> {commentEditMode ? ( <> <TextArea value={editText} onChange={onReviseCommentText} /> <Button.Group> <Button loading={reviseCommentLoading} onClick={onReviseComment}>수정</Button> <Button type="danger" onClick={onCancelReviseComment}>취소</Button> </Button.Group> </> ) : ( <List header={`${post.Comments.length}개의 댓글`} itemLayout="horizontal" dataSource={post.Comments || []} renderItem={(item) => ( <li> <Comment actions={id && item.User.id === id ? [ <div style={{ fontSize: '13px', marginRight: '10px' }}> {moment(item.createdAt).format('MM.DD HH:mm')} </div>, <span style={{ fontSize: '13px' }} onClick={onClickReviseComment}> 수정하기 </span>, <CommentRemoveBtn onRemoveComment={onRemoveComment(item.id)} />, ] : [ <div style={{ fontSize: '13px', marginRight: '10px' }}> {moment(item.createdAt).format('MM.DD HH:mm')} </div>, ]} author={item.User.nickname} avatar={( <Link href={`/user/${item.User.id}`} prefetch={false}> <a><Avatar>{item.User.nickname[0]}</Avatar></a> </Link> )} content={item.content} /> </li> )} /> )} </div> ); }; CommentEditForm.propTypes = { post: PropTypes.object.isRequired, }; export default CommentEditForm; 댓글 삭제 기능을 구현하기 위해서 onRemoveComment 이벤트를 만들고, '삭제하기' 버튼을 누르면 REMOVE_COMMENT_REQUEST가 실행되면서 PostId와 CommentId를 넘겨주었습니다. reducers/post.js case REMOVE_COMMENT_REQUEST: draft.removeCommentLoading = true; draft.removeCommentDone = false; draft.removeCommentError = null; break; case REMOVE_COMMENT_SUCCESS: { const post = draft.mainPosts.find((v) => v.id === action.data.PostId); draft.removeCommentLoading = false; draft.removeCommentDone = true; draft.mainPosts = post.Comments.filter((v) => v.id !== action.data.CommentId); break; } case REMOVE_COMMENT_FAILURE: draft.removeCommentLoading = false; draft.removeCommentError = action.error; break; routes/post.js router.delete('/:postId/comment', isLoggedIn, async (req, res, next) => { // DELETE /post/1/comment try { const comment = await Comment.findOne({ where: { PostId: req.params.postId, UserId: req.user.id } }); await Comment.destroy({ where: { id: comment.id }, include: [{ model: User, attributes: ['id', 'nickname'], }], }); res.status(200).json({ id: comment.id, PostId: parseInt(req.params.postId, 10), UserId: req.user.id }); } catch (error) { console.error(error); next(error); } }); 리듀서와 라우터는 위와 같이 만들었는데, db에서는 정상적으로 댓글이 지워지지만 화면에서는 반영이 안됩니다. 확실히 리듀서 코드를 잘못 짜줬기 때문에 위와 같이 댓글뿐만 아니라 다른 것까지 다 지워버리는 현상이 발생하는 것 같은데, mainPosts라는 배열 안에 객체가 있고, 그 안에 Comments가 또 배열 객체를 가지고 있다보니 이를 지우는 것이 매우 헷갈리는 것 같습니다. case REMOVE_COMMENT_REQUEST: draft.removeCommentLoading = true; draft.removeCommentDone = false; draft.removeCommentError = null; break; case REMOVE_COMMENT_SUCCESS: { const post = draft.mainPosts.find((v) => v.id === action.data.PostId); draft.removeCommentLoading = false; draft.removeCommentDone = true; draft.mainPosts = post.Comments.filter((v) => v.id !== action.data.CommentId); break; } case REMOVE_COMMENT_FAILURE: draft.removeCommentLoading = false; draft.removeCommentError = action.error; break; 이 리듀서를 어떻게 수정하는 것이 좋을까요..?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
API URL 설계와 서비스 접근제어
아래와 같이 http method는 다르지만 URL이 같은 경우, (조회 : GET /members, 등록 : POST /members) 서비스 접근제어는 보통 URL기반으로 처리하므로 등록권한을 따로 분리할 수 없고, 이럴 경우는 컨트롤 URL을 사용할 수 밖에 없을 것 같은데요. (등록: POST /members/regist) 그렇다면 실무에서는 운영 중에 권한이 생기거나 변경될 수도 있으니, 처음부터 컨트롤 URL을 적극 사용하여 API URL을 설계하는 게 맞는 것 같은데, (--> 조회 : GET /members/search, 등록 : POST /members/regist) 접근제어 처리 관점에서 API URL 설계는 어떻게 하는게 효율적일까요?
-
미해결쉽고 빠르게 끝내는 GO언어 프로그래밍 핵심 기초 입문 과정
gopath까지 다 설정했는데,, 왜 GOROOT에서 패키지를 찾아오려고 할까요?
package section4/lib is not in GOROOT (/usr/local/go/src/section4/lib) 이런 에런가 납니다.. go env를 사용하면 현재 작업중인 곳에 GOPATH가 설정이 잘 되어있구요..
-
해결됨[개정판] 파이썬 머신러닝 완벽 가이드
스터디 열었습니다!
관심있으신 분들 참여 부탁드려요 ㅎ커뮤니티 "스터디"란에 있습니다
-
미해결홍정모의 따라하며 배우는 C++
벡터
그 전의 강의들보면 vector선언하실 때 예) vector <int> vec = {1,2,3,4} ; 이런식이였는데요 여기서 vector <int> vec(10); 을 벡터 10개라고 하셨는데 벡터 10개라는의미가 vec =이 vec벡터 1개로 10칸의 배열을 의미한다는 것인가요? 아니면 10개의 벡터가 만들어졌다는 뜻인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
하이버네이트 쿼리 로그 중복??
이상하게 선생님과 달리 전 로그 쿼리가 두번이 찍히더라구요. 모든 로그파일이 2번씩 찍힙니다. drop 도 마찬가지고 create 도 마찬가지고 insert update 등등 해결해보려고 검색도 해보는데 마땅히 해결방안을 찾지를 못하고 있어서.... 죄송합니다.(전 H2가 아닌 mysql을 사용하고 있긴한데 이게 이런 현상을 발생시키는지는 잘 모르겠습니다 ㅠ) ========================================= create table Album ( artist varchar(255), etc varchar(255), ITEM_ID bigint not null, primary key (ITEM_ID) ) engine=MyISAM Hibernate: create table Album ( artist varchar(255), etc varchar(255), ITEM_ID bigint not null, primary key (ITEM_ID) ) engine=MyISAM 10:41:04.346 [main] INFO org.hibernate.orm.connections.access - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@152c4495] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
-
미해결Data Engineering Course (1) : 빅데이터 하둡 직접 설치하기
기준설정
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님 !! :) ㅇdataa=n ew Text(CovidData[3]) ; 이부분이랑 밑에 Covid Data[8] ; 여기요, 어떤 기준(이유)으로 CovidData[3]. CovidData[8] 을 설정하신 건지 궁금합니다! date변수에 인덱스3부분에 해당하는 날짜를 넣은것인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Validation (JSR-303 validation with Hibernate validator) 모듈 추가
제목 그대로 스프링 부트 스타터 설정에서 저 모듈을 추가하라는 말씀이 어떻게 해야하는 건지 잘 모르겠네요..코드를 추가하는건가요? 혹시 스프링부트 스타터에서 추가하는건가요?