묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
[BaseModel 적용하기] BaseModel에 작성된 id 프로퍼티를 OneToOne Relation의 외래키로 지정할 수 있나요?
// Base.entity.ts export abstract class BaseEntity { @PrimaryGeneratedColumn('increment') id: number; @CreatedDateColumn() createdAt: Date; @UpdatedDateColum() updatedAt: Date; } // User.entity.ts @Entity() export class User extends BaseEntity { @Column({ unique: true, }) email: string, @Column() password: string, @OneToOne(() => UserGrade, (userGrade) => userGrade.id) @JoinColumn() grade_id: number; } // UserGrade.entity.ts @Entity() export class UserGrade extends BaseEntity { @Column() grade: string; } BaseModel이 되는 BaseEntity가 있고, User와 UserGrade가 각각 BaseEntity를 상속받고 있는 형태입니다. 따라서, 각 엔티티의 기본키가 되는 id를 BaseModel에 생성되어 있습니다. 제가 궁금한 점은, User 엔티티 내에 `grade_id` 라는 프로퍼티를 만들고, 이것을 UserGrade의 id와 OneToOne 관계를 맺어주고 싶은데 id 프로퍼티를 찾지 못해 연결을 못했습니다. 제가 시도했던 방법은 추상 클래스가 아니라 생성자를 통해 자식 클래스(엔티티)로부터 id 값을 받아오는 방식을 사용해서 아래와 같이 작성해 봤습니다. 말은 안되지만 이런저런 시도를 해보았는데, 각각 연결이 안되었습니다... export class BaseEntity { constructor(obj: BaseEntity) { this.id = obj.id; this.createdAt = obj.createdAt; this.updatedAt = obj.updatedAt; } @PrimaryGeneratedColumn('increment') id: number; @CreatedDateColumn() createdAt: Date; @UpdatedDateColum() updatedAt: Date; } // User.Entity.ts @Entity() export class User extends BaseEntity { constructor(obj: User) { super(obj); Object.assign(this, obj); } ...... 생략 @OneToOne(() => UserGrade, (userGrade) => userGrade.id) @JoinColumn() grade_id: number; }// UserGrade.Entity.ts @Entity() export class UserGrade extends BaseEntity { constructor(obj: UserGrade) { super(obj); Object.assign(this, obj); @OneToOne(() => User, (user) => user.grade_id) super.id } } 혹시 이렇게 BaseEntity에서 공통되는 프로퍼티들을 관리하는 경우에, id 값을 외래키로 지정해서 연결해줄 수 있는지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버
Need Summary 부분 질문있습니다!
먼저FetchData.razor 에서 <EditForm Model="_addForecast" OnInvalidSubmit="SaveForecast"> @* Form Validation 기능 ON*@ <DataAnnotationsValidator /> @* 에러가 있으면 메시지 상세 출력*@ <ValidationSummary /> <label for="TemperatureC">TemperatureC</label> <InputNumber class="form-control" placeholder="TemperatureC" @bind-Value="_addForecast.TemperatureC" /> <label for="Summary">Summary</label> <InputText class="form-control" placeholder="Summary" @bind-Value="_addForecast.Summary" /> <br /> <button class="btn btn-primary" type="submit">Save</button> </EditForm>WeatherForecast에서 public class WeatherForecast { public DateTime Date { get; set; } [Required(ErrorMessage = "Need TemperatureC!")] [Range(typeof(int),"-100","100")] public int TemperatureC { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); [Required(ErrorMessage = "Need Summary!")] [StringLength(10, MinimumLength = 2, ErrorMessage = "2~10")] public string Summary { get; set; } } 이렇게 해주었는데Need Summary가 뜨지 않는데 이유를 알수 있을까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
트랜잭션 사용 유의점
안녕하세요. 지난번 질문에 빠른 답변감사합니다. 트랜잭션 공부 중 주의사항에 대한 블로그 글을 짧게 봤는데요, 트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다는 내용이었습니다. 결제 부분만 트랜잭션을 사용하고 나머지 게시판, 채팅 등 다른 기능 구현시 굳이 트랜잭션 사용 안해도 되는거죠?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
포트폴리오는 몇개가 좋을까요?
프론트 엔드 강의에 있는 포트폴리오 1개백엔드 강의에 있는 포트폴리오 1개이 강의에 총 포트폴리오가 2개 있는데2개 다 하는게 좋을까요?
-
해결됨[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
Basic 토큰을 API 서버가 받아서 어떤식으로 검증을 하는지 궁금합니다
안녕하세요 코드팩토리님!! Flow chart보다가 궁금증이 생겨서 질문드립니다~ 토큰 발급 과정에서 클라이언트가 "username:password" 정보를 인코딩 후 API 서버로 전송하면 API 서버는 Basic 토큰을 받아서 디코드 후 "username:password" 정보를 추출해서 사용자가 유효한지 검증한다고 하는데플로우 차트 보면 데이터베이스에 사용자 정보를 요청하지 않는데 API 서버가 어떤 방식으로 지금 이 사용자가 유효한지를 검증하는 건가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
ElasticSearch 개념 내용은 어디서 볼 수 있나요?
ElasticSearch 개념을 학습할 수 있는 부분이 검색 섹션에 있을 거 같은데 보이지 않아 여쭤봅니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버
계속 똑같은 에러가 뜹니다 ㅠㅠ
An unhandled exception occurred while processing the request.InvalidOperationException: The view 'Index' was not found. The following locations were searched:/Views/Home/Index.cshtml/Views/Shared/Index.cshtml 라고 계속 뜨는데저는 Shared폴더 자체도 없는데 계속 다른곳에서 파일을 찾는것 같은데 어떻게 해결해야하나요?
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
강좌가 현재 업데이트 되고 있는지가 궁금합니다 !
안녕하세요 이틀전에 강의 수강을 시작하여 너무나도 유익한 강의에 늘 놀라면서 듣고 공부하고 있는 학생입니다.현재 팔로우 시스템이 39강으로 마지막으로 올라와있는데 이후 40,41,42 등등에서 댓글 및 게시글 좋아요 같은 기능도 업데이트 예정인가요 ?혹은 이미 현재 파트 1 강좌는 끝이난 것인지 궁금합니다 !++++게시글과 댓글의 권환 관련 가드에서 auth모듈에 있는 Bearer토큰 을 활용하여 사용자의 id만 사용해서 권한을 사용할수 있을꺼라고 생각 드는데 맞을까요 ?게시글,댓글 가드를 따로 만드신게 코드를 깔끔하고 유지보수를 편하게 하기 위함인지 아니면 제가 생각한대로 bearer토큰만 사용한 가드로만 게시글과 댓글 까지 권한 확인을하면 다른 문제점이 있는지가 궁금합니다 !!++++현재 깃허브 코드에 채팅 가드 관련 코드는 빠져있는데 혹시 추가된 코드가 따로 있는지 알수 있을까요 ?혹은 채팅 관련 가드에 대한 코드가 빠진 이유가 있는지도 궁금합니다.!
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
안녕하세요 리액트에서 fetchUser를 이용해 로그인이 되어있는지 검증하려고 합니다
리액트에서 fetchUser를 이용해 로그인이 되어있는지 검증하려고 하는데 로그인api를 호출 후 fetchUser를 호출하면 Unauthorized에러가 납니다 헤더에 토큰이 저장되지 않아서 그런걸까요?
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
getPostById를 다른 함수에서 사용
안녕하세요 강사님 CRUD를 위한 API를 생성하는 과정에서 의문이 생겨 질문 드립니다. Post부분에서 getPostById 함수를 구현을 했는데, 다른 함수들에서 getPostById와 동일한 로직이 필요한 것을 발견했습니다! 예를 들어, update 또는 delete 함수를 구현할 때, id에 맞는 post를 검색하고, 만약 존재하지 않는다면 에러를, 존재한다면 post를 반환하는 로직이 필요합니다. 근데 getPostById 함수가 그 로직을 그대로 갖고 있기 때문에 다른 함수들에서 getPostById 함수를 가져다 사용해도 되나 해서 여쭤봅니다.이런식으로요!코드 가독성 측면에서는 더 좋아보이긴 하지만, 이게 안티패턴인지 아닌지를 모르겠기도 하고, 제가 모르는 문제가 있나 싶어서 여쭤봅니다!감사합니다!
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
npm 대신 yarn을 사용하는 이유가 있나요?
yarn을 사용했을 때 compatibility 문제가 있을 수 있다고 아는데 그럼에도 불구하고 npm 대신 yarn을 사용하시는 이유가 궁금해서 질문 남깁니다. 질 좋은 강의 감사합니다.
-
해결됨mongoDB 기초부터 실무까지(feat. Node.js)
updateMany에서 user._id를 못찾는 상황
강좌대로 Blog.updateMany({ "user._id": userId }, { "user.name": name })로 하니 블로그 데이터 유저 정보가 변경이 계속 안되고 있습니다 ㅠㅠ 유저 데이터는 정상적으로 변경이 되었는데요 문제점을 모르겠습니다.해당 코드 깃허브 : https://github.com/alinfanclub/KimDevlogServer/blob/updateMany/src/routes/userRouter.js userRouter.put("/:userId", async (req, res) => { try { const { userId } = req.params; if (!mongoose.isValidObjectId(userId)) return res.status(400).send({ err: "invalid userId" }); const { age, name } = req.body; if (!age && !name) return res.status(400).send({ err: "age or name is required" }); if (age && typeof age !== "number") return res.status(400).send({ err: "age must be a number" }); if (name && typeof name.first !== "string" && typeof name.last !== "string") return res.status(400).send({ err: "first and last name are strings" }); // let updateBody = {}; // if(age) updateBody.age = age; // if(name) updateBody.name = name; // const user = await User.findByIdAndUpdate(userId, updateBody, { new: true }); let user = await User.findById(userId); if (age) user.age = age; if (name) { user.name = name; await Blog.updateMany({ "user._id": userId }, { "user.name": name }); } await user.save(); return res.send({ user }); } catch (err) { console.log(err); return res.status(500).send({ err: err.message }); } });
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
안녕하세요 08-02-nestjs-with-graphql 폴더실행시에러
안녕하세요 해당영역 학습중인데 서버실행시 자꾸 Error: Cannot find module '@apollo/server' 이런에러가 발생됩니다 그래서 node_modules 디렉토리 삭제후 다시 설치해보고 yarn add apollo-server 명령어를 사용해서 설치도해보았는데도 동일한 증상입니다..ㅠ 그래서 앞부분 학습을 못하고잇어요 ㅠ 현재 버전은 이러합니다 !
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
식별 관계랑 비식별 관계
안녕하세요 강의 끝까지 잘봤습니다!!!강의 시청 후 포트폴리오용 프로젝트 설계 중에 식별 관계에 대해 의문이 생겨서 질문합니다! 우선 식별 관계로 구성 시 자식 테이블에 데이터를 넣기 전에 부모 테이블에 데이터가 필수적으로 존재해야 한다고 알고 있습니다.이는 개발자가 실수로 데이터를 입력하는 것을 막아줌으로써 데이터 정합성을 DB에서도 체크할 수 있지만, 만약 요구사항이 변경된다면 테이블의 데이터와 구조를 모두 변경해야하는 불상사가 발생할 수 있다고 알고 있습니다. 그렇다면 굳이 식별 관계로 설정할 필요가 있나요?? 그냥 전부 비식별 관계로 설정하면 안될까요? 포트폴리오에 올릴 프로젝트를 만드는 중이라 정석대로 식별 관계로 설정해야 하나 싶은데, 아직 뭐가 뭔지 잘 모르는 상태에서 괜히 복잡하게 식별 관계로 설정하는게 맞는건가 잘 모르겠어서요ㅜㅜ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
gcp gke configmap관련 질문드립니다
gcp gke configmap관련 질문드립니다지워도 보고 docker-compose file에서 envfile 주석처리되어있는데도 막상 디플로이하면 항상 env에 localhost로 나와버리네요configmap에선 정상적으로 제가 입력한값으로 뜨는데 적용이 안됩니다로컬에서 도커이미지 전부다 지워봤는데도 계속 그럽니다, 어떻게 해야할까요?
-
해결됨[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
[Create 함수로 새로운 데이터 생성하기] create() 함수 질문
안녕하세요 선생님흐름에는 진짜 전-혀 지장없는데 궁금한 게 하나 생겨서 여쭤봐요 포스트 만들 때여기서 repository.create() 에 툴팁을 올리면 엔티티를 DeepPartial로 받더라구요.근데 이러면 필수 정보를 빠트려도 컴파일 단계에서 알아챌 도리가 없게 되는 거 아닌가? 이게 궁금했어요. 자동완성 기능을 제공해주긴 하지만, 직접 객체를 만들어서 save() 에 넣는 게 더 나은(적어도 안전한) 선택 아닌지제가 아직 TDD를 경험해보지 못해 이 부분이 궁금했슴미다... 에러내기도 힘든 초보적인 구역이지만 정신줄을 종종 놓고 살아서요ㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
결제 질문
안녕하세요.강의 잘 듣고 있습니다. 강사님 따라서 포트원으로 결제 만들고 있다가 문득 궁금한 점이 생겨서 질문 드립니다. 유저가 결제할 때 악의적으로 매크로를 이용해 결제 버튼을 여러 번 클릭하면 여러 번 결제가 될 수 있을까요?제가 포트원 카카오페이로 결제했을때 m_redirect_url(모바일 환경)을 설정했더니 재결제가 되지는 않았어요. 포트원으로 결제할 때는, 포트원이 각 거래마다 merchant_uid나 imp_uid를 설정해줘서 재결재가 안일어나는 건가요?
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - Part 1 NestJS Core
섹션 8 에서 도커 컴포스파일 작성해보기 에서 에러
안녕하세요docker-compose up 명령어를 입력했을 때 에러가 나왔습니다에러 내용joy@gimjonghuiui-MacBookAir CF_SNS % docker-compose upAttaching to cf_sns-postgres-1Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/host_mnt/Users/joy/Documents/NestJs/CF_SNS/postgres-data" to rootfs at "/var/lib/postgresql/data": mount /host_mnt/Users/joy/Documents/NestJs/CF_SNS/postgres-data:/var/lib/postgresql/data (via /proc/self/fd/9), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type 위에 내용이 뜨면서 실행이 안되는것 같습니다postgres-data 관련 파일도 새롭게 만들어지지 않았습니다어떻게 해결하면 좋을까요..?
-
해결됨가장 빠른 풀스택: 파이썬 백엔드와 웹기술 부트캠프 (flask/플라스크와 백엔드 기본) [풀스택 Part1-1]
동적함수생성 질문드립니다.
안녕하세요 선생님!감사히 잘 듣고 있는 수강생입니다.맨 마지막 도전과제 질문이 있어 문의드립니다.하나의 태그에 대해서만 만드는게 아니라나온 html 태그들을 각 함수에 할당하는 for 문으로 한번 돌려보고 싶어서... 이런식으로 했더니 err가 납니다.def 함수 <--- 이 함수부분을 동적으로 할당할 수 있는 방법이 있을까요....? print_center 라고 되어있는부분은 계속 덮어씌워지는걸 확인했습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
핸드폰에 전송이 안 되네요 ㅜㅜ
강의랑 똑같이 따라한 것 같은데.. postman에서는 오류가 발생하지 않고 인증완료라고 뜨긴 하는데요,vscode의 터미널을 보면 발신번호 미등록이라고 뜨고 .. 핸드폰에 전송이 안 되네요.뭐가 문제일까요? coolsms, mysms, API key랑 API secret도 cSpell 오류가 뜨길래 상위 폴더에서 .cspell.json 파일 만들어서 오류 안뜨게 했는데.. 여기서부터 문제였던 걸까요? 참고로 yarn add coolsms-node-sdk도 했고.. 분명 다 한 것 같은데ㅜ 어디서부터 잘못된건지 정말 모르겠어요..혹시 제가 코드 이상하게 작성하거나 잘못된 부분이 있나 해서.. 코드도 붙여봅니다 ㅜㅜ꼭 성공하고 싶은데 제가 아직 코린이라 ㅜㅜ 다 어렵기만 하네요 ㅜㅜ { "name": "04-01-rest-api-with-express", "version": "1.0.0", "main": "index.js", "license": "MIT", "type": "module", "scripts": { "dev": "nodemon index.js" }, "dependencies": { "coolsms-node-sdk": "^2.0.1", "cors": "^2.8.5", "express": "^4.18.2", "nodemon": "^3.0.1", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0" } } import coolsms from "coolsms-node-sdk"; export function checkValidationPhone(myPhone) { if (myPhone.length !== 10 && myPhone.length !== 11) { console.log("에러 발생!!! 핸드폰 번호를 제대로 입력해 주세요!!!"); return false; } else { return true; } } export function getToken() { const myCount = 6; if (myCount === undefined) { console.log("에러 발생!!! 갯수를 제대로 입력해 주세요!!!"); return; } else if (myCount <= 0) { console.log("에러 발생!!! 갯수가 너무 적습니다!!!"); return; } else if (myCount > 10) { console.log("에러 발생!!! 갯수가 너무 많습니다!!!"); return; } const result = String(Math.floor(Math.random() * 10 ** myCount)).padStart( myCount, "0" ); return result; // console.log(result) } export async function sendTokenToSMS(fff, ggg) { // console.log(fff + "번호로 인증번호" + ggg + "를 전송합니다!!"); const mysms = coolsms.default; const messageService = new mysms( "NCSESSQG0X1RZAGF", "2OFMQEDM5YCL59ICURBSPJGD08R1FQOG" ); const result = await messageService.sendOne({ to: fff, from: ggg, text: `[코드캠프] 안녕하세요?! 요청하신 인증번호는 [${ggg}] 입니다.`, }); console.log(result); } import { checkValidationPhone, getToken, sendTokenToSMS } from "./phone.js"; import express from "express"; import swaggerUi from "swagger-ui-express"; import swaggerJsdoc from "swagger-jsdoc"; import { options } from "./swagger/config.js"; import cors from "cors"; const app = express(); app.use(cors()); app.use(express.json()); app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerJsdoc(options))); app.get("/boards", (req, res) => { //1. 데이터를 조회하는 로직 => DB에 접속해서 데이터 꺼내오기 const result = [ { number: 1, writer: "철수", title: "제목1", contents: "내용1" }, { number: 2, writer: "맹구", title: "제목2", contents: "내용2" }, { number: 3, writer: "훈이", title: "제목3", contents: "내용3" }, ]; //2. 꺼내온 결과 응답 주기 res.send(result); }); app.post("/boards", (req, res) => { // 1. 데이터를 등록하는 로직 => DB에 접속해서 데이터 저장하기 // 프론트엔드로부터 데이터 받아오기 // 콘솔로 찍어서 확인 해보기 console.log(req.body); // 2. 저장 결과 알려주기 res.send("게시물 등록에 성공하였습니다."); }); app.post("/tokens/phone", (req, res) => { const myPhone = req.body.aaa; // 1. 휴대폰번호 자릿수 맞는지 확인하기 const isValid = checkValidationPhone(myPhone); if (isValid) { // 2. 핸드폰 토큰 6자리 만들기 const myToken = getToken(); // 3. 핸드폰번호에 토큰 전송하기 sendTokenToSMS(myPhone, myToken); res.send("인증완료"); } }); app.listen(3000, () => { console.log(`Example app listening on port ${3000}`); });