묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
파이어베이스 vs AWS
배포에서 대표적인 클라우드 서비스로 AWS, GCP, Azure 를 알려주셨는데요혹시 파이어베이스도 같은 묶음으로 봐도 될까요?? 파이어베이스는 AWS처럼 사용할 수 없나요??파이어베이스는 DB, 서버 용으로만 배우는게 좋을까요??
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
최적화하기 11분 50초
import React from "react"; import { useNavigate } from "react-router-dom"; import MyButton from "./MyButton"; const DiaryItem = ({ id, emotion, content, date }) => { const navigate = useNavigate(); const goDetail = () => { navigate(`/diary/${id}`); }; const goEdit = () => { navigate(`/edit/${id}`); }; const strDate = new Date(parseInt(date)).toLocaleDateString(); return ( <div className="DiaryItem"> <div onClick={goDetail} className={[ "emotion_img_wrapper", `emotion_img_wrapper_${emotion}`, ].join(" ")} > <img src={process.env.PUBLIC_URL + `assets/emotion${emotion}.png`} /> </div> <div className="info_wrapper" onClick={goDetail}> <div className="diary_date">{strDate}</div> <div className="diary_content_preview">{content.slice(0, 25)}</div> </div> <div className="btn_wrapper"> <MyButton text={"수정하기"} onClick={goEdit} /> </div> </div> ); }; export default React.memo(DiaryItem); // 왜 렌더링 계속 되지?ㅡㅡㅡㅡㅡ 안녕하세요 강사님!최적화 하는 과정에서 DiaryItem 에 React.memo를 적용시켰는데도 렌더링이 계속됩니다ㅜ혹시 useNavigate 부분 코드때문에 그럴까요?구글링해보니까'원인은 react-router가 V6로 업그레이드 되면서 URL이 변경 될 경우 useNavigate함수를 계속 재생성하도록 변경 되었다는것을 알게 되었습니다.'이런 글을 읽어서요,, 답변부탁드립니다! 강의 잘 듣고 있습니다. 좋은 강의 감사합니다!
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
수정하기로 들어가서 작성완료를 누르면 일기가 사라지는 현상
안녕하세요 질문이 있는 데요어플리케이션 툴에서는 이력은 그대로 남아 있는데새로 일기 작성하고 수정화면에서 수정하고 작성완료 누르면 UI적으로 일기가 사라지는 데 문제를 알고 싶습니다.그리고 빌드하고 배포시에 사진첨부처럼 터미널에 이렇게 나오는 현상은 문제가 없는건지요?답변 부탁드립니다.긱에 올리는 중에 긱이 서툴러서 ignore파일과readme파일이 예전거와 충돌? 비슷한게 생긴것 같은데 양해 부탁드립니다.https://github.com/k-songs/Syal
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
docker mysql dbeaver utf-8 error
docker로 mysql server를 띄우고 product_category table 에서 전자제품, uuid 를 등록하고 save를 누르면 한글을 인식할 수 없다는 에러가 납니다. 해결방법이 궁금합니다. ERROR [ExceptionsHandler] Incorrect string value: '\xEC\xA3\xBC\xEC\x86\x8C' for column 'address' at row 1
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
소셜인증
안녕하세요 다음 연재 강의 주제는 소셜 인증이라고 강의 노트에 써있으나 저에게 프로젝트3는 이번 강의가 마지막인데 맞나요??
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
nestjs, graphql 강의중 resolver에서 service 클래스 메서드에 접근을 못 하는듯 합니다.(인젝트가 제대로 안된 듯 합니다.)
안녕하세요. 강사님."Nest.js - GraphQL 연결" 강의중 제목과 같이 resolver에서 service의 메서드로 접근을 못하는듯 합니다. 그럼 인젝트가 안된거 아닌가요? 해결책 문의 드립니다. "yarn start:dev" 오류없이 실행은 됩니다.app.module.ts, boards.module.ts, boards.resolver.ts boards.service.ts 코드 입니다.// app.module.ts import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { BoardModule } from './apis/boards/boards.module'; @Module({ imports: [ BoardModule, GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: 'src/commons/graphql/schema.gql', }), ], // controllers: [AppController], // providers: [AppService], }) export class AppModule {}// boards.module.ts import { Module } from '@nestjs/common'; import { BoardResolver } from './boards.resolver'; import { BoardService } from './boards.service'; @Module({ // imports: [], // controllers: [], providers: [BoardResolver, BoardService], }) export class BoardModule {}// boards.resolver.ts import { Query, Resolver } from '@nestjs/graphql'; import { BoardService } from './boards.service'; @Resolver() export class BoardResolver { constructor(private readonly boardService: BoardService) {} @Query(() => String) getString(): string { return this.boardService.serviceString(); } @Query(() => Number) getNumber(): number { return this.boardService.serviceNumber(); } @Query(() => Boolean) getOnlyResolver(): boolean { return true; } }// boards.service.ts import { Injectable } from '@nestjs/common'; @Injectable() export class BoardService { serviceString() { return 'Hello World!'; } serviceNumber(): number { return 100; } }"getOnlyResolver" 쿼리는 정상적입니다. Service까지 가지 않도록 테스트 했습니다."getString" 쿼리는 Service의 "serviceString()" 메서드로 접근 합니다. (오류 발생)"getNumber" 쿼리는 Service의 "serviceNumber()" 메서드로 접근 합니다. (오류 발생)"package.json" 정보 입니다.{ "name": "aaa", "version": "0.0.1", "description": "", "author": "", "private": true, "license": "UNLICENSED", "scripts": { "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { "@apollo/server": "^4.5.0", "@nestjs/apollo": "^11.0.4", "@nestjs/common": "^9.0.0", "@nestjs/core": "^9.0.0", "@nestjs/graphql": "^11.0.4", "@nestjs/platform-express": "^9.0.0", "graphql": "^16.6.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0" }, "devDependencies": { "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", "@types/express": "^4.17.13", "@types/jest": "29.2.4", "@types/node": "18.11.18", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "eslint": "^8.0.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "jest": "29.3.1", "prettier": "^2.3.2", "source-map-support": "^0.5.20", "supertest": "^6.1.3", "ts-jest": "29.0.3", "ts-loader": "^9.2.3", "ts-node": "^10.0.0", "tsconfig-paths": "4.1.1", "typescript": "^4.7.4" } } 감사합니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
context 질문 있습니다.
안녕하세요export const AuthProvider = ({ children }: { children: React.ReactNode }) => {}에서 ({ children }: { children: React.ReactNode }) 질문입니다.뒤에 타입 부분이 헷갈리는데, ({ children }: { children: React.ReactNode }) 하지 않고 ({ children }: React.Node} 이렇게 하면 왜 안되는건가요?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
prettier 관련 질문드립니다.
prettier 관련 질문도 드려도 되는지 모르겠지만 일단 강의에서 나와서 질문드립니다! :) 프리티어 세팅을 하고 작업을 하다가const test = { a: "test", b: "test2", };위와 같은 코드를 써봤는데요. 이 때, 제가 원하는건 a속성과 b속성의 간격이 없는 즉, 의미없는 빈 줄이 없도록 하는 것입니다. 하지만, 이걸 prettier로 자동으로 하는 속성 값을 인터넷으로 찾아봐도(사실 검색할 단어를 잘 못찾은 것 같습니다) 없어서요.. 질문에 올립니다! 감사합니다!
-
미해결습관부터 바꿔주는 Node.js & Express 기초
디스코드 채널
디스코드 채널 링크는 어디서 확인할 수 있나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
CreateBoardComment
안녕하세요 createBoardComment 만들려고 mutation CreateBoardCommet doc을 보고 하고 있는데createBoardCommentInput과 boardId:ID! 를 두개다 써야되는데 어떻게 해야 되는지 알수 있을까요? 또한 밑에 createBoardComment도 필요하다 하는데 어떻게 써야되는건가요?감사합니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
안녕하세요 server에서 res.json과 res.send에 대해 궁금하네요
보통 항상 프론트엔드에 보낼때 res.json으로 보내었는데 이번에는 res.send를 사용 하였는데 2개가 차이가 있을까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Aws관련질문
강좌에서 aws 인스턴스를 2개를 사용해 프론트서버와 백엔드서버를 배포한것과는 다르게 프리티어 인스턴스 한개로 두개의 서버를 배포하려하는데 aws 서버 메모리가 부족할까요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
"세팅 제이슨" 질문 보고왔는데 안되서 질문드립니다.
설정 창에 검색하니까 settings.json 이 안나오네요 ㅠㅠ 어떡하죠 편집이 안되네요 윈도우라 ctrl shift p 누르면 settings.json은 나와요
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
front, front-js, front-rq 폴더 질문
총 2개의 질문사항이 있습니다. GitHub에서 제공해주신 front폴더를 사용하려고 하는데, 아래와 같이 이름이 다른 front 폴더가 총 3개가 있습니다.front-jsfront-rqfront 질문1. 이 중, 어떤 폴더에서 npm run dev의 명령어를 입력해야 하는 것인지 궁금합니다. 질문2. front이름 뒤에 붙어있는 js와 rq의 의미가 궁금합니다!
-
미해결Node.js로 웹 크롤링하기
페이스북 로그인
<button value="1" class="_42ft 4jy0 6lth 4jy6 4jy1 selected 51sy" name="login" data-testid="royallogin_button" type="submit" id="u_0_c_Cc">로그인</button> document.querySelector('#u_0_9_LS').click();위에 같이 실행하였는데 id값이 계속 변동하여 로그인 안되어서 document.querySelector('._42ft _4jy0 _6lth _4jy6 _4jy1 selected _51sy').click();class로 했는데도 로그인 안되네요 ??방법이 없나요?
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
안녕하세요.
안녕하세요.현재 새로 나온 노드 교과서 이북과 현영님께서 주신 현물 책도 가지고 있는 상황에서 공부를 시작하려고 하는데 강의 결제 후 같이 보는건 어떨까요??공부하는데 돈은 아끼면 안된다고 생각하는 편이라 학습 효율이 가장 중요합니다. 예전에 유튜브로 하나만 구매하면 된다곤 하셨는데 둘 다 병행하면서 보면 어떨지 궁금합니다. 그리고 만약 하나를 선택 한다면 책, 강좌 중 뭐가 더 괜찮을지 혹은 개인의 성향 차이일지도 궁금합니다.항상 좋은 강좌 감사합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
bcrypt를 설치하니까 docker 컨테이너가 실행이 안되네요ㅠ
검색을 나름대로 열심히 해봤는데잘 해결이 되지 않아서 질문 남깁니다.error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid elf header에러 메시지는 이렇습니다.bcrypt가 설치되는 OS에 따라 버전이 달라서 그렇다는거 같은데, Dockerfile에 bcrypt 삭제했다가 설치하는 명령어도 넣어봤는데 잘 안되네요ㅠ
-
해결됨mongoDB 기초부터 실무까지(feat. Node.js)
session.abortTransaction()에 대한 실제 예시 문의
아래 명령어를 통해 transaction이 실패했을 때 원복한다고 하는데, 저런 것은 catch문에 넣어야 하는 것이 맞나요? 아니면 if else로 문제점을 발견했을 때 처리하게 하는 걸까요?즉, 저 코드를 실제로 사용할 때, 어떤 모습으로 들어가는 지 궁금합니다.session.abortTransaction()
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
프론트에서 useSWR로 받아온 data 콘솔로그로
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이걸 백엔드부분에서 콘솔로그를 출력안하고프론트에서 로그출력하는 법은 없을까요??백엔드에서말고 프론트에서도 받아온 데이터 보고싶은데 콘솔로그하면 데이터가 안뜨고, undefined만 떠서요..
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
토큰 재발급 API 실습 중 restoreAccessToken 401 에러
강사님 안녕하세요?토큰 재발급 API 실습 중에 해결되지 않는 부분이 있어 질문드려요. 관련 코드는 강의에서 진행하는 대로 모두 작성하였고, 마지막 실습 부분에서 막힙니다. login 과 fetchUser 까지는 진행이 잘 되는데문제는,restoreAccessToken 부분에서 401 에러가 발생합니다.관련 에러 명령 프롬프트 화면입니다. 관련 쿠키 값 입니다.(login 시도 시 쿠키 값)코드는 실습대로 다 작성했구요.실습도 그대로 따라하는 중 restoreAccessToken 부분만 에러가 나네요. auth.resolver.ts 의 @UseGuards 데코레이터를 빼보기도 하고, 제 나름대로 해결책을 찾아보려 했는데 잘 모르겠네요. 구글링 해봐도 안되고,혹시 제가 빼먹은 부분이나 잘못한 부분이 있을까요?도움 부탁드립니다 :) 아래는 관련 제 코드들 입니다. auth.module.tsimport { Module } from '@nestjs/common'; import { AuthResolver } from './auth.resolver'; import { AuthService } from './auth.service'; import { JwtModule } from '@nestjs/jwt'; import { UserService } from '../users/user.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from '../users/entities/user.entity'; import { JwtRefreshStrategy } from 'src/commons/auth/jwt-refresh.strategy'; @Module({ imports: [ JwtModule.register({}), // TypeOrmModule.forFeature([User]), ], providers: [ JwtRefreshStrategy, // AuthResolver, AuthService, UserService, ], }) export class AuthModule {} auth.resolver.tsimport { UnprocessableEntityException, UseGuards } from '@nestjs/common'; import { Args, Context, Mutation, Resolver } from '@nestjs/graphql'; import { UserService } from '../users/user.service'; import * as bcrypt from 'bcrypt'; import { AuthService } from './auth.service'; import { GqlAuthRefreshGuard } from 'src/commons/auth/gql-auth.guard'; import { CurrentUser } from 'src/commons/auth/gql-user.param'; @Resolver() export class AuthResolver { constructor( private readonly userService: UserService, // private readonly authService: AuthService, ) {} @Mutation(() => String) async login( @Args('email') email: string, // @Args('password') password: string, @Context() context: any, ) { // 1. 로그인(이메일이 일치하는 유저를 DB에서 찾기) const user = await this.userService.findOne({ email }); // 2. 일치하는 이메일이 없으면 -> 에러 던지기!! if (!user) throw new UnprocessableEntityException('이메일이 없습니다.'); // 3. 일치하는 이메일이 있지만, 비밀번호가 틀렸다면 -> 에러 던지기!! const isAuth = await bcrypt.compare(password, user.password); if (!isAuth) throw new UnprocessableEntityException('암호가 틀렸습니다.'); // 4. refreshToken(=JWT)을 만들어서 프론트엔드(쿠키)에 보내주기 this.authService.setRefreshToken({ user, res: context.res }); // 5. 이메일과 비밀번호 모두 일치한다면 -> accessToken(=JWT)을 만들어서 브라우저에 전달하기 return this.authService.getAccessToken({ user }); } @UseGuards(GqlAuthRefreshGuard) @Mutation(() => String) restoreAccessToken( @CurrentUser() currentUser: any, // ) { return this.authService.getAccessToken({ user: currentUser }); } } auth.service.tsimport { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; @Injectable() export class AuthService { constructor( private readonly jwtService: JwtService, // ) {} setRefreshToken({ user, res }) { const refreshToken = this.jwtService.sign( { email: user.email, sub: user.id }, { secret: 'myRefreshKey', expiresIn: '2w' }, ); // 개발 환경 res.setHeader('Set-Cookie', `refreshToken=${refreshToken}`); // 배포 환경 // res.setHeader('Access-Control-Allow-Origin', 'https://myfrontsite.com') // res.setHeader( // 'Set-Cookie', // `refreshToken=${refreshToken}; path=/; domain=.mybacksite.com; SameSite=None; Secure; httpOnly;` // ) } getAccessToken({ user }) { return this.jwtService.sign( { email: user.email, sub: user.id }, { secret: 'myAccessKey', expiresIn: '30s' }, ); } } jwt-refresh.strategy.tsimport { PassportStrategy } from '@nestjs/passport'; import { Strategy } from 'passport-jwt'; export class JwtRefreshStrategy extends PassportStrategy(Strategy, 'refresh') { constructor() { super({ jwtFromRequest: (req) => { const cookie = req.headers.cookie; const refreshToken = cookie.replace('refreshToken=', ''); return refreshToken; }, secretOrKey: 'myRefreshKey', }); } validate(payload) { console.log(payload); // { email: c@c.com, sub: qkwefuasdij-012093sd } return { email: payload.email, id: payload.sub, }; } } gql-auth-guard.tsimport { ExecutionContext } from '@nestjs/common'; import { GqlExecutionContext } from '@nestjs/graphql'; import { AuthGuard } from '@nestjs/passport'; export class GqlAuthAccessGuard extends AuthGuard('access') { getRequest(context: ExecutionContext) { const ctx = GqlExecutionContext.create(context); return ctx.getContext().req; } } export class GqlAuthRefreshGuard extends AuthGuard('refresh') { getRequest(context: ExecutionContext) { const ctx = GqlExecutionContext.create(context); return ctx.getContext().req; } } app.module.tsimport { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AuthModule } from './apis/auth/auth.module'; import { BoardModule } from './apis/boards/boards.module'; import { ProductModule } from './apis/products/product.module'; import { ProductCategoryModule } from './apis/productCategory/productCategory.module'; import { UserModule } from './apis/users/user.module'; // import { AppController } from './app.controller'; // import { AppService } from './app.service'; @Module({ imports: [ AuthModule, BoardModule, ProductModule, ProductCategoryModule, UserModule, GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: 'src/commons/graphql/schema.gql', context: ({ req, res }) => ({ req, res }), }), TypeOrmModule.forRoot({ type: 'mysql', // 데이터 베이스 타입 host: 'localhost', // local 환경으로 진행 port: 3306, // mysql은 기본 port는 3306 username: 'root', // mysql은 기본 user는 root로 지정 password: 'bada332@', // 본인의 mysql password database: 'myproject03', // 연결할 데이터 베이스명 entities: [__dirname + '/apis/**/*.entity.*'], // 데이터 베이스와 연결할 entity synchronize: true, // entity 테이블을 데이터베이스와 동기화할 것인지 logging: true, // 콘솔 창에 log를 표시할 것인지 }), ], // controllers: [AppController], // providers: [AppService], }) export class AppModule {}