묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결리액트로 나만의 블로그 만들기(MERN Stack)
새로고침 시 로그아웃되는 문제에 대한 질문입니다.
바쁘실텐데 읽어주셔서 감사합니다.. 기존의 강의에 다른 분이 새로고침시 로그인 유지가 안된다는 질문을 보며 싸플님 깃허브에 들어가서 코드를 그대로 따라했음에도 불구하고 문제를 고치지 못해서 질문드립니다. POST /api/auth 200 161.558 ms - 285 --> 첫번째 로그인시 정상적으로 작동 후 TypeError: Cannot read property 'id' of undefined --> 새로고침을 누르면 에러발생후 GET /api/auth/user 400 23.641 ms - 48 --> 400에러가 발생하네요.. 에러 화면 첨부하고, https://github.com/hcs4125/Blog 깃허브 주소도 첨부해 드립니다
-
미해결WEB2 - Node.js
강사님 처럼 줄바꿈 어떻게 하나요?
코드에서 lorem을 쓸 때 저는 한줄로 쭉 길게 있어서 사용하기 불편하던데 어떻게 강사님 컴퓨터처럼 자동으로 줄바꿈 되도록 할 수 있나요? 사용하는 데 너무 불편해서 질문드립니다
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
feature_importance 관련 질문
안녕하세요. 수업을 잘 듣고 있습니다. 수업을 듣다가 문득 궁금한 점이 있어서 문의를 남겨요. Santander 예제에서 "feature_importance 함수를 이용하여 F1 score를 기준으로 해서 feature들의 중요도 탑 20을 보여주는거구나" 라고만 생각하고 넘어갔었는데, 여기서 저 실제 데이터 값(4318 , 1890 , 1333 ...)은 무엇을 의미하는건가요? F1 score값이 몇백,몇천이 될리는 없고.. 무엇을 뜻하는지 궁금하네요. 그리고 저건 그냥 F1 score에 따른 중요도를 한번 봐본것이지, 어떤 척도로 중요도를 기준으로 feature importance를 보느냐에 따라 분석 방향이 달라지는 것 맞는지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
코드 질문
v[6] 의 값이 77이라 11로 나눠 떨어지는데 왜 ans값이 안변하는 건지 잘 이해가 안갑니다. 이 케이스 처럼 어떤때는 작동안하고 어떤때는 잘 작동하는데, 코드의 어느 부분이 잘못된 걸까요?
-
미해결제주코딩베이스캠프 Code Festival: JavaScript 100제
알고리즘 공부방법에 대해서 질문있습니다.
안녕하세요. 알고리즘 강의 정말 잘 듣고 있습니다. 지금 제가 코딩테스트를 준비하는데, 알고리즘을 어떻게 공부해야할지 감이 안잡혀서요.. 저한테 어려운 문제를 풀때, 어느정도까지 붙잡고 있다가 강의를 보는것이 좋을까요? 물론 사람 by 사람이겠지만, 짧게 30분정도 고민하다가 답을 보면서 다양한 문제를 빨리 많이 접하는 것이 좋은지.. 아니면, 논리력을 키우기 위해 계속 붙잡고 푸는 것이 중요한 것인지, 어디에 중점을 두고 공부하는게 효과적인지 조언좀 부탁드립니다.
-
해결됨실전 리액트 프로그래밍
positive 방식으로 저장하는 이유가 뭔가요?
fetchUpdateUser를 할 때, 새로운 값을 먼저 저장하고 실패하면 다시 예전값으로 돌려놓는 것을 positive 방식이라고 하시던데, 굳이 그렇게 하는 이유는 뭔가요? 성공했을 때 저장하는 게 더 간단해 보이는데 뭔가 장점이 있는 건가요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
ButtonGroup
import {ButtonGroup, Card, Popover} from "antd"; 이렇게 하면 웹스톰에서 없다고 에러가 떠서, 웹스톰에서 import ButtonGroup from "antd/es/button/button-group"; 혹은 import ButtonGroup from "antd/lib/button/button-group"; 를 쓰라 하는데, 두가지 중 무엇이 더 좋을려나요?
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
객체생성
저는 Human에 빨간줄이 그어집니다. 뒤에 접근제한자 강의를 듣고 class앞에는 internal이 생략된거라 스크립트에 class를 선언하면 아무 스크립트에서나 참조가 된다 하셨지만 저는 안되네요 혼자 이것저것 해본결과 classExample이랑 ObjectExample이랑 같은 namespase를 적고 classExample 스크립트에서 public class classExample : MonoBehavior 이 코드가 없으면 다른 스크립트에서도 Human을 참조가 되더라고요 강의 영상 그대로 객체를 생성하고싶은데 어떻게 해야할까요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemoryRepositoryTest 에서 @RunWith 만 쓰면 에러
안녕하세요 야생형으로 JPA 활용부터 보고 있는데요 lombok 해결에 이어서 다음 에러가 나서 진도가 못나가고 있습니다. ^^; MemoryRepositoryTest 에서 @RunWith 만 쓰면 에러가 나는데요 아래와 같이 Juni4 적용도 build.gradle에서 다 적었는데요 @RunWith 만 사용하면 인식이 안되네요 도움 부탁드립니다. (좋은 한주 시작되세요~ 감사합니다~)
-
미해결나만의 포트폴리오 블로그 만들기(feat. 티스토리 스킨)
티도리 버전 확인이 안됩니다.
티도리 설치되어 있는 디렉토리에 들어간다음 tidory --version을 쳤는데 오류메시지만 나옵니다. npm install은 잘 됬는데 왜 이런거죠?
-
해결됨뉴욕 프로덕트 디자이너가 알려주는, 입문자를 위한 UX디자인 개론
좋은UX / 안좋은 UX 과제
안녕하세요, 저는 현재 스타트업에서 UI/UX 디자이너로 일하고 있는 신입입니다. 사수가 따로 없어 혼자서 이것저것 하려고 하다보니 많이 부족하기도 하고 UX기초를 다시 정리해보고 싶어서 강의를 듣게 되었습니다. 우선 저는 좋은 UX와 안좋은 UX의 예시를 클래스101 하나의 플랫폼에서 찾았습니다. 클래스101은 인프런과 유사한 플랫폼이라고 볼수 있는데, 취미 위주의 온라인 플랫폼 입니다. 좋은 UX - 웹 / 모바일 우선 웹사이트와 모바일페이지는 전체적으로 깔끔하고 사용하는데도 편리하다고 느꼈습니다. 카테고리도 분류가 잘되어 있어서 필요한 정보를 손쉽게 찾을 수 있었습니다. 취미, 재테크, 커리어 등 카테고리가 잘 나누어져 사용자가 원하는 클래스를 더욱 간편하게 찾아볼수 있도록 설계된것 같습니다. 모바일 페이지도 웹과 전체적으로 유사하게 깔끔하고 편리하게 디자인 된 것같습니다. 한가지 아쉬운점은 하단 탭바 부분에 다른 유용한 버튼을 추가하면 더 좋을 것 같습니다. 안좋은 UX - 애플리케이션 (iOS를 사용중이라 안드로이드는 알지못합니다) 과거 클래스101 애플리케이션 같은경우 앱내에서 클래스 정보도 찾을 수 있었고 결제까지 가능했던것 같은데 최근 리뉴얼이 되면서 앱은 클래스 정보또한 탐색할수 없었고 웹에서 결제 후 강의 시청용으로만 사용이 되는 것 같습니다. 시청또한 웹/모바일 페이지에서 결제 후 바로 시청하는것이 더욱 편리할텐데 굳이 웹에서 결제 후 앱까지 다운을 받아서 시청할 필요가 없는 것 같습니다. 앱스토어의 수수료 정책때문에 변경된것인지는 모르겠지만 사용자의 입장에서는 불편하게 느껴졌습니다. 저 혼자만의 생각일수도 있습니다만 개인적으로는 과거의 앱이 더욱 편리하고 깔끔하게 느껴졌는데 변경이 되어서 조금 아쉬웠습니다. <과거 버전> 퇴근후 조금씩 강의를 듣고 있는데 도움이 많이 되는것 같습니다! 개인적으로 UX를 간단하게 분석해보았는데 부족한 부분이 있으면 알려주시면 감사하겠습니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
양방향 연관관계일 때 한쪽을 끝는거에 대해 질문드립니다.
@JsonIgnore 어노테이션을 사용하면 지금 상태로는 꼭 하이버네이트5모듈을 사용해야 하는거죠? 일단 지금은 그렇게 알고있으면 될까요? 감사합니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
섹션1(노드), 섹션2(리액트) 연결된 내용의 강의인가요?
강의와 관련있는 질문을 남겨주세요.• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달에도 요령이 필요합니다.• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 제가 리액트만 공부하고 싶어서 섹션 2부터 보려고 하는데 섹션1, 2 나눠진 내용인가요 아니면 연달아 봐야하나요?
-
미해결[구버전] 웹 애플리케이션 개발을 위한 IntelliJ IDEA 설정 (2020 ver.)
mac 에서 sh startup.sh 를 실행했을 때 404 에러가 발생합니다.
mac 에서 sh startup.sh 를 실행했을 때 404 에러가 발생합니다.
-
미해결풀스택을 위한 탄탄한 프런트엔드 부트캠프 (HTML, CSS, 바닐라 자바스크립트 + ES6) [풀스택 Part2]
promise 이해 1 16분 23초 부분 질문입니다.
.then함수에서 최초 reject(); 함수가 실행되고 다시 .then을 실행할 때 함수 인자가 하나일 경우 성공함수만 호출된다라고 말씀하셨는데 아래 then엔 인자가 하나이니 실행이 안되어야 하는거 아닌가요 ? 즉, by Dave Lee가 출력 되려면 첫번째 then에서 resolve가 출력되어야 하는거 아닌지요.. -> 왜 첫번째 then은 실패, 두번째 then은 성공이 출력되는지 이해가 되질 않습니다..ㅠ 만약 두번째 then부터는 첫번째 함수만 실행되는거면 예제에 나온것처럼 then에 두번째 인자는 필요 없는거 아닌가요 ??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
예제 수준을 넘어선다면 어떻게 해야할까요?
안녕하세요 팀장님! mvc 강의 열렬히 기다리면서 복습하고 있습니다. 예제에서는 회원 엔티티의 pk를 자동 생성되는 id를 사용하시는데요, 일반적인 포털 사이트 로그인과 같이 id와 pw를 회원이 직접 입력해서 사용하는 경우에는 artificial key 를 pk로 두고, unique 제약 조건으로 로그인 id를 만드는게 좋을까요? 아니면 로그인 id자체를 pk로 만드는 것이 좋을까요? pk는 비지니스 로직과 상관이 없는 유일한 값이어야 하고, generated value가 이 제약조건에 정확히 부합하지만, 회원 id자체가 비지니스 로직과는 별로 연관이 없어 보이기도 하고 unique제약조건또한 만족하니 어떻게 엔티티를 만들어야 할지 고민입니다.
-
미해결윤재성의 처음 시작하는 MySQL DataBase
숫자 함수 round(salary 1*1, 0)
마지막 예제 부분에서 숫자 함수 round(salary 1*1, 0) (, 0)을 넣어주신 이유가 있나요?
-
미해결리액트로 나만의 블로그 만들기(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는 사용할 필요가 없는 것 아닌가 싶습니다. 자식의 생명주기를 부모가 관리하기 위해서 꼭 저 두 속성을 함께 써야하는 이유가 무엇인지 궁금합니다. 감사합니다.