묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결대세는 쿠버네티스 (초급~중급편)
쿠버네티스 Pod 접속 관련 문의 드립니다.
안녕하세요 K8S 통신 관련 문의 드립니다. 현재 kubectl get nodes 명령어를 입력 시 다음과 같이 모든 Node에서 Ready 상태가 정상적으로 뜨지만 해당 내용의 YAML파일을 바탕으로 kubectl apply -f nginx-pod.yaml 명령어를 사용하여 해당 Pod 가 정상적으로 생성,동작됨이 확인됩니다. kubectl describe pods my-nignx-pod 명령어를 사용하여 해당 pod의 IP주소를 확인하였고 curl 20.102.133.4 명령어를 통해 해당 pod로 접속시도를 해보았으나 다음과 같이 응답을 하지 않습니다. 혹시나 싶어 해당 Pod가 있는 VM의 IP 주소인 10.0.0.6 으로 Ping 테스트를 해보았을때는 Ping은 이상없이 잘 동작합니다. 해당 Pod에 대한 접속 방법에대해 말씀해주시면 감사하겠습니다. 감사합니다.
-
미해결[리뉴얼] 처음하는 파이썬 백엔드와 웹기술 입문 (파이썬 중급, flask[플라스크] 로 이해하는 백엔드 및 웹기술 기본) [풀스택 Part1-1]
안녕하세요 404 error 관련해서 질문드립니다.
안녕하세요 선생님 항상 강의 잘 듣고 있습니다. 다름이 아니라 404 Not found 에러 때문에 질문드립니다. 실행은 잘 되는 것 같은데 저 보라색으로 가려진 링크를 눌러도 404 error 가 뜨고 Localhost:8080/hello/test 로 실행을 하여도 같은 에러가 뜹니다.. 선생님 코드와 비교했을 때 틀린 점이 없었고 강의도 다시 들었는데 영문을 모르겠습니다. User is not defined 라는 에러 때문에 User라는 클래스를 선언해주었던 것빼고 차이가 없는데 이 떄문인지 여쭙고자 질문드렸습니다. 감사합니다 건강하세요! *** localhost:8080/test 라고 치면 정상작동 됐습니다. 감사합니다! 근데 한 가지 더 질문 드리고 싶은데 선생님 화면과는 다르게 localhost:8080/blog/test 라고 치면 왜 404 not Found라고 뜨는지 궁금합니다. render_blueprint( , url_prefix = '/blog')로 해놓았는데 이 경우 app.route로 /blog 도 따로 설정을 안해줘서 오류가 뜨는 것일까요? * 실행 후 화면 * CODE 내용
-
미해결PHP 7+ 프로그래밍
FILTER_VALIDATE FILTER_SANITIZE 차이를 모르겠습니다.
각각 뭔지에 대한 설명이 부족한 것 같습니다 ㅜㅜ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Transactional generate key 질문
안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Exception 질문입니다
SQLException 와 ConnectException 부모로 SCException 같은 것을 하나 만들어서 throws SCException 하는 것은 안좋은 방법인가요 ??? 그러면 체크 예외를 체크할 수 있으면서 다른 기술에도 의존하지 않게 되지 않나요 ??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 업데이트시 수정부분을 알려주시면 감사합니다.!
제가 아날로그 인간이라 ㅠㅠ 기존에 프린트까지해서 적는 사항이라. 단순히 어떤 " 부분" 수정되었다기 보단 몇페이지의 어디가 어떻게 수정되었다고 comment 달아주실수 없으실까요? 메번 찾아서 수정하기가 힘드네요 ㅠㅠ 감사합니다!
-
미해결Slack 클론 코딩[실시간 채팅 with React]
route path 수정 후 흰 화면만 보입니다ㅠㅠ
url 로 정보가 보일 수 있게 수정하던 중에 흰색 화면만 보이고, 아무런 콘솔도 뜨지 않습니다ㅠㅠ <Route path="/workspace/:workspace" element={<Workspace />} /> 일때는 빈 화면인데, 아래와 같이 다시 수정하면 슬랙화면이 보입니다 <Route path="/workspace" element={<Workspace />} /> react routerv6 path parameter blank page 검색어와 같이 이슈를 찾아보았는데 해결이 되지 않아 이렇게 질문 남깁니다ㅠㅠ
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
이전 질문에 연장되는 질문입니다.
안녕하세요 조현영님. 주말에도 답변 계속 달아주셔서 감사드립니다. 정말 도움이 많이됩니다! 저번 질문에서 제가 리뷰와 이미지 사이의 관계를 여쭤봤을 때 조현영님께서 리뷰와 이미지 사이의 관계는 일대다라고 하셨었죠. 이렇게 되면 리뷰쪽 컬럼에는 oneToMany, 이미지 쪽에는 ManyToOne이 붙게 되어 더불어 JoinColumn까지 이미지 쪽에 붙게 됩니다. 그러면 이미지 쪽에 리뷰에 관한 외래키 컬럼이 생성됩니다. 그런데 저는 여기서 위와 똑같은 방식으로 리뷰 대신 문의의 관련된 엔티티와 리뷰와 이미지를 관계 설정한것 처럼 똑같이 하려 합니다. 그러면 결국에 이미지 쪽에는 리뷰에 관한 외래키 컬럼과 문의에 관한 외래키 컬럼이 생기게 되는 것이죠. 여기서가 핵심인데 이렇게 되면 이미지 엔티티에는 리뷰, 문의가 공존하게 되는데 만약 리뷰가 있을시 문의의 외래키 컬럼에는 null값으로 존재하게 되고 문의가 있을시 리뷰의 외래키 컬럼에는 null값으로 존재합니다. 그리고 이미지에 추가적으로 상품 이미지 역시 존재합니다. 이러면 이미지 엔티티에 세 개(상품, 리뷰, 문의)의 외래키 컬럼이 존재하게 되는데 만약에 한 개의 컬럼에 값이 존재할 때 나머지 두개는 null값인 형태입니다. 그래서 제 결론은 이미지 엔티티 하나에 세 개의 외래키를 전부 넣는것이 아닌 예를 들어 상품 이미지 엔티티, 리뷰 이미지 엔티티, 문의 이미지 엔티티 이런식으로 엔티티를 각각 만들어야 할거 같은데 실무에서는 어떻게 해결하는지 조현영님의 의견이 궁금합니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
강의 내용 외 크롤링 질문입니다.
1.엑셀 파일에 저장되어있는 url을 list 형식으로 가져온다. 2. 가져온 url들을 '상품' 열에 str형식으로 저장한다. 3. 가져온 url 에 접속하여 크롤링하여 해당 url 행에 각각의 컬럼에 해당하는 값을 저장한다. 위의 3개의 과정을 코드로 작성해보았는데 작동이 되질 않아 뭐가 문제인지 잘 모르겠습니다 ㅠㅠ import requests from bs4 import BeautifulSoup import time import openpyxl import pandas as pd import numpy as np import os #url 추출 excel_source = pd.read_excel('example_2.xlsx') df=pd.DataFrame(excel_source) url = df['상품'] item_url = list(url) for i in item_url: response = requests.get(i) html = response.text soup = BeautifulSoup(html, 'html.parser') wb = openpyxl.Workbook() ws = wb.create_sheet("네이버쇼핑크롤링") ws.append(["상품", "썸네일", "상품명","카테고리","소비자가","판매가","배송비","리뷰수","사용자총평점","상품정보","상품번호","제조사","모델명","원산지","상품상태","브랜드","제조일자","판매자정보","상호명","사업자등록번호","사업장소재지","대표자","통신판매업번호"]) infos = soup.select("div._2-I30XS1lA ") for s in range(0,len(item_url)+1): ws.append([item_url[s]]) for z,info in enumerate(infos,1): #상품 #썸네일 #상품명 item_name = info.select_one("div.CxNYUPvHfB").text ws.append([z,df,item_name]) wb.save("naver_store.xlsx")
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
RUN이 되지 않습니다
Ctrl+F5를 눌러서 실행할려고 했더니 일반텍스트 디버깅에 대한 확장이 설치되어 있지 않다고 하는데 어떤 확장을 설치해야 할까요? 아톰은 script를 찾을수가 없어서 못깔아서 VScode 로 실습중인데 처음부터 막히니 막막하네요 ㅜㅜ
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
docker-compose 와 Dockerfile
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 제목 그대로 Dockerfile 이 꼭있어야 docker-compose 도 할 수 있는 건가요? 아니면 docker-compose 단독으로 사용이 가능한가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
컨트롤러 안의 메소드는 어떻게 맵핑이 이루어지는 건가요?
Controller는 객체니까 Map 컬렉션에 저장되어 맵핑 작업에 사용될 수 있는 건 이해가 갑니다. 하지만 Controller안의 method는 어떻게 맵핑이 이루어지는 건가요? 예를 들어 @Controller @RequestMapping("/hello") public class SampleController { @RequestMapping("/world") public void sampleMethod() { } } 일 때 /hello/world로 요청이 들어오면 맵핑을 통해 SampleController를 찾아낼 것입니다.그 다음 sampleMethod()를 찾아내서 호출해야 하는데 이 작업은 어떤 식으로 이루어지는 거죠?강의에는 Controller를 찾는 것까지만 나와있어서 method는 어떻게 찾아지는지 궁금합니다.
-
미해결Java TPC 실전프로젝트 (Java API 활용)
InputStream is = Project01_C.class.getResourceAsStream(src) 경로에 대해서
1. 지금 이 방법은 Project01_C 클래스와 info.json 파일의 경로가 같을 때만 사용할 수 있는 방법인가요 ? 2. 제가 알기로 외부 파일 읽을때는 try - catch 나 throws 로 처리해야 되는 걸로 알고 있는데 이건 예외처리 방식이 좀 다른이유는 뭘까요 ?? 3, 그리고 InputStream close는 안해줘도 되나용 ??
-
미해결자바스크립트 : 기초부터 실전까지 올인원
질문 있습니다
replit 에서 강의따라 코드작성해보고 run 하는데 오른쪽에 결과가 안떠요...! 뭐가 문제일까요.. 처음부터 막히네요;
-
미해결반응형 웹사이트 포트폴리오(Architecture Agency)
hiring button의 comment-dots image issue
hiring button에서 comment-dots image 가 화면에 안 나타납니다. 기본적인 부분인데 이유를 모르겠어서 요청 드립니다. index.html 과 style.css 풀 코드 올립니다. index.html: <!doctype html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title>bizpage website - Architecture</title> <script src="js/jquery-2.1.4.js"></script> <!-- Page scroll Effects JS & CSS --> <script src="js/velocity/modernizr.js"></script> <script src="js/velocity/velocity.min.js"></script> <script src="js/velocity/velocity.ui.min.js"></script> <script src="js/velocity/main.js"></script> <link rel="stylesheet" href="js/velocity/velocity.css"> <!-- Smooth Scrolling --> <script src="js/jquery.scrollTo.min.js"></script> <!-- Custom JS & CSS --> <script src="custom.js"></script> <link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="responsive.css"> </head> <!-- hijacking: on/off - animation: none/scaleDown/rotate/gallery/catch/opacity/fixed/parallax --> <body data-hijacking="on" data-animation="rotate"> <div class="container"> <section class="cd-section visible" id="home"> <div> <div class="content"> <img src="images/temp-section-01.jpg"> </div> </div> </section> <section class="cd-section" id="about"> <div> <div class="content"> <img src="images/temp-section-02.jpg"> </div> </div> </section> <section class="cd-section" id="project"> <<div> <div class="content"> <img src="images/temp-section-03.jpg"> </div> </div> </section> <section class="cd-section" id="plan"> <div> <div class="content"> <img src="images/temp-section-04.jpg"> </div> </div> </section> <section class="cd-section" id="awards"> <div> <div class="content"> <img src="images/temp-section-05.jpg"> </div> </div> </section> <section class="cd-section" id="location"> <div> <div class="content"> <img src="images/temp-section-06.jpg"> </div> </div> </section> <section class="cd-section" id="contact"> <div> <div class="content"> <img src="images/temp-section-07.jpg"> </div> </div> </section> <header class="active"> <div class="gnb-inner"> <div class="logo active">bizpage</div> <div class="gnb active"> <div class="menu"> <a href="#home">Home</a> <a href="#about">About</a> <a href="#project">Project</a> <a href="#plan">Plan & History</a> <a href="#awards">Awards</a> <a href="#location">Location</a> <a href="#contact">Contact</a> </div> <div class="slogan">We think different and make different.</div> </div> <div class="trigger active"> <span></span> <span></span> <span></span> </div> </div> </header> </div> <a href="#" class="gototop active"><img src="images/gototop.png"></a> <a href="" class="btn-hiring"><i class="fa-duotone fa-comment-dots"></i>Hiring</a> <nav> <ul class="cd-vertical-nav"> <li><a href="#0" class="cd-prev inactive">Next</a></li> <li><a href="#0" class="cd-next">Prev</a></li> </ul> </nav> </body> </html> style.css: /* Google Web Font : Montserrat */ @import url('https://fonts.googleapis.com/css2?family=Nanum+Gothic&family=Nunito&family=Open+Sans&display=swap'); @import url('https://fonts.googleapis.com/css?family=Montserrat:200,300,400,500&display=swap'); @import url('https://fonts.googleapis.com/css?family=Manrope:300,400,500,600&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@200;300;400;600;700;900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Overpass&display=swap'); /* FontAwesome CDN 4.7 */ @import url('https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'); /* Reset CSS */ * { box-sizing: border-box;} ul {list-style: none;} a {text-decoration: none;} /* Default CSS */ body { font-family: 'Mondtserrat', 'sans-serif'; color: #222; font-size: 15px; margin: 0; height: 100vh; background-color: #fff; } /* Entire Layout */ .cd-section { height: 100vh; } .cd-section > div { height: 100%; position: relative; } .content { background-color: #ddd; position: absolute; width: calc(100% - 40px); height: calc(100% - 80px); left: 20px; bottom: 20px; overflow: hidden; } /* Header */ header { position: fixed; top: 0; left: 0; width: 100%; z-index: 100; } .gnb-inner { /* border: 1px solid #000; */ width: calc(100% - 40px); margin: auto; height: 60px; line-height: 60px; } .logo { font-size: 2.4rem; font-weight: bold; color: #066bf7; float: left; } /* .logd img { padding-top: 17px; } */ .gnb { float: right; } .menu { display: none; } /* .menu a {} */ .slogan { font-style: italic; font-size: 16px; float: right; } .trigger { display: none; } /* Hiring Button */ .btn-hiring { position: fixed; right: 30px; bottom: 30px; color: #fff; background-color: #000; padding: 10px 20px; border-radius: 20px; box-shadow: 5px 5px 20px rgba(0, 0, 0, 0.38); transition: 0.5s; } .btn-hiring .fa-duotone { transform: rotateY(180deg); margin-right: 5px; } .btn-hiring:active { transform: scale(0); }
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
잠재요인 기반에서 normal함수 이용시
안녕하세요! 수업 잘 듣고 있습니다! P값 q값을 초기화해주는 부분에서, np.random.normal 함수를 이용할 때, scale = 1/K (K=잠재요인 개수)를 설정합니다. 여기서 scale을 이렇게 설정하는 이유가 궁금합니다. 정규화 또는 표준화하는 것으로 생각되는데, K는 단위와 상관이 없어 scale문제가 발생하지 않을 것 같은데, 이를 설정하는 이유를 알 수 있을까요
-
미해결Java TPC 실전프로젝트 (Java API 활용)
JSONObjct를 쓰는 이유 ??
Gson 을 쓸 때는 BookDTO 에 맞춰서 문자열을 객체화 시킬 수 있구나 생각해서 이해가 됬는데 JSONOBject는 사용자가 정의한 객체가 아닌 그냥 JSON타입의OBject 객체 인거 같은데 JSONOBject를 쓰면 좋은 점이 있나요 ?
-
미해결다양한 사례로 익히는 SQL 데이터 분석
ModuleNotFoundError: No module named 'psycopg2' 오류
안녕하세요. 권철민 선생님! 시각화 개요 - 시각화 - PostgresSQL 과 Pandas 연계하기 강의 중 그림과 같이 오류가 나오고 있습니다. 비밀번호는 강의와 똑같이 'postgres' localhost도 그림처럼 5433으로 되어 있습니다. 이전 강의에서 쿼리는 문제가 없었는데 어떤 이유로 오류가 났을지 궁금합니다!
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
ADD_COMMENT_SUCCESS acrtion이 실행되지 않는 질문드립니다.
ADD_COMMENT_REQUEST action은 아래와 같이 정상적으로 data도 전달하고 동작하는데 ADD_COMMENT_SUCCESS action이 실행되면 아래와 같은 오류가 발생해서 action이 실행되지 않는건 물론이고 다른 action도 동작하지 않는 문제가 발생해서 질문드립니다. // action 발생 컴포넌트 import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; import { Button, Form, Input, Row } from 'antd'; import { useSelector, useDispatch } from 'react-redux'; import { addCommentRequestAction } from '../../reducers/post'; const CommentForm = ({ mainPosts }) => { const dispatch = useDispatch(); const { addCommentLoading } = useSelector((state) => state.post); const id = useSelector((state) => state.user.me?.id); const [form] = Form.useForm(); const onSubmitComment = useCallback((value) => { console.log(value.comment, mainPosts.id, id); dispatch(addCommentRequestAction({commentText: value.comment, postId: mainPosts.id, userId: id})); form.resetFields(); }, []); return ( <> <Form form={form} name="writeComment" onFinish={onSubmitComment} > <Form.Item name="comment" rules={[ { type: 'text', }, ]} > <Input.TextArea placeholder='댓글을 입력하세요.' showCount maxLength={100} rows={2} /> </Form.Item> <Row align='end'> <Button type='primary' htmlType='submit' loading={addCommentLoading} > 등록 </Button> </Row> </Form> </> ) }; CommentForm.propTypes = { mainPosts: PropTypes.shape({ id: PropTypes.string, User: PropTypes.object, title: PropTypes.string, desc: PropTypes.string, content: PropTypes.arrayOf(PropTypes.object), Images: PropTypes.arrayOf(PropTypes.object), tag: PropTypes.string, Comments: PropTypes.arrayOf(PropTypes.object), }) }; export default CommentForm; // reducers/post.js import produce from 'immer'; import shortId from 'shortid'; export const initialState = { mainPosts: [{ id: 1, User: { id: 1, nickname: 'ZeroCho' }, title: '돼지고기 갈비찜', desc: '한국인이 좋아하는 대표 고기 요리 갈비찜 레시피!!', content: [{ ingredient: '주 재료 = 갈비 600g, 당근 20g, 은행 10알, 밤 10개, 파 1대, 양파 50g, 양념장 재료 = 간장 3큰술, 설탕 2큰술, 육수 12큰술, 다진 생강 1작은술, 깨소금 2큰술, 청주 ¼컵, 다진 마늘 3큰술, 참기름 1큰술, 후춧가루 약간', }, { recipes: '갈비는 사방 5㎝ 크기로 썰어 기름기를 제거한다., 기름기를 없앤 갈빗살에 칼집을 낸 다음 찬물에 30분~한 시간쯤 담가 핏물을 빼주고, 혹시 모를 절단 과정에서 섞인 뼛가루나 뼛조각을 제거해준다. 이 핏물 빼는 과정을 속성으로 하고 싶으면, 한 번 끓여 데치는 거로 대체해도 되긴 된다, 끓는 물에 핏물을 뺀 갈비와 토막 낸 양파·파를 넣어 속까지 익을 때까지 삶아낸다. 중간에 젓가락으로 고기를 찔러보아 핏물이 나오는지 확인한다. 핏물이 나오면 고기가 덜 익은 것., 고기가 익으면 체에 받친다. 이 국물은 걸러서 지저분한 것을 제거하고 양념장의 육수로 이용한다. 갈비는 사방 5㎝ 크기로 썰어 기름기를 제거한다., 기름기를 없앤 갈빗살에 칼집을 낸 다음 찬물에 30분~한 시간쯤 담가 핏물을 빼주고, 혹시 모를 절단 과정에서 섞인 뼛가루나 뼛조각을 제거해준다. 이 핏물 빼는 과정을 속성으로 하고 싶으면, 한 번 끓여 데치는 거로 대체해도 되긴 된다, 끓는 물에 핏물을 뺀 갈비와 토막 낸 양파·파를 넣어 속까지 익을 때까지 삶아낸다. 중간에 젓가락으로 고기를 찔러보아 핏물이 나오는지 확인한다. 핏물이 나오면 고기가 덜 익은 것., 고기가 익으면 체에 받친다. 이 국물은 걸러서 지저분한 것을 제거하고 양념장의 육수로 이용한다.' }, { tips: '갈비를 한 번 끓여서 핏물이나 기름기를 어느 정도 빼준 후, 재료들을 압력밥솥에 싹 때려넣고 그대로 푹 익혀버리면 질긴 고기가 녹아드는 수준이 되어 부드럽게 먹을 수 있다.' }], Images: [{ src: 'https://recipe1.ezmember.co.kr/cache/recipe/2015/06/03/f6551b241deba537266c7dfe668e09821.jpg', }, { src: 'https://recipe1.ezmember.co.kr/cache/recipe/2017/09/15/af5ed61b01ce6d0c8ded20d59f0d15e31.jpg', }, { src: 'https://www.cj.co.kr/images/theKitchen/PHON/0000002320/0000009726/0000002320.jpg', }], tag: '맛있을것같아요 #hashtag1 짱짱맨!! #hashtag2 ##hashtag3', Comments: [{ User: { nickname: 'AppleLover', }, content: '우와 정말 맛있을것 같아요 ㅎㅎ', }, { User: { nickname: 'Nightmare', }, content: '오늘 저녁은 갈비찜이다!!', }] }], imagePaths: [], addPostLoading: false, addPostDone: false, addPostError: null, addCommentLoading: false, addCommentDone: false, addCommentError: null, }; const dummyPost = (data) => ({ id: shortId.generate(), User: { id: 2, nickname: 'Mirrer', }, title: data.title, desc: data.desc, content: [{ ingredient: data.ingredient, }, { recipes: data.recipes, }, { tips: data.tips, }], tag: data.tags, Images: [{ src: 'https://www.hongcheon.go.kr/site/tour/images/contents/cts1927_img1.jpg' }, { src: 'https://t1.daumcdn.net/cfile/tistory/1837BE1A4BF1BA073F' }], Comments: [{ User: { nickname: 'Korean', }, content: '역시 한국인은 밥심이죠 ㅎㅎ', }], }); const dummyComment = (data) => ({ User: { id: 2, nickname: 'Mirrer', }, content: data, }); export const ADD_POST_REQUEST = 'ADD_POST_REQUEST'; export const ADD_POST_SUCCESS = 'ADD_POST_SUCCESS'; export const ADD_POST_FAILURE = 'ADD_POST_FAILURE'; export const ADD_COMMENT_REQUEST = 'ADD_COMMENT_REQUEST'; export const ADD_COMMENT_SUCCESS = 'ADD_COMMENT_SUCCESS'; export const ADD_COMMENT_FAILURE = 'ADD_COMMENT_FAILURE'; export const addPostRequestAction = (data) => { console.log('reducer'); return { type: ADD_POST_REQUEST, data, } }; export const addCommentRequestAction = (data) => { console.log('reducer'); return { type: ADD_COMMENT_REQUEST, data, } }; const reducer = (state = initialState, action) => { return produce(state, (draft) => { switch (action.type) { case ADD_POST_REQUEST: draft.addPostLoading = true; draft.addPostDone = false; draft.addPostError = null; break; case ADD_POST_SUCCESS: draft.mainPosts.unshift(dummyPost(action.data)); draft.addPostLoading = false; draft.addPostDone = true; break; case ADD_POST_FAILURE: draft.addPostLoading = false; draft.addPostError = action.error; break; case ADD_COMMENT_REQUEST: draft.addCommentLoading = true; draft.addCommentDone = false; draft.addCommentError = null; break; case ADD_COMMENT_SUCCESS: { const post = mainPosts.find((v) => v.id === action.data.postId); post.Comments.unshift(dummyComment(action.data.commentText)); draft.addCommentLoading = false; draft.addCommentDone = true; break; } case ADD_COMMENT_FAILURE: draft.addCommentLoading = false; draft.addCommentError = action.error; break; default: return state; } }); }; export default reducer; // sagas/post.js import { all, fork, delay, put, takeLatest } from 'redux-saga/effects'; // import axios from 'axios'; import { ADD_POST_REQUEST, ADD_POST_SUCCESS, ADD_POST_FAILURE, ADD_COMMENT_REQUEST, ADD_COMMENT_SUCCESS, ADD_COMMENT_FAILURE } from '../reducers/post'; // function addPostAPI(data) { // return axios.post('/api/post', data); // } function* addPost(action) { try { // const result = yield call(addPostAPI, action.data); yield delay(1000); yield put({ type: ADD_POST_SUCCESS, data: action.data, }) } catch(err) { yield put({ type: ADD_POST_FAILURE, data: err.response.data }) } } // function addCommentAPI(data) { // return axios.post(`/api/post/${data.postId}/comment`, data); // } function* addComment(action) { console.log(action); try { // const result = yield call(addCommentAPI, action.data); yield delay(1000); yield put({ type: ADD_COMMENT_SUCCESS, data: action.data, }) } catch(err) { yield put({ type: ADD_COMMENT_FAILURE, data: err.response.data }) } } function* watchAddPost() { yield takeLatest(ADD_POST_REQUEST, addPost); } function* watchAddComment() { yield takeLatest(ADD_COMMENT_REQUEST, addComment); } export default function* postSaga() { yield all([ fork(watchAddPost), fork(watchAddComment), ]); }
-
미해결iOS/Android 앱 개발을 위한 실전 React Native - Basic
ios 구동했을 때 Welcome to React가 아니라 애플
ios 구동했을 때 Welcome to React 화면이 아니라 아이폰 기본화면만 나오네요. 그래서 선생님이 Step one 을 two three 로 바꿔도 저는 화면에 안나와요. cmd d 눌러도 안나오네요. 어떻게 해야햐나요?