묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결리액트로 나만의 블로그 만들기(MERN Stack)
findByIdAndUpdate에 대해 궁금합니다!
router.post("/:id/comments", async(req, res, next) => { const newComment = await Comment.create({ contents: req.body.contents, creator: req.body.userId, creatorName: req.body.userName, post: req.body.id, date: moment().format("YYYY-MM-DD hh:mm:ss") }) console.log(newComment, "newComment") try { await Post.findByIdAndUpdate(req.body.id, { $push: { comments: newComment._id } }) await User.findByIdAndUpdate(req.body.userId, { $push: { comments: { post_id: req.body._id, comment_id: newComment._id } } }) res.json(newComment) } catch (e) { console.log(e) next(e) } }) 좋은 강의 감사합니다 ㅎㅎㅎㅎ 항상 관계형DB, 시퀄라이즈만 사용하다가 처음으로 몽고DB를 사용하고있는데요, 위의 코드에서 await User.findByIdAndUpdate(req.body.userId, { $push: { comments: { post_id: req.body._id, comment_id: newComment._id } } }) 이 부분이 User 테이블에서 req.body.userId에 해당하는 user를 찾은 다음에 User 테이블의 comments컬럼의 post_id, comment_id를 수정한다고 이해하면 되는건가요? 조금 햇갈리네요 ㅠㅠ 그리고 지금 (47) Comment Saga 까지 들었는데 normalRoute/PostWrite.js에서 submit하는 기능이 아직 안되어있는데 이건 다음 강의에서 다루는건가요? import React, { useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { Form, FormGroup, Label, Input, Button, Col, Progress, } from "reactstrap"; import { CKEditor } from "@ckeditor/ckeditor5-react"; import ClassicEditor from "@ckeditor/ckeditor5-editor-classic/src/classiceditor"; import { editorConfiguration } from "../../components/editor/EditorConfig"; import Myinit from "../../components/editor/UploadAdapter"; import dotenv from 'dotenv' dotenv.config() const PostWrite = () => { const {isAuthenticated} = useSelector( (state) => state.auth ) const [form, setValues] = useState({ title: "", contents: "", fileUrl: "" }); const dispatch = useDispatch() const onChange = (e) => { setValues({ ...form, [e.target.name]: e.target.value, }); }; const getDataFromCKEditor = (event, editor) => { const data = editor.getData() console.log(data) if(data && data.match("<img src=")) { const whereImg_start = data.indexOf("<img src=") console.log(whereImg_start) let whereImg_end = "" let ext_name_find = "" let result_Img_Url = "" const ext_name = ["jpeg", "png", "jpg", "gif"] for(let i=0; i<ext_name.length; i++) { if(data.match(ext_name[i])) { console.log(data.indexOf(`${ext_name[i]}`)) ext_name_find = ext_name[i] whereImg_end = data.indexOf(`${ext_name[i]}`) } } console.log(ext_name_find) console.log(whereImg_end) if (ext_name_find === "jpeg") { result_Img_Url = data.substring(whereImg_start+10, whereImg_end+4) } else { result_Img_Url = data.substring(whereImg_start+10, whereImg_end+3) } console.log(result_Img_Url, "result_Img_Url") setValues({ ...form, fileUrl: result_Img_Url, contents: data }) } else { setValues({ ...form, fileUrl: "https://source.unsplash.com/random/301x201", // fileUrl: process.env.REACT_APP_BASIC_IMAGE_URL contents: data }) } } const onSubmit = async(e) => { await e.preventDefault() const { title, contents, fileUrl, category } = form } return ( <> {isAuthenticated ? ( <Form onSubmit={onSubmit}> <FormGroup className="mb-3"> <Label for="title">Title</Label> <Input type="text" name="title" id="title" className="form-control" onChange={onChange} /> </FormGroup> <FormGroup className="mb-3"> <Label for="category">Category</Label> <Input type="text" name="category" id="category" className="form-control" onChange={onChange} /> </FormGroup> <FormGroup className="mb-3"> <Label for="content">Content</Label> <CKEditor editor={ClassicEditor} config={editorConfiguration} onInit={Myinit} onBlur={getDataFromCKEditor} /> <Button color="success" block className="mt-3 col-md-2 offset-md-10 mb-3" > 제출하기 </Button> </FormGroup> </Form> ) : ( <Col width={50} className="p-5 m-5"> <Progress animated color="info" value={100} /> </Col> )} </> ); } export default PostWrite 47강까지 들은 현재 PostWrite.js인데 게시글을 submit하는 액션이 디스패치 안되어있어서요 ㅎㅎㅎ 등록된 게시글이 없다보니 (42) ~ (45)강의 PostDetail.js의 내용을 확인할 수가 없네요..
-
미해결홍정모의 따라하며 배우는 C++
구현해본 코드입니다! 피드백을 받고 싶어 올려봅니다 (+부족하지만 참고하실 분들 있으시면 조금이라도 도움드리고자 올려봅니다!)
강의 정말 잘듣고 있습니다. 대학교에 입학한 후 코딩을 처음 배운게 파이썬이었고, 파이썬으로 스타트업에서 머신러닝 프로젝트도 하면서 여러 사람들과 협업하기도 하며 나름 객체지향에 대해서 잘 알고 있다고 생각했는데, 교수님의 강의를 듣고 C++로 객체지향을 배워보니 그동안 제가 얼마나 기초가 부족했는지 알 수 있었습니다. 교수님 강의를 듣기 전까지 1년 이상 코딩에서 재미를 찾지 못하여 손을 놨었습니다. 그런데 이 강의에서 제가 모르는지도 몰랐던 것들을 알게되니 정말 감회가 남다르고, 다시 코딩이 재밌어졌습니다!^^ 정말 감사합니다! 최근에는 클린 코드와 클린 아키텍쳐에 대해서도 같이 공부하면서 교수님이 말씀하시는 정돈되고 읽기 좋은 코드가 무엇인지 조금씩 공부하고 있습니다. 나름 클린하게 구현해보려고 노력하면서 수업 따라가고 있습니다! 현재 군대에서 교수님 강의를 듣고 있는데, 교수님덕분에 제 꿈을 다시 일으키고 기반을 제대로 닦을 수 있을 것 같습니다! 남은 강의도 성실하게 듣겠습니다! 누구든지 피드백 해주시면 정말 감사하겠습니다! 또 혹시나 구현이 어렵거나 하신 분들을 위해 코드 공유합니다. #include <iostream> #include <initializer_list> #include <cassert> using namespace std; class IntArray { private: int m_length = 0; int *m_data = nullptr; const int one_digit = 1; public: IntArray(const unsigned int &len_in) : m_length(len_in) { initialize(m_length); } IntArray(const initializer_list<int> &list) : IntArray(list.size()) { int count = 0; for (auto & element : list) { m_data[count] = element; count++; } } ~IntArray() { delete [] m_data; } void initialize(const unsigned int &len_in) { m_data = new int[len_in]; } void reset() { delete [] m_data; m_data = nullptr; m_length = 0; } void resize(const unsigned int &len_in) { IntArray temp(len_in); copyAll(temp, *this); resetAndAssignment(temp); } void insertBefore(const int &value, const int &ix) { IntArray temp(m_length + one_digit); copyOriginalFromZeroToIx(temp, *this, ix - one_digit); temp.setValue(value, ix); copyOriginalFromIXToEnd(temp, *this, ix + one_digit, ix); resetAndAssignment(temp); } void remove(const int &ix) { IntArray temp(m_length - one_digit); copyOriginalFromZeroToIx(temp, *this, ix - one_digit); copyOriginalFromIXToEnd(temp, *this, ix, ix + one_digit); resetAndAssignment(temp); } void push_back(const int &value) { IntArray temp(m_length + one_digit); copyAll(temp, *this); int temp_end_index = temp.getLength() - one_digit; temp.setValue(value, temp_end_index); resetAndAssignment(temp); } void copyAll(IntArray & target, const IntArray & orginal) { for (int i = 0; i < target.m_length; ++i) { target.m_data[i] = orginal.m_data[i]; } } void copyOriginalFromZeroToIx(IntArray & target, IntArray & original, const unsigned int & to_ix) { // TODO: 방어적 프로그래밍 - to_ix가 배열 길이를 벗어날 때. for (int i = 0; i < to_ix + one_digit; ++i) { target.m_data[i] = original.m_data[i]; } } void copyOriginalFromIXToEnd(IntArray & target, IntArray & original, const unsigned int & from_ix_target, const unsigned int & from_ix_original) { // TODO: 방어적 프로그래밍 - to_ix가 배열 길이를 벗어날 때. unsigned int count = from_ix_original; for (int i = from_ix_target; i < target.getLength(); ++i) { target.m_data[i] = original.m_data[count]; count++; } } void resetAndAssignment(IntArray & intarray) { this->reset(); *this = intarray; } int getLength() { return m_length; } void setValue(const int &value, const int &ix) { //TODO: 방어적 프로그래밍 - 인덱스가 배열 범위를 벗어날 때 m_data[ix] = value; } IntArray& operator = (IntArray & source) { this->m_length = source.m_length; this->m_data = new int[this->m_length]; copyAll(*this, source); } friend ostream& operator << (ostream& out, IntArray & intarray) { for (int i = 0; i < intarray.getLength(); ++i) { out << intarray.m_data[i] << " "; } return out; } }; int main() { // constructor test - OK IntArray my_arr{ 1, 3, 5, 7, 9 }; cout << "constructor test: " << endl; cout << my_arr << endl; // resize test - OK my_arr.resize(8); cout << "resize test: " << endl; cout << my_arr << endl; cout << "Length: " << my_arr.getLength() << endl ; my_arr.resize(3); cout << my_arr << endl; cout << "Length: " << my_arr.getLength() << endl; // copyOriginalFromZeroToIx test - OK IntArray arr1{1, 3, 5, 7 ,9 }; IntArray arr2{2, 4, 6, 8, 10}; arr1.copyOriginalFromZeroToIx(arr1,arr2,2); cout << "copyOriginalFromZeroToIx test: " << endl; cout << arr1 << endl; // copyOriginalFromIXToEnd - OK IntArray my_arr1{100, 200, 300, 400, 500}; my_arr1.copyOriginalFromIXToEnd(my_arr1,arr2,2,2); // 100 200 6 8 10 OK cout << "copyOriginalFromIXToEnd: " << endl; cout << my_arr1 << endl; //insertBefore test - OK IntArray my_arr3{ 1, 3, 5, 7, 9 }; my_arr3.insertBefore(10, 1); // 1, 10, 3, 5, 7, 9 cout << "insertBefore test: " << endl; cout << my_arr3 << endl; // remove test - OK my_arr3.remove(3); // 1, 10, 3, 7, 9 cout << "remove test: " << endl; cout << my_arr3 << endl; // push_back test - OK my_arr3.push_back(13); // 1, 10, 3, 7, 9, 13 cout << "push_back test: " << endl; cout << my_arr3 << endl; /* result: constructor test: 1 3 5 7 9 resize test: 1 3 5 7 9 0 1041 0 Length: 8 1 3 5 Length: 3 copyOriginalFromZeroToIx test: 2 4 6 7 9 copyOriginalFromIXToEnd: 100 200 6 8 10 insertBefore test: 1 10 3 5 7 9 remove test: 1 10 3 7 9 push_back test: 1 10 3 7 9 13 */ return 0; }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
의문점 + 질문
(의문점) 단일참조가 아닐 경우 orphanRemoval을 사용하지 말아야 하는 이유에 대해서는 이해가 됩니다만.. 부모가 여럿이 있는 자식 객체가 있다고 했을 때, 하나의 부모가 없어진다해도 다른 부모쪽에는 참조가 되어있으니 아직 고아가 아닌 거 아닌가요?; 마치 아버지가 사망했다고 모자관계까지 끊어버리는 느낌..? 이상하네요; 너무 쓸 데 없이 Real World에 대입해서 생각하는걸까요? (질문) orphanRemoval = true를 사용한다는 게 결국 CascadeType.REMOVE와 똑같은 말 아닌가요? 그럼 CascadeType.ALL을 사용하면 굳이 orphanRemoval = true는 사용할 필요가 없는 것 아닌가 싶습니다. 자식의 생명주기를 부모가 관리하기 위해서 꼭 저 두 속성을 함께 써야하는 이유가 무엇인지 궁금합니다. 감사합니다.
-
해결됨실무자가 알려주는 Git - 입문편
딱 커밋에 포함된 내용만 가져오는건가요?
체리픽은 원하는 커밋의 내용만 가져올 수 있다고 이해가 되었는데 그렇다면 딱 커밋 에 포함된 내용만 가져오는건가요? 예를들면 a 커밋에서 1.html 의 3번째 줄을 변경했으면 1.html의 3번째줄 변경된 내용만 가져오는건가요?
-
해결됨구글애즈로 배우는 퍼포먼스마케팅 필수 (2023년 업데이트)
CAC 개념이 헷갈리는데요
안녕하세요, 강의 잘 듣고 있습니다. 이번 강의에서는 CAC(고객획득비용)를 객단가라고 설명을 하시니 좀 헷갈렸어요. (객단가는 고객 한명이 결제하는 금액(basket size)으로 이해하고 있어서..) 여러번 반복해 봐야 이해가 되지만 열심히 듣고 있습니다. 감사합니다.
-
미해결진짜 현업에서 쓰이는 직장인의 실무 엑셀 - 데이터 가공부터 분석까지
유의한 F에 대한 질문
사소하게 나마... 통계학을 약간 배워서 P-Value 개념도 잔차가 0이 되는 개념도 이해가 됩니다. 근데,, 유의한 F를 왜 봐야하는지는 잘 모르겠습니다.. 혹시, 간단하게라도 이유를 알려주실 수 있나요?
-
미해결R로 쉽게 배우는 강화학습
강화학습 예시로 날씨예측
강화학습 예시로 날씨예측을 예로 든다면 어떤식으로 구상할수있을까요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
Route, exact={true}
안녕하세요~ 세 가지 질문드립니다. 1. Switch의 역할은 무엇인가요? 2. exact={true}의 역할은 무엇인가요? 3. import 할 때, {} 안에 넣어서 불러오는거랑 그냥 불러오는 거랑 차이가 무엇인가요~? 해당 부분 노션 교육자료에 Route, Switch 사용하는 부분 코드 기입이 덜 되어 있는 것 같은데 그것도 수정해주시면 감사하겠습니다ㅎㅎ!!
-
해결됨실무자가 알려주는 Git - 입문편
스테이지에 올리는 add 이후 머지를 하면 안되는 이유 알 수 있을까요?
11:07 git rebase 이후에 스테이지에 올리는 add 이후 머지를 하면 안되는 이유 알 수 있을까요? 물론 리베이스 중이기 때문에 continue명령어를 해줘야 하는게 맞는거 같긴한데... 실수로 머지를 하는 경우도 있을거 같아서요.
-
미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
main.go가 빌드가 안됩니다.
안녕하세요. main.go파일의 빌드가 안되어 진행을 못하는 상황입니다. 어디가 잘못되었는지... 제가 go를 잘 몰라서 뭔가 빠트리고 있는지요. go 는 1.16을 쓰고 있습니다. main.go는 자료실 코드 그대로 복붙을 했습니다. 에러는, '"github.com/julienschmidt/httprouter" 라는 모듈을 나는 모른다' 정도로 해석할수 있는데... 어떻게 해야할까요?
-
모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1
PHP 게시판 구성후 오라클 페이지에서 에러가 납니다.
삭제된 글입니다
-
미해결실전! Querydsl
Q Class 생성 시 extends 상속 질문
안녕하세요. Entity class에 extends DefualtEntity 를 할 경우 Q class 생서 시 DefualtEntity 의 값은 Q Class에 누락되는 현상이 있던데 상속을 해서 구성하면 안되는 걸까요? DefualtEntity 에는 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime regDate; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime udtDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); regDate = now; udtDate = now; } @PreUpdate public void preUpdate() { udtDate = LocalDateTime.now(); } 이런 공통적인 내용을 넣어보려합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
aws back 서버가 죽어버립니다.
aws 프리티어 t2.micro vCPUs : 1 memory: 1 (GiB) npx pm2 start app.ts && npx pm2 monit 메모리가 300MB 이상 CPU가 90% 이상 되면서 로그도 뜨기 전에 멈춥니다. pm2 start app.ts --max-memory-restart 150M pm2 start app.ts --node-args="--max-old-space-size=200" 위의 방법으로도 해봤지만 메모리가 300MB 넘어가면서 역시나 죽어버립니다. aws 인스턴스 재부팅만 10번 넘게 한 것 같습니다... 프론트 서버도 nextjs 빌드할 때 죽어버려서 로컬에서 빌드하고 깃으로 올려서 사용하고 있었습니다. 백엔드 서버에서는 어떡하면 좋을까요? aws 서버를 업그레이드 한 단계 업그레이드를 고민하고 있습니다... t2.small이 시간당 20.30원. 한 달에 1만 5천원 정도 청구 예상이 되네요 다른 분들은 그냥 됐는지, 어떻게 해결했는지 궁금하네요
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
유저 이름 바꾸기
유저 이름이 한국어로 되어있으면 힘들다고 하셨는데 단순히 제어판에서 이름만 바꾼다고 되는게 아닌것 같아서 변경할려면 어느 과정을 거쳐야 할까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
로그인 후 프로필 -> 프로필명 수정 -> 로그아웃 진행 시 에러가 발생합니다
같은 에러 발생하시는 분들 계신가요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
댓글은 생성이 되는데 대댓글 생성이 안 됩니다
let renderReplyComment=(parentCommentId)=>{ for (let i=0;i<8;i++){ if (props.commentLists[i].responseTo === parentCommentId){ console.log(props.commentLists[i].content) } } props.commentLists.map((comment,index)=>( (comment.responseTo === parentCommentId && <React.Fragment> <div style={{ width: '80%', marginLeft: '40px' }}> <SingleComment comment={comment} postId={props.videoId} refreshFunction={props.refreshFunction} /> <ReplyComment CommentLists={props.CommentLists} parentCommentId={comment._id} postId={props.videoId} refreshFunction={props.refreshFunction} /> </div> </React.Fragment> ) )) ReplyComment.js 코드 안에서서 대댓글을 생성하는 코드입니다. 위 함수에 아예 못 들어가는건가 싶어서 안에 for문으로 responseTo와 parentCommentID가 같을 경우 content log를 찍어봤는데 정확히 잘 나오는걸 확인했습니다. 그런데 대댓글 생성은 안됩니다. 아래가 제 실행 결과이고 그냥 댓글 생성은 되는것으로 보아 singleComment.js 파일은 문제가 없는거 같은데 대댓글이 생성 안 되는 이유를 모르겠습니다.
-
미해결[개념부터 실습까지] 추천 시스템 입문편
regex 추출 한줄로
소소하지만 편하게 한줄로 extract하는 방법 공유합니다. extract() 안에 '\((\d{4})\)'로 넣으면 패턴을 찾을땐 소괄호 포함한 4자리를 찾지만 값을 돌려줄땐 4자리만 돌려줍니다
-
미해결[하루 10분|Web Project] HTML/JS/CSS로 나만의 심리테스트 사이트 만들기
for(let j = 0; j < target.length; j++) 질문있어
for(let j = 0; j < target.length; j++) 이 부분에서 j는 qnaList에 type에 대해 반복이 일어난다고 해주셨는데 갑자기 type을 가리키고 있는 이유가 아래에 있는 if(target.type[j] === pointArray[k].name) 이거 때문인가요?
-
미해결스프링 시큐리티
logoutSuccessHandler가 실행되기전 오류 발생시
addLogoutHandler가 로그아웃을 시도할때 필요한 동작들을 실행하고 모든 핸들러가 종료되고 나서 성공이 됬다면 logoutSuccessHandler가 실행되는것 까진 이해했습니다 로그아웃핸들러에 추가한 핸들러 중 일부에 오류가 생긴 경우 기존에 진행되었던 동작들(세션만료 또는 쿠키삭제 등)을 다시 롤백시키나요? 아니면 어떤식으로 진행이 되나요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
self signed certificate in certificate chain 에러 발생하시는 분 없나요?
(사진)