묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
join한 테이블 조회시 컬럼이 겹치는 문제
아래와 같은 코드에서 memberID를 조건으로 데이터를 조회하면 join된 campground와 member 각각에 member 컬럼이 다 있어 조건으로 넣어준 memberId를 어디서 찾아야 하는지 typeORM에서 인식하지 못하는 것 같습니다. 때문에 아래와 같은 에러가 나오는거 같습니다. 어떻게 해결해야 할까요?result = await this.dibsRepository.find({ where: { member: { memberId }, }, relations: ['campground', 'member'], });QueryFailedError: Column 'memberId' in where clause is ambiguous
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
08-05 강의에서 DB 접근이 안되는 현상이 발생합니다.
위와 같은 연결 오류가 발생하고이때 host는 'localhost' 로 입력을 한 상태입니다.app.module.ts 파일 내의 host를 127.0.0.1 로 변경하면 또 정상 작동 합니다.인터넷을 보니까socketPath: '/tmp/mysql.sock' 를 마지막에 넣어주면 또 정상 작동 하는 것 같습니다.도서관과 같은 특수한 네트워크 환경에서 진행해서 그런걸까요?https://cloer.tistory.com/56 자료를 참고했습니다.
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
API 응답
await을 두 번 쓰는 이유가 fetch의 리턴 값인 Response (Promise 객체 타입)가 언제 올지 기다리기 위함인가요?위 질문에서 Response 객체는 Promise 객체와 같다고 생각해도 되나요?
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
async
11번째 줄에서 res가 "hello Async"라는 건 알겠는데 갑자기 어디에서 튀어 나온 변수인지 모르겠습니다. 혹시 Promise의 executor resolve인가요? 맞다면 왜 그런 건가요?
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
Promise 객체
resolve, reject, then, catch 모두 Promise 객체에 기본적으로 들어있는 메서드가 맞는 건가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
final 과제
강사님 안녕하세요. 파이널 과제를 하면서 궁금한 점이 있어 질문 드립니다..!질문이 많지만 피드백 주시면 감사하겠습니다! ( _ _ ) 화면이 100% 일때는 회원가입 폼의 높이가 잘리고, 80%로 줄여야 그때부터 폼이 화면 안에 다 들어간 상태로 확인할 수 있습니다. 이러한 현상은 브라우저 별 차이로 생각하면 되는 걸까요? 또 저는 화면이 100%일 때도 폼이 안잘렸으면 하는데, 혹시 이때 해결할 수 있는 방법이나 대안이 따로 있을까요?// 노션 파일에 있는 코드와 동일합니다. * { box-sizing: border-box; margin: 0px; } body { width: 100vw; height: 100vh; display: flex; flex-direction: row; justify-content: center; align-items: center; } 성별 인풋에서 radio 동그라미 부분에 따로 스타일을 주고 싶어서 아래와 같이 작성했는데, 적용이 안됩니다. 제가 시도해본 방법은 label 내부에 input을 두고 id와 for을 묶어서 스타일을 적용해보았으나, 실패했습니다. 혹시 적용이 안되는 이유와 해결 방법을 알려주실 수 있을까요?<input type="radio" name="gender" class="gender-radio" />여성 .gender input[type="radio"] { background: #ebebeb; border: 1px solid #d2d2d2; } 하단 가입하기 버튼 바로 위에 있는 수평선을 <hr> 태그가 아닌, 버튼을 감싸는 div 박스에 border-top을 주어 스타일을 작성했는데요, 아래와 같이 footer와 버튼이 겹쳐버리는 현상이 발생했습니다.저는 이를 마진 겹침 현상으로 생각하고, 부모 요소에 padding, inline-block, overflow:hidden을 적용해 보았지만 결국 문제를 해결하지 못했습니다. 저는 html 코드를 줄이고자 버튼을 감싸는 박스로 가로선을 해결하고 싶었는데, 이러한 현상이 발생하는 이유와 이 경우 어떤 식으로 해결할 수 있는지 궁금합니다.<div class="footer"> <button id="signup-button">가입하기</button> </div> .footer { width: 380px; height: 1px; margin: 32px 0px 20px 0px; border-top: 1px solid red; } #signup-button { width: 380px; height: 75px; background: #ffffff; border: 1px solid #0068ff; border-radius: 10px; font-size: 18px; line-height: 27px; text-align: center; }
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
중고마켓 리스트 질문
export const FETCH_USEDITEMS = gql` query fetchUseditems($page: Int, $search: String, $isSoldout: Boolean) { fetchUseditems(page: $page, search: $search, isSoldout: $isSoldout) { _id name remarks contents images tags price pickedCount seller { _id email name } } } `;중고마켓에 fetchUseditems 대해 질문이 있습니다.isSoldout을 true와 false로 각각 가져와서 데이터를 화면에 띄우려고 하는데 어떤 식으로 가져와야 하나요? const { data } = useQuery< Pick<IQuery, "fetchUseditems">, IQueryFetchUseditemsArgs >(FETCH_USEDITEMS);이부분에서 무엇을 더 추가해야하는지 아니면 presenter에서 가져와야하는지 갈피를 못잡겟네요. ㅠㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
중고 마켓 부분 백엔드
중고 마켓의 백엔드 부분은 수업에서 제공돼는 기본적인 CRUD 로 가능한건가요??
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
중고마켓 리스트 질문입니다.
현재 중고마켓 리스트 부분을 하고 있습니다.이 부분에서 판매중상품 판매된상품 을 하고있는데fetchUseditems에 있는 isSoldout 부분을 어떤식으로 가져와야 할 지 모르겠네요.. refetch 를 사용해야 하는 건가요..?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Log out 이슈
middlewares까지 구현하고, 로그아웃 router에 isLoggedIn 필터링 해서 실행했는데 로그아웃을 누를때마다 '로그인이 필요합니다.' 라는 Message를 받습니다.로그인하는 과정이 문제라는 가설을 세워서 passport 세팅도 확인했고, login route도 확인했습니다. 하지만 로그아웃 했을때 같은 에러 메세지를 받았습니다.middlewares를 적용 안하고 terminal 확인을 했을때 이런 메시지를 받았습니다.req.logout에 콜백함수가 필요하다고 해서router.post('/logout', (req, res) => { req.logout((err)=>{ console.error(err) }); req.session.destroy(); res.send('ok'); });logout router를 이렇게 바꾸고 로그아웃 해봤는데, LOG_OUT_SUCCESS는 뜨는데, 서버가 crushed 됬다고 하고, 그 후 로그인이 안됩니다.음..혹시 이 부분 외에 어딜 더 체크해봐야 하는지 조언 해주실 수 있을까요?항상 좋은 강의에 감사합니다 :)
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
조건문 업그레이드
제일 마지막 줄의 원리를 제가 설명해 볼 테니까 틀린 부분이 있다면 말씀해주세요!mealType이 null이므로 meal[mealType] 역시 null이고 이 값은 falsy하기 때문에 결국 getMeal에서 최종적으로 리턴하는 값은 "굶기"인 거죠?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
find가 빈 값을 반환하는 문제
안녕하세요~프로젝트 만들다보니 질문거리가 많아지네요.@Query(() => [Dibs]) fetchDibs( @Args('findDibsInput') findDibsInput: FindDibsInput, ): Promise<Dibs[]> { return this.dibsService.find(findDibsInput); }async find(findDibsInput: FindDibsInput): Promise<Dibs[]> { const { campgroundId, memberId } = findDibsInput; const result = await this.dibsRepository.find({ where: { campground: { campgroundId }, member: { memberId }, }, }); return result; }위 코드에 아래와 같은 graphQL 요청을 하면 아무런 값도 돌아오지 않습니다.query { fetchDibs( findDibsInput: { campgroundId: "845b4bac-e0d9-4d1e-a897-9859275e9948" memberId: "lhw3542" } ) { campground{ campgroundId campName } member { memberId } } }{ "data": { "fetchDibs": [] } }조건식 인식 자체가 제대로 되지 않고 있는거 같은데 또 오류는 안나오네요.어떤 것이 문제일까요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
이미지가 안나옵니다
어디가 잘못 돼서 사진이 안 나오는 건지 모르겠습니다
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
Error: Unable to call `followerIdList["includes"]`, which is undefined or falsey
로그인 후 포스팅 하나 작성하면 계속 에러가 발생합니다.exports.renderMain = async (req, res, next) => { try { const posts = await Post.findAll({ include: { model: User, attributes: ['id', 'nick'], }, order: [['createdAt', 'DESC']] // 최신순 정렬(작성일 기준 내림차순) }); res.render('main', { title: 'NodeBird', twits: posts }); } catch (error) { console.error(error); next(error); } };renderMain 메서드에서 따로 follwerIdList를 보내지 않는 것 같은데 {% for twit in twits %} <div class="twit"> <input type="hidden" value="{{twit.User.id}}" class="twit-user-id"> <input type="hidden" value="{{twit.id}}" class="twit-id"> <div class="twit-author">{{twit.User.nick}}</div> {% if not followerIdList.includes(twit.User.id) and twit.User.id !== user.id %} <button class="twit-follow">팔로우하기</button> {% endif %} <div class="twit-content">{{twit.content}}</div> {% if twit.img %} <div class="twit-img"><img src="{{twit.img}}" alt="섬네일"></div> {% endif %} </div> {% endfor %}followerIdList는 어디서 나온 어디서 나온건지 찾을 수가 없습니다..
-
미해결[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
Unkown column 'Post.UserId' in 'field list'
rendermain Executing (default): SELECT `Post`.`id`, `Post`.`content`, `Post`.`img`, `Post`.`createdAt`, `Post`.`updatedAt`, `Post`.`UserId`, `User`.`id` AS `User.id`, `User`.`nick` AS `User.nick` FROM `posts` AS `Post` LEFT OUTER JOIN `users` AS `User` ON `Post`.`UserId` = `User`.`id` AND (`User`.`deletedAt` IS NULL) ORDER BY `Post`.`createdAt` DESC; Error at Query.run (C:\Users\user\study\nodejs\nodebird\node_modules\sequelize\lib\dialects\mysql\query.js:52:25) at C:\Users\user\study\nodejs\nodebird\node_modules\sequelize\lib\sequelize.js:315:28 at processTicksAndRejections (internal/process/task_queues.js:95:5) at async MySQLQueryInterface.select (C:\Users\user\study\nodejs\nodebird\node_modules\sequelize\lib\dialects\abstract\query-interface.js:407:12) at async Function.findAll (C:\Users\user\study\nodejs\nodebird\node_modules\sequelize\lib\model.js:1140:21) at async exports.renderMain (C:\Users\user\study\nodejs\nodebird\controllers\page.js:16:23) { name: 'SequelizeDatabaseError', parent: Error: Unknown column 'Post.UserId' in 'field list' at Packet.asError (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\packets\packet.js:728:17) at Query.execute (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\commands\command.js:29:26) at Connection.handlePacket (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\connection.js:489:32) at PacketParser.onPacket (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\connection.js:94:12) at PacketParser.executeStart (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\packet_parser.js:75:16) at Socket.<anonymous> (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\connection.js:101:25) at Socket.emit (events.js:400:28) at addChunk (internal/streams/readable.js:293:12) at readableAddChunk (internal/streams/readable.js:267:9) at Socket.Readable.push (internal/streams/readable.js:206:10) { code: 'ER_BAD_FIELD_ERROR', errno: 1054, sqlState: '42S22', sqlMessage: "Unknown column 'Post.UserId' in 'field list'", sql: 'SELECT `Post`.`id`, `Post`.`content`, `Post`.`img`, `Post`.`createdAt`, `Post`.`updatedAt`, `Post`.`UserId`, `User`.`id` AS `User.id`, `User`.`nick` AS `User.nick` FROM `posts` AS `Post` LEFT OUTER JOIN `users` AS `User` ON `Post`.`UserId` = `User`.`id` AND (`User`.`deletedAt` IS NULL) ORDER BY `Post`.`createdAt` DESC;', parameters: undefined }, original: Error: Unknown column 'Post.UserId' in 'field list' at Packet.asError (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\packets\packet.js:728:17) at Query.execute (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\commands\command.js:29:26) at Connection.handlePacket (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\connection.js:489:32) at PacketParser.onPacket (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\connection.js:94:12) at PacketParser.executeStart (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\packet_parser.js:75:16) at Socket.<anonymous> (C:\Users\user\study\nodejs\nodebird\node_modules\mysql2\lib\connection.js:101:25) at Socket.emit (events.js:400:28) at addChunk (internal/streams/readable.js:293:12) at readableAddChunk (internal/streams/readable.js:267:9) at Socket.Readable.push (internal/streams/readable.js:206:10) { code: 'ER_BAD_FIELD_ERROR', errno: 1054, sqlState: '42S22', sqlMessage: "Unknown column 'Post.UserId' in 'field list'", sql: 'SELECT `Post`.`id`, `Post`.`content`, `Post`.`img`, `Post`.`createdAt`, `Post`.`updatedAt`, `Post`.`UserId`, `User`.`id` AS `User.id`, `User`.`nick` AS `User.nick` FROM `posts` AS `Post` LEFT OUTER JOIN `users` AS `User` ON `Post`.`UserId` = `User`.`id` AND (`User`.`deletedAt` IS NULL) ORDER BY `Post`.`createdAt` DESC;', parameters: undefined }, sql: 'SELECT `Post`.`id`, `Post`.`content`, `Post`.`img`, `Post`.`createdAt`, `Post`.`updatedAt`, `Post`.`UserId`, `User`.`id` AS `User.id`, `User`.`nick` AS `User.nick` FROM `posts` AS `Post` LEFT OUTER JOIN `users` AS `User` ON `Post`.`UserId` = `User`.`id` AND (`User`.`deletedAt` IS NULL) ORDER BY `Post`.`createdAt` DESC;', parameters: {} } GET / 500 25.038 ms - 2481 GET /main.css 200 2.256 ms - 2609 exports.renderMain = async (req, res, next) => { console.log('rendermain') try { const posts = await Post.findAll({ include: { model: User, attributes: ['id', 'nick'], }, order: [['createdAt', 'DESC']] // 최신순 정렬(작성일 기준 내림차순) }); console.log(posts); res.render('main', { title: 'NodeBird', twits: posts }); } catch (error) { console.error(error); next(error); } };안녕하세요 선생님npm run start 서버 띄우고 localhost:8001 로 갔을 때 나오는 에러 입니다.사진도 같이 띄웁니다.controller/page.js 에서 16번째 줄에서 에러가 발생하길래 확인하였는데위 에러 코드에서 보이듯이 sql문에 Post테이블의 UserId 컬럼이 포함되어 있었습니다.Post 테이블 만들 때 UserId 컬럼을 명시한 적이 없는데 왜 sql 문에 포함되었는지 잘 이해가 안 갑니다ㅠㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
jwt활용한 로그아웃
혹시 로그아웃에 대한 구현은 어떤식으로 해야할까요? header에서 토큰을 제거하는 거 말고 어떤 방식으로 토큰을 무효화 할까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
invaratiant violation 에러가 뜹니다
Uncaught at new InvariantError (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\ts-invariant\lib\invariant.cjs:16:28) at Object.invariant (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\ts-invariant\lib\invariant.cjs:28:15) at parser (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\@apollo\client\react\parser\parser.cjs:34:23) at Object.verifyDocumentType (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\@apollo\client\react\parser\parser.cjs:93:21) at useMutation (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\@apollo\client\react\hooks\hooks.cjs:431:12) at BoardWrite (webpack-internal:///./pages/src/components/units/board/write/BoardWrite.container.js:34:86) at processChild (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3353:14) at resolve (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3270:5) at ReactDOMServerRenderer.render (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3753:22) at ReactDOMServerRenderer.read (file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3690:29) 콘솔창에는 이렇게 찍히고콘테이너 코드입니다import { useMutation } from "@apollo/client"; import { useRouter } from "next/router"; import { useState } from "react"; import CREATE_BOARD from "./BoardWrite.queries"; import BoardWriteUI from "./BoardWrite.presenter"; export default function BoardWrite() { const router = useRouter(); //입력값 받는 훅 const [writer, setWriter] = useState(""); const [password, setPassword] = useState(""); const [title, setTitle] = useState(""); const [contents, setContents] = useState(""); //오류코드 받는 훅 const [writerError, setWriterError] = useState(""); const [passwordError, setPasswordError] = useState(""); const [titleError, setTitleError] = useState(""); const [contentsError, setContentsError] = useState(""); //입력값 저장하는 훅 const [createBoard] = useMutation(CREATE_BOARD); //입력값(작성자) 받는곳 & 오류창 없애는곳 function onChangeWriter(event) { setWriter(event.target.value); if (event.target.value !== "") { setWriterError(""); } } function onChangePassword(event) { setPassword(event.target.value); if (event.target.value !== "") { setPasswordError(""); } } function onChangeTitle(event) { setTitle(event.target.value); if (event.target.value !== "") { setTitleError(""); } } function onChangeContents(event) { setContents(event.target.value); if (event.target.value !== "") { setContentsError(""); } } //등록 함수 const onClickInformation = async () => { if (!writer) { setWriterError("작성자를 입력해주세요"); } if (!password) { setPasswordError("비밀번호를 입력해주세요"); } if (!title) { setTitleError("제목을 입력해주세요"); } if (!contents) { setContentsError("내용을 입력해주세요"); } if (writer && password && title && contents) { try { const result = await createBoard({ variables: { createBoardInput: { writer, password, title, contents, }, }, }); console.log(result.data.createBoard._id); router.push(`/portfolio/boards/${result.data.createBoard._id}`); } catch (error) { alert(error.message); } } }; return ( <div> <BoardWriteUI aaa={onChangeWriter} bbb={onChangePassword} ccc={onChangeTitle} ddd={onChangeContents} eee={onClickInformation} aaaa={writerError} bbbb={passwordError} cccc={titleError} dddd={contentsError} /> </div> ); } 유아이 코드입니다import { Container, MainTitle, InformationBox, WriterBox, WriterInput, Title, TitleContents, TitleBox, Input, ContentsContent, AddressNumber, AddressBox, ButtonOne, AddressBtnBox, PicContentsBox, CheckBoxes, CheckBoxesContainer, CheckBoxSpan, OkBtn, UploadBtn, Address, ErrorText, } from "./BoardWrite.styles"; export default function BoardWriteUI(props) { return ( //html 자리 <Container> <MainTitle>게시물 등록</MainTitle> <InformationBox> <WriterBox> <Title>작성자</Title> <WriterInput type="text" placeholder="이름을 적어주세요." onChange={props.aaa} ></WriterInput> <ErrorText>{props.aaaa}</ErrorText> </WriterBox> <WriterBox> <Title>비밀번호</Title> <WriterInput type="password" placeholder="비밀번호를 적어주세요." onChange={props.bbb} ></WriterInput> <ErrorText>{props.bbbb}</ErrorText> </WriterBox> </InformationBox> <TitleBox> <Title>제목</Title> <TitleContents type="text" placeholder="제목을 작성해주세요." onChange={props.ccc} ></TitleContents> <ErrorText>{props.cccc}</ErrorText> </TitleBox> <TitleBox> <Title>내용</Title> <ContentsContent type="text" placeholder="내용을 작성해주세요." onChange={props.ddd} ></ContentsContent> <ErrorText>{props.dddd}</ErrorText> </TitleBox> <AddressBox> <Title>주소</Title> <AddressBtnBox> <AddressNumber type="text" placeholder="07250"></AddressNumber> <ButtonOne>우편번호 검색</ButtonOne> </AddressBtnBox> <Address type="text"></Address> <Address type="text"></Address> </AddressBox> <TitleBox> <Title>유튜브</Title> <Input type="text" placeholder="링크를 복사해주세요."></Input> </TitleBox> <TitleBox> <Title>사진 첨부</Title> <PicContentsBox> <UploadBtn>+</UploadBtn> <UploadBtn>+</UploadBtn> <UploadBtn>+</UploadBtn> </PicContentsBox> </TitleBox> <TitleBox> <Title>메인 설정</Title> <CheckBoxesContainer> <CheckBoxes type="checkbox"></CheckBoxes> <CheckBoxSpan className="youtube">유튜브</CheckBoxSpan> <CheckBoxes type="checkbox"></CheckBoxes> <CheckBoxSpan className="youtube">사진</CheckBoxSpan> </CheckBoxesContainer> </TitleBox> <OkBtn onClick={props.eee}>등록하기</OkBtn> </Container> ); } 쿼리 코드입니다import { gql } from "@apollo/client"; export const CREATE_BOARD = gql` mutation createBoard($createBoardInput: CreateBoardInput!) { createBoard(createBoardInput: $createBoardInput) { _id } } `; 마지막으로 인덱스 코드입니다,import BoardWrite from "../../../src/components/units/board/write/BoardWrite.container"; export default function board() { //자바스크립트 자리 return ( //html 자리 <div> <BoardWrite /> </div> ); } 화면에는Server ErrorInvariant Violation: Argument of undefined passed to parser was not a valid GraphQL DocumentNode. You may need to use 'graphql-tag' or another method to convert your operation into a document요렇게 적혀있는데 어떤 에러일까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
next.js가 문제인지 구성폴더와 파일이 달라요
버전이 달라서 그런지 모르겠는데다른분들은 딱히 그런 문의가 없어서 왜인지 모르겠지만 저는 page 폴더도 없고 app.js 도 없고 style폴더도 없어서 그냥 제가 따라서 만들었는데 API수업에서 app.js가 없다보니 기본컴포넌트를 사용할수 없네요..있는거라곤 app폴더안에 layout.js와page.js는 있는데 page.js이 시작파일인것 같은데 여길 수정해도 달라지는건 없더라구요..
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
복합키 설정 관련 질문
안녕하세요.항상 친절하고 상세한 답변 감사합니다.복합키 생성 관련 오류가 있어 질문드립니다.@Entity() @ObjectType() export class Dibs { @ManyToOne(() => Member) @PrimaryColumn() @JoinColumn({ name: 'memberId' }) @Field(() => Member) member: Member; @ManyToOne(() => Campground) @PrimaryColumn() @JoinColumn({ name: 'campgroundId' }) @Field(() => Campground) campground: Campground; @DeleteDateColumn() deletedAt: Date; }위와 같이 member와 campground의 id를 복합키로하여 Dibs라는 테이블을 생성하려고 합니다. 그런데 아래와 같은 오류가 발생했습니다.[Nest] 21844 - 2023. 05. 24. 오전 9:36:44 ERROR [ExceptionHandler] Data type "Member" in "Dibs.member" is not supported by "mysql" database.DataTypeNotSupportedError: Data type "Member" in "Dibs.member" is not supported by "mysql" database.그런데 해당 코드를 아래와 같이 고치면 또 정상작동하게 됩니다.@Entity() @ObjectType() export class Dibs { @ManyToOne(() => Member) @PrimaryColumn() @JoinColumn({ name: 'memberId' }) @Field(() => Member) memberId: Member; @ManyToOne(() => Campground) @PrimaryColumn() @JoinColumn({ name: 'campgroundId' }) @Field(() => Campground) campgroundId: Campground; @DeleteDateColumn() deletedAt: Date; }member -> memberId, campground -> campgroundId 라고 변수명만 바꿨을 뿐인데 정상작동하는 이유를 모르겠네요. member와 campground의 기본키가 각각 memberId와 campgroundId로 설정되어 있긴 합니다. 최종적으로 아래와 같이 구현했습니다.@Entity() @ObjectType() export class Dibs { @ManyToOne(() => Member) @PrimaryColumn() @JoinColumn({ name: 'memberId' }) @Field(() => String) memberId: string; @ManyToOne(() => Campground) @PrimaryColumn() @JoinColumn({ name: 'campgroundId' }) @Field(() => String) campgroundId: string; @DeleteDateColumn() deletedAt: Date; }위 코드도 문제없이 잘 작동합니다. 그런데 애초에 복합키를 설정하는 것이 안 좋은 것일까요? 외래키 두개로 각 레코드들이 고유하게 구분될 수 있기 때문에 따로 기본키를 설정하지 않았는데 기본키를 설정하는게 더 좋은 방법일까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
프론트에서 원하는 데이터를 찾을 때
section29까지 듣고 현재 제 프로젝트를 구축하고 있습니다.그런데 궁금한 것이 이제까지 수업에서는 데이터를 찾을 때 고유 id를 가지고 findOne 메서드를 이용해서 데이터를 찾거나 find 메서드로 전체 데이터를 다 긁어오는 방식을 사용했습니다.하지만 프론트에서는 특정 조건을 충족하는 데이터만 찾고 싶은 경우가 많을텐데요.이를 위해서 해당 조건을 찾을 수 있는 query를 다 만들어주어야 하는지 아니면 find로 데이터를 모두 취합해서 들고오면 프론트에서 알아서 원하는 데이터를 찾는 방식으로 구현되는 것이 맞는건지 궁금합니다.