묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨HTML5 & CSS3 기초 문법 올인원
flexbox와 grid
이런 사이트를 만든 적이 있는데요, 가로나 세로 단일방향에 대한 것(음료/푸드/상품탭)은 display : flex; 로 하는게 맞는거고 저는 그당시 테두리 있는 박스 두개를 먼저 display : grid; justify-content : center; 를 주고, 내부에 개별 이미지들을 display: flex; flex-wrap: wrap; justify-content: flex-start; 이렇게 줬었더라고요 오늘 수업에 따르면 이미지 배치는 행과 열이니까 display : grid; 로 두고 행, 열, 여백 등을 지정해서 4열xn행 이렇게 되게 코드를 짰어야 하는걸까요? 저 프로젝트할때는 저게 최선인거 같았는데 css 다시 공부하면서 꺼내보니까 왜 저렇게 했었는지도 기억이 안나네요ㅠ
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
10-2
파일 쓰기 중에 계속 파일 열기 실패라고 뜨는데 혹시 파일을 만들어야하는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 서비스 테스트를 하고 있는데 어디에서 잘못된건지 잘 모르겠습니다..
package jpabook.jpashop.service; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jpabook.jpashop.domain.Address; import jpabook.jpashop.domain.Member; import jpabook.jpashop.domain.Order; import jpabook.jpashop.domain.OrderStatus; import jpabook.jpashop.domain.item.Book; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.exception.NotEnoughStockException; import jpabook.jpashop.repository.OrderRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @RunWith(SpringRunner.class) @SpringBootTest @Transactional public class OrderServiceTest { @PersistenceContext EntityManager em; @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Exception { //Given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고 int orderCount = 2; //When Long orderId = orderService.order(member.getId(), item.getId(), orderCount); //Then Order getOrder = orderRepository.findOne(orderId); assertEquals("상품 주문시 상태는 ORDER",OrderStatus.ORDER, getOrder.getStatus()); assertEquals("주문한 상품 종류 수가 정확해야 한다.",1, getOrder.getOrderItems().size()); assertEquals("주문 가격은 가격 * 수량이다.", 10000 * 2, getOrder.getTotalPrice()); assertEquals("주문 수량만큼 재고가 줄어야 한다.",8, item.getStockQuantity()); } @Test(expected = NotEnoughStockException.class) public void 상품주문_재고수량초과() throws Exception { //... } @Test public void 주문취소() { //... } private Member createMember() { Member member = new Member(); member.setName("회원1"); member.setAddress(new Address("서울", "강가", "123-123")); em.persist(member); return member; } private Book createBook(String name, int price, int stockQuantity) { Book book = new Book(); book.setName(name); book.setStockQuantity(stockQuantity); book.setPrice(price); em.persist(book); return book; } } 예상 개수가 8개이고 결과는 2개가 나오는데 이게 어디서 수정을 해줘야 할 지 감이 안 잡힙니다.. java.lang.AssertionError: 주문 수량만큼 재고가 줄어야 한다. Expected :8Actual :2<Click to see difference> at org.junit.Assert.fail(Assert.java:89) at org.junit.Assert.failNotEquals(Assert.java:835) at org.junit.Assert.assertEquals(Assert.java:647) at jpabook.jpashop.service.OrderServiceTest.상품주문(OrderServiceTest.java:47) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:76) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
import java.lang.reflect.Member; 가 계속 자동 생성돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 계속 getId와 setId가 안되어서 잘 살펴보니 제가 만든 hello.serlvet.domain.member import 되지않고, java.lang.reflect.Member;이라는 것이 import 되어있어서 오류가 나는 것 같습니다 ㅠㅠ그래서 지우려고 하는데 지우면 계속 자동으로 import문이 생성되고, save 메소드를 지우고 import java.lang.reflect.Member문을 지우면 지워지기는 하는데 import hello.servlet.domain.*; 부분이 활성화가 안되네요..ㅜㅜ 어떻게 해야하나요
-
해결됨쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
3-1 쿠버네티스 구성 요소 확인에서 AWS - EKS
안녕하세요 강사님 질문이 있어서 올립니다.EKS Cluster 생성하고 eks-node도 생성을 하고나서 CloudShell 에서 명령어를 실습하고있는데문제가 발생하였습니다.서버 localhost:8080에 대한 연결이 거부되었다고 뜨면서 올바른 호스트 또는 포트를 지정했냐고 뜨는데어떻게 해결해야하나요?
-
해결됨Flutter 앱 개발 기초
Food Rceipe실습에서 DrawerHeader에 관해서 질문 있습니다
예제에 있는대로 쳤는데 오류가 나서 마우스를 올려보니child위젯이 reqired라고 되어 있습니다.그 다음 바로 뇌정지가 와서 어찌할줄 모르는 상태입니다 허허...
-
미해결[게임 프로그래머 도약반] DirectX11 입문
안녕하세요 제가맞게 생각하는건지 모르겠습니다
항상 화면에서 보이는것은 원점을 기준으로 z축방향을 바라보고있기떄문에 사실상 카메라라는것은 존재하지않고 모든 물체에다가 뷰변환을 적용시켜서 , 카메라를 움직이는게 아닌 물체를 원점으로 끌고와서 그려주는것이 맞는건가요 ?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
Coupang a.["href"] 정보 관련 문의
안녕하세요, 쿠팡 크롤링 영상을 보다가 궁금한 점이 있어서 문의드립니다.실습을 위하여 아래와 같이 코드를 입력하였습니다.import requests from bs4 import BeautifulSoup base_url = "https://www.coupang.com/np/search?component=&q=" keyword = input("검색할 상품을 입력하세요 : ") search_url = base_url + keyword headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } cookie = {"a" : "b"} res = requests.get(search_url, timeout=5 ,headers=headers, cookies=cookie) html = res.text soup = BeautifulSoup(html, "html.parser") items = soup.select("[class=search-product]") print(items[0]) rank = 1 for item in items: badge_rocket = item.select_one(".badge.rocket") if not badge_rocket: continue name = item.select_one(".name") price = item.select_one(".price-value") thumb = item.select_one(".search-product-wrap-img") link = item.select_one("a")["href"] # link = item.a["href"] print(f"{rank}") print(name.text) print(f"{price}원") print(thumb) print(link) print() rank += 1 그랬더니 아래와 같은 에러가 뜨더라구요.Traceback (most recent call last): File "c:\Users\LG\OneDrive\03. Resources\Python\08_1_coupang.py", line 40, in <module> link = item.a["href"] ~~~~~~^^^^^^^^ File "C:\Users\LG\AppData\Local\Programs\Python\Python312\Lib\site-packages\bs4\element.py", line 1573, in getitem return self.attrs[key] ~~~~~~~~~~^^^^^KeyError: 'href' 그래서 이 검색을 하던 도중에 items 리스트의 첫 번째 데이터를 확인하였습니다.그랬더니, items[0] 내에 'href' 속성이 존재하지 않더라구요.분명 elements에서 검색했을 때는 아래 캡쳐처럼 존재를 하였습니다..왜 이런지 궁금합니다.. <li class="search-product" data-coupon-nudge-text="" data-coupon-tag-area="true" data-freebie-vendor-item-id="null" data-handyman-area="" data-is-rocket="true" data-is-soldout="" data-product-id="7410323525" data-vendor-item-id="86316217055" data-winner-vendor-item-id="86316217055" id="7410323525" > <a class="search-product-link" data-is-soldout="" data-item-id="19198810280" data-product-id="7410323525" data-product-link="/vp/products/7410323525?itemId=19198810280&vendorItemId=86316217055" data-srp-log='{"group":"PRODUCT", "itemId":"19198810280", "productId":"7410323525", "vendorItemId":"86316217055", "page":"1", "listSize":"36", "isCcidEligible":false, "displayCcidBadge":false, "wowOnlyInstantDiscountRate": 9, "snsDiscountRate" : -1, "isLoyaltyMember": false, "hasAsHandymanBadge":false }' data-vendor-item-id="86316217055" target="_blank" ><dl class="search-product-wrap adjust-spacing coupon"> <dt class="image"> <img alt="주연테크 FHD LED 100Hz 모니터, 54.6cm, V22FX(일반)" class="search-product-wrap-img" data-src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" height="230" onerror="this.src='//img2a.coupangcdn.com/image/coupang/common/no_img_1000_1000.png'" onload="logTime(this);logImageLoadTime(this);" src="//thumbnail7.coupangcdn.com/thumbnails/remote/230x230ex/image/retail/images/671217612372165-b6d07ba8-e3fa-4a08-8fba-cb4adbedd0d0.jpg" width="230" /> </dt> <dd class="descriptions"> <div class="descriptions-inner"> <div class="badges"></div> <div class="name"> 주연테크 FHD LED 100Hz 모니터, 54.6cm, V22FX(일반) </div> <div class="price-area"> <div class="price-wrap"> <div class="price"> <span class="price-info"> <span class="instant-discount-rate">2%</span> <del class="base-price"> 91,610 </del> </span> <em class="sale discount isInstantDiscount"> <strong class="price-value">89,000</strong>원 <span class="badge rocket"> <img alt="로켓배송" height="16" src="//image6.coupangcdn.com/image/cmg/icon/ios/logo_rocket_large@3x.png" /> </span> </em> </div> <div class="coupon-wot-nudge-row"> <div class="coupon-wot-nudge-ticket"> <div class="coupon-wot-nudge-ticket_left_border"> <span class="coupon-wot-nudge-ticket_left_border_amount" >8,900</span >원 </div> <div class="coupon-wot-nudge-ticket_right_border"></div> </div> <div class="coupon-wot-nudge-text">와우회원 추가 쿠폰</div> </div> <!-- Free Shipping Badge --> <div class="delivery"> <span class="arrival-info"> <em style="color: #008c00">내일(화) </em> <em style="color: #008c00">도착 보장 </em> </span> </div> </div> <div class="used-product-info"> <span>새 상품</span><span>, </span><span>반품</span ><strong> (9)</strong> <span>최저</span><strong>73,870</strong ><span>원</span> </div> </div> <div class="other-info"> <div class="rating-star"> <span class="star" ><em class="rating" style="width: 90%">4.5</em></span > <span class="rating-total-count">(1188)</span> </div> </div> <div class="benefit-badges"> <div class="reward-cash-badge"> <div class="reward-cash-badge__inr"> <img alt="" class="reward-cash-ico" src="//image6.coupangcdn.com/image/badges/cashback/web/list-cash-icon@2x.png" /> <span class="reward-cash-txt">최대 3,694원 적립</span> </div> </div> </div> </div> </dd> </dl> <span class="number no-1">1 </span> <div class="mask"></div ></a> </li> PS C:\Users\LG\OneDrive\03. Resources\Python>
-
미해결
새창으로 form submit() 할 때 csrf 토큰문제 질문드려요
<body> <form:form id="gotoPopupPreview" name="gotoPopupPreview" method="post" action=""> <input type="hidden" name="isPreview" value="Y"> <input type="hidden" name="nttId" value="${searchVO.nttId}"> ...(생략) </form:form> <script> function openPreview(url, target, otherData){ var f = $("#gotoPopupPreview"); f.attr('action', url); f.attr('target', target); ...(생략) window.open('', target); f.submit(); } $("submitBtn").click(function(){ var otherData = '어쩌구저쩌구'; openPreview("http://www.test.or.kr/", '테스트', otherData); }); </script> </body>위 코드와 같이 form 태그를 만들어두고 스크립트에서 새 창을 열어 submit을 보냈습니다.근데 서버에서 AccessDeniedException : org.springframework.security.web.csrf.MissingCsrfTokenException: Could not verify the provided CSRF token because your session was not found.result :::: {"result" : "fail", "message" : "Could not verify the provided CSRF token because your session was not found."}이렇게 csrf 토큰이 없다고 뜨네요..처음엔 <input type="hidden" name="$csrf.parameterName}" value="${csrf.token}" /> 이렇게 form태그 안에 직접 넣었다가 form taglib을 쓰면 자동으로 토큰을 넣어준다길래 위와 같이 바꾼건데요, 두 경우 모두 토큰이 잘 들어있는 것으로 보이는데 왜 저런 exception이 뜨는 지 모르겠습니다ㅠ아무래도 새 창으로 띄우는 게 문제일까요? 이 경우에는 토큰을 어떻게 넣어줘야 할까요? T.T
-
해결됨김영한의 실전 자바 - 기본편
진짜 사소한 교재 오류 관련 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]정말 사소하긴 합니다만, 교재에도 강의 화면에도 출력 예시에 큰따옴표가 포함되어있는데, 강의 화면과 제공된 소스 코드에는 큰따옴표와 이스케이프 시퀀스가 포함되어있지 않아 아래 강의 화면처럼 큰따옴표가 출력되지 않을 것 같습니다. 별로 중요한 건 아니니 교재 파일을 수정하는 것이 어떨까요...? 사소해서 죄송합니다...
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-B 재귀함수 관련 질문입니다.
go(here + 1); a[here] = ~a[here]; go(here + 1);go함수 내에서 강사님이 하신대로 위와 같이 호출하면 기저사례에 8가지 경우의 수(3행기준)가 모두 나온다는 것을 재귀함수 트리를 그려서 확인을 했을뿐 이해가 가지 않습니다..go(here + 1); a[here] = ~a[here]; go(here + 1); a[here] = ~a[here]; //원복뒤집고 go함수 호출하고 그 함수가 종료되고 다시 돌아왔을 때 바뀐 배열을 다시 뒤집는 과정이 있어야 함수가 똑바로 작동할거라고 계속 생각하게 되네요. 예를 들어, {4,5,1}이 있을 때 , go(1)이 호출되고 첫번째go(2)함수가 진행되다가 함수가 종료되어서 다시 go(1)로 돌아왔을 때, {4,5,1}이 되어있어야 기저사례에서 8가지 경우가 제대로 나올텐데 왜 원복 코드없이도 8가지가 제대로 나오는지 이해가 안됩니다!!!!!!!!!
-
미해결HTML5 & CSS3 기초 문법 올인원
#21 그리드 강의 정렬 관련 속성
.container { justify-items(가로 방향 정렬) : center;align-items(세로 방향 정렬) : center;} 를 설정하는데 각각 색깔이 차있는 div박스가 왜 찌부되는건가요.....???? 가로세로 길이가 지정되있지 않아서 인가요?외부 컨테이너에서 정렬을 한다는게 내부 요소를 정렬하는건가요? 자식요소를 정렬하는건가요?(둘이 같은 의미인가요??) 다른 프로젝트 할 때도, 뭐가 자꾸 원하는대로 가운데로 안가서 justify-items : center를 쓰면된다는 소리를 듣긴 했었는데, 그때는 아예 의미도 모르고(다른 강사가 안짚어줬는지 까먹었는지) 아 저거 써도 왜 가운데로 안가냐ㅠ 했던 기억이 있는데 정확한 정황은 까먹었네요. 그래서 왜 찌부가 되고 있는걸까요? html&css 강의 마지막에 큰 멘붕 왔습니다
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
배포 후 글 작성하고 새로고침하면 게시물이 사라집니다.
배포 후 정상작동을 확인하기위해글 작성하고 새로고침을했는데 로컬스토리지에 제대로 저장안되는 문제가 발생합니다. 그리고 components탭을 확인해보니 ye he me le ... 이런식으로 나오는데왜이렇게나오는지 이게 문제의 원인인지 모르겟습니다..!수정이나 삭제 기능은 정상작동합니다. 로컬스토리지에 왜 저장이안될까요...수업보면서 작성한코드와https://github.com/hunffy/emotion_diaryfirebase 배포 주소는https://hunffy-individual-project.web.app/여기있습니다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
isLoggedIn추가 후 로그아웃 안되는 문제 발생
안녕하세요 선생님상황)req.logout안에 콜백 함수넣어서 로그아웃이 잘 되고 있었는데, isLoggedIn추가 후 상태코드 401이 뜨고 preview에는 로그인이 필요합니다가 뜨며 로그아웃 안되는 상황입니다. network로그인 했을 때로그아웃 했을 때network로그아웃 했을 때preview redux로그인 했을 때로그아웃 했을 때시도해본것)로그인 후 세션정보 콘솔 출력router.post('/login', isNotLoggedIn, (req, res, next)=> { passport.authenticate('local',(err, user, info) => { if(err) { console.error(err); return next(err); } if(info) { return res.status(401).send(info.reason); } return req.login(user,async(loginErr)=> { if(loginErr) { console.error(loginErr); return next(loginErr); } console.log('로그인 후 세션 정보:', req.session); //생략 }); })(req, res, next); }); //POST /user/loginuser.js의 logout에서 에러 발생시 출력 => 출력 xrouter.post('/logout', isLoggedIn, (req, res) => { req.logout((err) => { if (err) { console.error(err); return res.status(500).send('로그아웃 중 오류가 발생했습니다.'); } res.send('ok'); req.session.destroy(); }); });Middlewares에서 req.isAuthenticated()확인 => 결과 falseexports.isLoggedIn = (req, res, next) => { console.log('로그인 상태 확인:', req.isAuthenticated()); if(req.isAuthenticated()) { next(); } else { res.status(401).send('로그인이 필요합니다.'); } }질문)req.isAuthenticated가 false로 나와서 로그아웃이 안되는데 원인과 해결방법이 궁금합니다. 혹시 로그인하면 이것을 true가 되게 바꾸는 방법이 있나요?req.isAuthenticated()작성한 코드) UserProfileimport React, {useCallback} from 'react'; import {useDispatch, useSelector} from 'react-redux'; import {Card, Avatar, Button} from 'antd'; import styled from 'styled-components'; import {logoutRequestAction} from '../reducers/user'; const ButtonWrapper = styled(Button)` display: block; margin-left: auto; margin-right: auto; ` const UserProfile = () => { const dispatch = useDispatch(); const { me, logOutLoading } = useSelector((state) => state.user); const onLogout = useCallback(()=>{ dispatch(logoutRequestAction()); }, []); return ( //생략 <ButtonWrapper onClick={onLogout} loading={logOutLoading}>로그아웃</ButtonWrapper> ); } export default UserProfile;reducers/userimport {produce} from 'immer'; export const initialState = { logOutLoading: false,//logout시도중 logOutDone: false, logOutError: null, } export const LOG_OUT_REQUEST = 'LOG_OUT_REQUEST'; export const LOG_OUT_SUCCESS = 'LOG_OUT_SUCCESS'; export const LOG_OUT_FAILURE = 'LOG_OUT_FAILURE'; export const logoutRequestAction = () => { return { type: LOG_OUT_REQUEST } } const reducer = (state = initialState, action) => produce(state, (draft) => { switch(action.type){ case LOG_OUT_REQUEST: draft.logOutLoading = true; draft.logOutDone = false; draft.logOutError = null; break; case LOG_OUT_SUCCESS: draft.logOutLoading = false; draft.logOutDone = true; draft.me = null; break; case LOG_OUT_FAILURE: draft.logOutLoading = false; draft.logOutError = action.error; break; default: break; } }); export default reducer;sagas/userimport axios from 'axios'; import { all, call, delay, fork, put, takeLatest } from 'redux-saga/effects'; import { LOG_OUT_FAILURE, LOG_OUT_REQUEST, LOG_OUT_SUCCESS, } from '../reducers/user'; function logOutAPI(){ return axios.post('/user/logout'); } function* logOut() { try{ yield call(logOutAPI); yield put({ type: LOG_OUT_SUCCESS, }); } catch(err) { yield put({ type: LOG_OUT_FAILURE, error: err.response.data }); } } function* watchLogOut(){ yield takeLatest(LOG_OUT_REQUEST, logOut); } export default function* userSaga() { yield all ([ fork(watchLogOut), ]) }routes/user.jsconst express = require('express'); const bcrypt = require('bcrypt'); const {User, Post} = require('../models'); const router = express.Router(); const passport = require('passport'); const {isLoggedIn, isNotLoggedIn} = require('./middlewares'); router.post('/login', isNotLoggedIn, (req, res, next)=> { passport.authenticate('local',(err, user, info) => { if(err) { console.error(err); return next(err); } if(info) { return res.status(401).send(info.reason); } return req.login(user,async(loginErr)=> { if(loginErr) { console.error(loginErr); return next(loginErr); } const fullUserWithoutPassword = await User.findOne({ where: {id: user.id}, attributes:{ exclude:['password'] }, include: [{ model: Post }, { model: User, as:'Followings', }, { model: User, as:'Followers' }] }) return res.status(200).json(fullUserWithoutPassword); }); })(req, res, next); }); //POST /user/login //생략 const {isLoggedIn, isNotLoggedIn} = require('./middlewares'); router.post('/logout', isLoggedIn, (req, res) => { req.logout(() => { req.session.destroy(); res.send('ok'); }); });routes/middlewaresexports.isLoggedIn = (req, res, next) => { if(req.isAuthenticated()) { next(); } else { res.status(401).send('로그인이 필요합니다.'); } } exports.isNotLoggedIn = (req, res, next) => { if(!req.isAuthenticated()){ next(); } else { res.status(401).send('로그인 하지 않은 사용자만 접근이 가능합니다.'); } }passport/indexconst passport = require('passport'); const local = require('./local'); const { User } = require('../models'); module.exports = () => { passport.serializeUser((user,done) => { done(null,user.id);//첫번째 인자 에러, 두번째 인자 성공(쿠키와 묶어줄 user아이디만 저장) }); passport.deserializeUser(async(id, done) => { try { const user = await User.findOne({where:{id}}) done(null,user); } catch(error) { console.error(error); done(error); } }); local(); };passport/localconst passport = require('passport'); const {Strategy:LocalStrategy} = require('passport-local'); const bcrypt = require('bcrypt'); const {User} = require('../models'); const express = require('express'); const router = express.Router(); router.post('/login', passport.authenticate('local')); module.exports = () => { passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password', }, async(email, password, done) => { try { const user = await User.findOne({ where:{email} }); if(!user) { return done(null, false, {reasone: '존재하지 않는 이메일입니다!'}) } const result = await bcrypt.compare(password, user.password); if(result) { return done(null, user);//성공에 사용자 정보 넘겨줌 } return done(null, false, {reason:'비밀번호가 틀렸습니다.'}); } catch(error) { return done(error); } })); } 사용 하는 OS )mac설치 버전)back{ "name": "react-nodebird-back", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "luckyhaejin", "license": "ISC", "dependencies": { "bcrypt": "^5.1.1", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "express-session": "^1.17.3", "mysql2": "^3.6.5", "passport": "^0.7.0", "passport-local": "^1.0.0", "sequelize": "^6.35.2", "sequelize-cli": "^6.6.2" }, "devDependencies": { "nodemon": "^2.0.22" } }
-
해결됨스프링 핵심 원리 - 기본편
조회빈이 2개 이상있을때 @Autowired를 사용시에 생성자에서 발생하는 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]조회빈이 2개 이상일때 @Autowired 어노테이션이 붙은 생성자가 의존성을 주입할시에 처음에는 타입으로 주입시도하고 아닐경우에 필드명으로 주입을 시도한다고 하는데요. 필드명을 주입하려는 구현체랑 맞추더라도 같은 에러가 발생하는데요 혹시 해당 이슈에 대해서 업데이트 된 부분이 있을까요 ? 혹시나 필드명을 제가 잘못입력했을까봐 에러 로그에서 복사해서 실행해도 같은 증상이 나타압니다. 다음은 에러 코드입니다.org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [/Users/choehyeonseong/Desktop/project/spring/core/out/production/classes/hello/core/order/service/OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy 다음은 생성자 부분입니다. @Autowired public OrderServiceImpl(MemberRepositroy memberRepositroy, DiscountPolicy rateDiscountPolicy/*autowired등록시에 처음에 타입으로 조회 다음에 필드 변수명으로 매칭한다.*/) { System.out.println("1. OrderServiceImpl.OrderServiceImpl"); this.memberRepositroy = memberRepositroy; this.discountPolicy = rateDiscountPolicy; }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로그램 실행 자체 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 이제 스프링에 입문한 학생입니다. 선생님의 강의를 수강하며 intellij를 설치하고 실행을 하려고 하였으나 실행 자체가 되지 않아 질문을 드리게 되었습니다.https://drive.google.com/file/d/1tfjp7DYQY5U36GzmkxDoTjTtxfxYfwbs/view spring boot에서 파일을 받은 후프로젝트 JDK 설정과 Gradle JDK 설정 완료 하였습니다. 해당 파일에는 @SringBootApplication과 main이 적용이 안되어 보이는데 이에 대한 해결방법을 찾지 못하였습니다.. 또한 HelloSpringApplication파일에서 실행버튼 활성화도 되지 않고 Edit Configuration을 통해 해결해보고자 하였지만 Main class를 찾을 수 없었으며 오류 메세지조차 뜨지 않습니다 ㅜㅜ build.gradle을 open as project로 열었음에도 같은 오류가 나서 혹시 해결방법이 있나 여쭤보고 싶습니다. 좋은 강의 감사드립니다 :)
-
미해결
애플리케이션 실행 시 오류 발생으로 질문 드립니다.
WARN 30752 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Class org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider호환성 문제인지 뭐가 문제인지 잘모르겠네요..
-
해결됨[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
mmdetection maskRCNN 훈련 예제를 데스크탑에서 적용가능한가요?
mmdetection maskRCNN 코랩 훈련 예제 코드를 폴더 설정만 변경해서 테스크탑 MS vscode 로 돌리면 에러가 발생합니다.inference는 vscode에서 문제 없이 작동하는데, 훈련의 경우는 데스크탑에서는 동작이 안되는 것인지 문의드립니다.
-
해결됨Next.js 필수 개발 가이드 3시간 완성!
auth 에러에 대해서
제목: auth 해보고 있는데 오류가 나오고있네용설명: 저는 prisma를 postgresql로 하고있습니다.그래도 왜 이런 오류가 나오는지 원인은 잘 모르겠네요 내용: auth에서 credentials를 하고 있습니다.import NextAuth from "next-auth";import CredentialsProvider from "next-auth/providers/credentials";import KakaoProvider from "next-auth/providers/kakao";import NaverProvider from "next-auth/providers/naver";import { PrismaAdapter } from "@auth/prisma-adapter";import prisma from "@root/src/server/prisma";import bcrypt from "bcrypt";export const authOptions = { providers: [ CredentialsProvider({ name: "Credentials", credentials: { accountId: { label: "Username", type: "text" }, password: { label: "Password", type: "password" }, email: { label: "Email", type: "email" }, name: { label: "Name", type: "text" }, }, async authorize(credentials, req) { if (!credentials?.email || !credentials.password) { return null; } const exUser = prisma.user.findUnique({ where: { accountId: credentials.accountId as string, email: credentials.email as string, password: credentials.password, name: credentials.name as string, }, }); if (!exUser) return null; const passwordMatch = await bcrypt.compare( credentials.password as string, exUser.password! // 오류 발생 ); return passwordMatch ? exUser : null; }, }), KakaoProvider({ clientId: process.env.KAKAO_CLIENT_ID!, clientSecret: process.env.KAKAO_CLIENT_SECRET!, }), NaverProvider({ clientId: process.env.NAVER_CLIENT_ID!, clientSecret: process.env.NAVER_CLIENT_SECRET!, }), ], adapter: PrismaAdapter(prisma),};const handler = NextAuth(authOptions); // authOptions 오류 발생export { handler as GET, handler as POST }; 이건 제 소스이고,authOptions와 exUser.password! 부분에서 에러가 나오고 있는데 원인을 잘 모르겠습니다. 해당 오류입니다.'Prisma__UserClient<{ id: string; accountId: string | null; name: string | null; email: string | null; emailVerified: Date | null; image: string | null; phone: string; password: string; role: ROLE; } | null, null, DefaultArgs>' 형식에 'password' 속성이 없습니다.ts(2339) 아래는 authOptions 오류입니다. '{ providers: (CredentialsConfig<Record<string, CredentialInput>> | OAuthConfig<KakaoProfile> | OAuthConfig<...>)[]; adapter: Adapter; }' 형식의 인수는 'NextAuthConfig' 형식의 매개 변수에 할당될 수 없습니다.'adapter.linkAccount'의 형식은 해당 형식 간에 호환되지 않습니다.'((account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@aut...' 형식은 '((account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/types").Awaitable<...>) | undefined' 형식에 할당할 수 없습니다.'(account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth...' 형식은 '(account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/types").Awaitable<...>' 형식에 할당할 수 없습니다.'Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/adapters").AdapterAccount | null | undefined>' 형식은 'Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/adapters").AdapterAccount | null | undefined>' 형식에 할당할 수 없습니다.'AdapterAccount' 형식은 'Promise<void> | Awaitable<AdapterAccount | null | undefined>' 형식에 할당할 수 없습니다.'AdapterAccount' 형식에 'Promise<void>' 형식의 then, catch, finally, [Symbol.toStringTag] 속성이 없습니다.ts(2345)const authOptions: { providers: (CredentialsConfig<Record<string, CredentialInput>> | OAuthConfig<KakaoProfile> | OAuthConfig<...>)[]; adapter: Adapter;}혹시 제가 schema 부분에서 오류가 있을까요? model User { id String @id @default(cuid()) accountId String? name String? email String? @unique emailVerified DateTime? image String? phone String @default("") password String @default("") role ROLE @default(USER) accounts Account[] sessions Session[]
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
section09 포트폴리오 git clone으로 받아와서 등록해보면 Failed to fetch 오류가 생기는데 이유가 뭔가요?
오류가 나옵니다new:1 Access to fetch at 'http://backend-practice.codebootcamp.co.kr/graphql' from origin 'http://localhost:3002' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'http://localhost:3000' that is not equal to the supplied origin. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.backend-practice.codebootcamp.co.kr/graphql:1 Failed to load resource: net::ERR_FAILED