묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
like/unlike 사가 오류 질문
안녕하세요 현영님! 좋아요 기능 구현 실습하면서 다음과 같은 오류가 발생했습니다. 오류 메시지를 통해서 사가쪽에서 발생하는 오류라는 것은 알 수 있었는데, 현영님 깃헙과 비교하면서 찾아봐도 어디서 잘못됐는지 확인할 수 없어서 질문드립니다ㅠ 사가 코드 import axios from "axios"; import { call, put, fork, takeLatest, all, throttle } from "redux-saga/effects"; import { ADD_POST_PENDING, ADD_POST_SUCCESS, ADD_POST_ERROR, ADD_COMMENT_PENDING, ADD_COMMENT_SUCCESS, ADD_COMMENT_ERROR, REMOVE_POST_PENDING, REMOVE_POST_SUCCESS, REMOVE_POST_ERROR, LOAD_POSTS_PENDING, LOAD_POSTS_ERROR, LOAD_POSTS_SUCCESS, LIKE_POST_PENDING, LIKE_POST_SUCCESS, LIKE_POST_ERROR, UNLIKE_POST_PENDING, UNLIKE_POST_SUCCESS, UNLIKE_POST_ERROR } from "../reducers/post"; import { ADD_POST_TO_ME, REMOVE_POST_OF_ME } from "../reducers/user"; //-------------------------------------------- function loadPostsAPI() { return axios.get("/posts"); } function* loadPosts(action) { try { const result = yield call(loadPostsAPI); yield put({ type: LOAD_POSTS_SUCCESS, data: result.data }); } catch (err) { yield put({ type: LOAD_POSTS_ERROR, data: err.response.data }); } } function* watchLoadPosts() { yield throttle(5000, LOAD_POSTS_PENDING, loadPosts); } function addPostAPI(data) { return axios.post(`/post`, { content: data }); } function* addPost(action) { try { console.log("addPost 함수 실행"); const result = yield call(addPostAPI, action.data); // const id = shortId.generate(); console.log("axios 통신을 마쳤습니다.", result); yield put({ type: ADD_POST_SUCCESS, data: result.data }); yield put({ type: ADD_POST_TO_ME, data: result.data.id }); } catch (err) { yield put({ type: ADD_POST_ERROR, data: err.response.data }); } } function* watchAddPost() { console.log("watchAddPost 실행"); yield takeLatest(ADD_POST_PENDING, addPost); } function removePostAPI(data) { return axios.delete(`/post/${data}`); } function* removePost(action) { try { console.log(action.data); const result = yield call(removePostAPI, action.data); yield put({ type: REMOVE_POST_SUCCESS, data: result.data // id }); yield put({ type: REMOVE_POST_OF_ME, data: action.data }); } catch (err) { yield put({ type: REMOVE_POST_ERROR, data: err.response.data }); } } function* watchRemovePost() { yield takeLatest(REMOVE_POST_PENDING, removePost); } //-------------------------------------------- function addCommentAPI(data) { return axios.post(`/post/${data.postId}/comment`, data); } function* addComment(action) { try { const result = yield call(addCommentAPI, action.data); yield put({ type: ADD_COMMENT_SUCCESS, data: result.data }); } catch (err) { console.error(err); yield put({ type: ADD_COMMENT_ERROR, data: err.response.data }); } } function* watchAddComment() { yield takeLatest(ADD_COMMENT_PENDING, addComment); } //-------------------------------------------- function likePostAPI(data) { axios.patch(`/post/${data}/like`); } function* likePost(action) { try { console.log("좋아요 사가 액션 데이터", action.data); const result = yield call(likePostAPI, action.data); console.log("좋아요 사가 result 데이터", result.data); yield put({ type: LIKE_POST_SUCCESS, data: result.data // {PostId, UserId} 11, 2 }); } catch (err) { console.error(err); yield put({ type: LIKE_POST_ERROR, data: err.response.data }); } } function* watchLikePost() { yield takeLatest(LIKE_POST_PENDING, likePost); } //-------------------------------------------- function unlikePostAPI(data) { axios.delete(`/post/${data}/like`); } function* unlikePost(action) { try { console.log("좋아요 취소 사가 액션 데이터", action.data); const result = yield call(unlikePostAPI, action.data); console.log("좋아요 취소 사가 result 데이터", result.data); yield put({ type: UNLIKE_POST_SUCCESS, data: result.data }); } catch (err) { console.error(err); yield put({ type: UNLIKE_POST_ERROR, data: err.response.data }); } } function* watchUnlikePost() { yield takeLatest(UNLIKE_POST_PENDING, unlikePost); } //-------------------------------------------- export default function* postSaga() { yield all([ fork(watchLikePost), fork(watchUnlikePost), fork(watchAddPost), fork(watchAddComment), fork(watchRemovePost), fork(watchLoadPosts) ]); } PS. 1. 서버쪽에서는 요청을 받아서 성공적으로 응답을 보내주고, DB에도 좋아요가 잘 추가가 됩니다. 터미널 로그 DB 좋아요 테이블 2. 브라우저에서는 위의 오류가 발생하고 새로고침하면 좋아요 기능이 적용되어 있습니다.
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
자식 컴포넌트를 호출할때 매개변수는 넣을 수 없나요?
자식 컴포넌트를 호출할때 매개변수는 넣을 수 없나요?
-
미해결안드로이드 모바일 앱 모의해킹과 시큐어코딩
정적 분석 환경구성 필요 파일 다운로드 문의
정적 분석 환경구성 강의에서 사용하는 프로그램들은 그냥 검색해서 각각 다운로드 해야하나요 ? 아니면 인프런에서 일괄적으로 다운로드 할 수 있는 곳이 있나요 ?
-
미해결스프링 핵심 원리 - 기본편
간단한 질문입니다
이게 강사님 꺼에는 왼쪽 run창에 Test Results 밑에 ApplcationContextSame이 뜨고 그 밑에 특정 타입을 모두 종료하기 창이 뜨고 우측에 간단하게 key = mem~ @37c7595 key=mem~@3ed24a4 beansOfType = ~ 이렇게해서 3줄만뜨던데 커뮤니티버전이랑 얼티밋? 버전 차이라서 이렇게 나오는건가요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
React Nodebird때 만들었던 Follow기능(=many to many)질문 입니다 (Sequelize vs Typeorm)
안녕하세요? 제로초님 노드버드 강의를 완강하고, 어느새 sleact 강좌도 마무리 시점이 와가네요. 항상 감사합니다 이번 typeorm관계설정 강의를 듣다가 궁금한점이 생겼는데 도저히 해결이 되지않아 이렇게 질문을 드립니다. 노드버드 강좌에서 팔로워/팔로이 기능을 model에서 정의할때 Sequelize로 아래와 같이 belongsToMany에 as 와 through를 이용해서 설정했었는데요, // 관계 설정 User.associate = (db) => { ... db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followers', foreignKey: 'followingId' }); db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'followerId' }); // 같은 테이블에서 다대다 관계일때는 foreignKey넣어주어야 됨 // WHY? : 자바스크립트 객체에서 구별하는 이름이 as이고, DB에서는 foreignKey를 이용해 구별한다. }; Typeorm에서 이와같이 user대user 관계에서 팔로우 기능을 구현해보려고 스스로 학습중인데, 검색해도 나오지를 않고 어떻게 해야할지 감이 안잡히네요... Typeorm에는 Sequelize처럼 이렇게 편리한 기능이 없는것인거겠죠? ㅠ 만약 Typeorm에서 제공하는 as 나 Through기능이 없다면, Typeorm에서는 노드버드에서와 같은 팔로워/팔로이 기능을 어떻게 구현해야할지 궁금합니다!
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
구현 방식 질문
안녕하세요 선생님! 구현 방식에 있어 질문드릴게 있습니다. 1. 저는 c 문법만 알고, c++문법은 모르는 상태인데요, 그래서 이전 문제들도 vector가 아닌 전부 배열로 해결하였습니다. 혹시 앞으로 스택 등의 자료구조 를 사용하는 문제가 있는것 같은데, c문법만으로도 해결해도 문제 없는지 궁금합니다. 2. 또한 전역변수는 되도록 사용하지 않는것이 좋다고 알고있어, 지금까지의 모든 문제를 동적할당으로 배열을 할당하여 해결하였는데요, 실제 코딩테스트 문제를 해결할 때 동적할당을 금지하는 방식으로 조건이 주어지기도 하는지 여쭤보고 싶습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿에서 http 메서드 질문드립니다.
Get/Post/Put/Patch 등등 메서드가 여러개 있는데 쿼리파라미터 이용하면 무조건 Get, html form 이용하면 무조건 Post 이런 식으로 메서드가 정해져있는건가요 ? 그리고 서블릿 자체에서는 이것들이 어떻게 들어오는지 인식하고 각각 처리 하는건가요 ? 자바 소스로 따로 put인경우 , get인 경우 등 나눠주지 않았는데 어떻게 인식하는지가 궁금합니ㅏㄷ.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
c++을 공부하다가 와서 좀 당황스런 질문일지 모르겠지만 조심스레 해봅니다.
이전 switch문 강좌에서 이랬나? 하며 넘어갔다가 다시 생각해보니 c++에서는 분명 문자열이 안되는 게 떠올라서 질문 남겨봅니다. c++에선 스위치문에서 문자열이 안되던 이유가 롤업 테이블 생성에 있어 인덱스로 지정이 안되서 그랬던 걸로 기억을 하는데 c#에선 이런 부분을 어떻게 극복했길레 문자열을 사용할 수 있는 지 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C언어
for문을 while문으로 변환했는데 실패함.
void display(char cr, int lines, int width) { int row, col; row = 1; col = 1; while (1) { if (row > lines) break; while (1) { if (col > width) break; printf("%c", cr); col++; } printf("\n"); row++; } } // //void display(char cr, int lines, int width) //{ // int row, col; // // for (row = 1; row <= lines; row++) // { // for (col = 1; col <= width; col++) // putchar(cr); // printf("c", cr); 과 동일한 기능을 한다. // putchar('\n'); // printf("\n"); 와 동일한 기능을 한다. // } //} 아래 for문을 위의 while문으로 바꿨는데 정상 작동 안합니다. while은 일부러 무한 루프로 잡았구요 제가 조건식을 넣고 싶어서 그랬습니다. A 5 5같이 입력해도 첫줄만 정상 출력되고 여백이 생기네요. 어디가 문제인거죠?
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
pk, *args, **kwargs 질문
안녕하세요! 먼저 좋은 강의 감사드립니다. Django를 처음 접했는데 좋은 선생님을 만나서 차근차근 잘 배운 것 같습니다. 몇 가지 궁금한 점 알려주실 수 있으실까요? 1. templates/base.html에서 {% for message in messages %} 와 {{message}}부분이 나오는데 이건 어디서 가져오는 건지 궁금합니다. 2. templates/header.html에서 {% ~ pk=user.pk %}구문이 있는데 user.pk는 어디서 가져오는 건지 연결 관계가 궁금합니다 또 ?next={{request.path}}구문에서 request.path는 어디서 가져오는 건지 연결관계가 궁금합니다.. 3. subscribeapp/views.py에서 def get_redirect_url(self. *args, **kwargs): return reverse ('projectapp:detail', kwargs={'pk':self.request.GET.get('project_pk')}) 에서 *args, **kwargs를 검색해보니 임의의 값, 임의의 복수 값을 받을 때 쓰는 거라고 하는데 이 구문이 잘 이해가 되지 않습니다 4. projectapp/urls.py에서 path('detail/<int:pk>', ~), 에서 <int:pk>는 어디서 받아오는 것인지 궁금합니다 5.projectapp/templates/snippets/pagenation.html 에서 ?page={{page_obj.number}} {{page_obj.previous_page_number}} 가 잘 이해가 되지 않습니다.. 이것들은 어디서 받아오는 것인지요?? 그리고 이해하려고 전체 코드도 몇번 읽고 검색도 해봤는데 해결이 되지 않아 질문 드립니다 혼자 독학하는 코린이인데 연결관계 부분만 이해하면 지금보다 잘 할 수 있을 것 같아 도움 요청합니다 좋은 강의 올려주셔서 감사합니다
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
AWS 터미널 사용에 대한 질문입니다!
배포하는 과정을 윈도우OS로 따라하고 있습니다. 그런데 저는 소스를 터미널에 복사,붙여넣기가 안되는데 따로 설정이 필요한가요? 환경변수에서 오타날까봐 그대로 따라치기가 두렵네요 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Validation시 질문
안녕하세요 스앵님~ 전적으로 신뢰하고 있습니다 ... 다른게 아니라 valdation을 @NotEmpty 어노테이션으로 사용을 수업시간에 해보았는데 많은 validation 기능이 잇더라고요 Pattern도 있고, Length도 있고 size도 있는데 이렇게 많아지는 경우에 직접 코드를 물론 작성하는 것보다는 편하겟지만 좀 더러워(?)진다고 볼 수 가 있나요 ? 그런 경우에 대해서는 혹시 좋은 방법이 있을까요 선생님~
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
대문자로 바뀐 걸 일렬로 정렬하고 싶습니다.
print(n) 하면 FINEAPPLE < 이렇게 출력되면 좋겠는데 지금은 E만 출력됩니다. 말씀해주신 join 메소드를 사용해도 변함이 없습니다... 혹시 몰라 name을 리스트로 바꿔봤는데도 같습니다,, 어찌저찌 += 로 붙이는건 성공했지만 .join은 못 썼습니다 ㅜ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
반복문 질문있습니다
1에서 100까지 합 구하는 프로그램 코드 한번만 봐주세요 mov al, 0 mov bl, 0 LABEL_SUM: add bl, 1 add al, bl cmp bl, 100 jne LABEL_SUM PRINT_DEC 4, al NEWLINE 이렇게 짰는데 Output이 -70 나와요.. bl이 0이고 계속 1씩 더해지면 1, 2, 3, ... 이렇게 될 것이고 al에 bl을 더하는데 al 초기값이 0이니까 1씩 더해진 bl을 더하면 1+2+3+ ... +100이 되지 않나요..? 왜 답이 음수가 나오는지 모르겠습니다 ㅠ
-
미해결반응형 웹사이트 포트폴리오(App Official Landing Website)
질문드려요~
안녕하세요. show, hide, toggle 버튼 알려주신대로 작성하니 잘 작동합니다 그런데 js파일에 click 함수명을 넣으려니까 취소줄이 표시가되어요 이부분은 그냥 두는 건지 어떻게 해결해야할지 질문을 드려보아요
-
미해결내 맥북을 자동화하기: 단순반복 작업이여 안녕
듀얼 모니터에서.. 커서 포인트 위치를 세컨드 모니터로 옮길 수 있나요?
듀얼 모니터를 사용할때... 마우스를 움지이지 않고, 단축키를 사용해서 커서 포인트를 → 메인 모니터에서 → 세컨드 모니터로 이동시키는 방법을 알고 싶어요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Member List 보여주기
안녕하세요! 궁금한 점이 있어 질문 드립니다! 이 부분에서, member의 id, name은 private 이고, 타입리프가 알아서, id와 name을 getId, getName으로 열여준다고 알고 있습니다! <tr th:each="member : ${members}"> <td th:text="${member.id}"></td> <td th:text="${member.name}"></td></tr> 저의 개발환경에서 Intellij IDE는 위 member.id와 member.name을 오류로 보고 있는데(실행하면 정상으로 작동합니다) 그 이유가 무엇인지 궁금합니다.. IntelliJ IDEA 2021.1.3 (Ultimate Edition) Build #IU-211.7628.21, built on June 30, 2021 For educational use only. Runtime version: 11.0.11+9-b1341.60 x86_64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. macOS 11.4 GC: G1 Young Generation, G1 Old Generation Memory: 1024M Cores: 8 Kotlin: 211-1.4.32-release-IJ7628.19
-
미해결[입문] 마케팅에 필요한 포토샵 디자인 강의
카드뉴스3만들기 질문 있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의를 듣고 만들다 보니 창업자가 가져야할 마인드! 이부분에서 사각형 툴 선 양쪽 길이가 다른거 같아서 길이 측정을 해보고 싶은데 눈금자를 이용해서 하는 방법을 잘 모르겠네요 검색해봐도 이해가 잘 안되서요!
-
미해결채널 개설부터 기획, 편집까지! 유튜브 스타터를 위한 입문강의
카페문의드려요!
- 안녕하세요! 말씀하신 카페가 링크를 클릭했더니 초대가 유효하지 않다고 떠서요 카페 명을 알수있을까요? 확인 부탁드려욤!
-
미해결UIKit - iOS14 실무 가이드 <iOS앱 진짜 개발자 되기>
NSPredicate
안녕하세요 선생님! 강의 잘 듣고있습니다! 다름이 아니라 다소 지엽적이라 생각되는 질문이있습니다ㅎㅎ (ToDo 강의) UUID는 램덤으로 중복 되지 않는 값을 발생시킨다고 알고있습니다 그러면 같은 UUID를 가져오는것이니깐 선택한 데이터 하나만 가져오는것 맞나요? (같은확률이 거의 없으므로) 강의중 언급하신것처럼 loadedData가 array형태여서 .first로 꺼냈지만 "loadedData"가 배열로 온다는것에서 혹시 한개 이상의 데이터를 가져올수있는경우도 있는것인지, 그러면 제가 찾으려는값이 첫번째가 아니라 두번째에 있으면 어떡할지라는 생각이 들었습니다 그런데 UUID가 중복될 확률은 거의 없으니깐 그냥 이것도 일종의 규격이라고 생각하고 넘어가면 될까요? loadedData.first?.title = titleTextField.text func updateData(){ guard let hasData = selectedTodoList else { return } guard let hasUUID = hasData.uuid else { return } let fetchRequest: NSFetchRequest<TodoList> = TodoList.fetchRequest() fetchRequest.predicate = NSPredicate(format: "uuid = %@", hasUUID as CVarArg ) //fetch just selected data do { let loadedData = try context.fetch(fetchRequest) //uuid loadedData.first?.title = titleTextField.text loadedData.first?.date = Date() loadedData.first?.priorityLevel = self.prioriy?.rawValue ?? PriorityLevel.level1.rawValue//0,1,2 } catch { print(error) }