묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
테스트 오류
수업에서 처럼 이렇게 코드를 작성했을 때는 오류가 발생하는데placeholder를 넣으면 에러가 나지않습니다. 왜그런지 알 수 있을까요?!
-
해결됨Next + React Query로 SNS 서비스 만들기
배포테스트할때 클라이언트에서 api호출하면 쿠키가 전달되지 않고있습니다.
안녕하세요 선생님배포테스트할때 클라이언트에서 api호출하면 쿠키가 전달되지 않고있습니다. 클라이언트에서는credentials: 'include'를 적용했고const response = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/user/setting`, { method: 'PATCH', credentials: 'include', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(userSettingObj), }); if (response.ok) { const sessionUpdateInfo = await response.json(); await updateSession(sessionUpdateInfo); router.push('/'); } 서버에서는const express = require('express'); const cors = require('cors'); const passport = require('passport'); const session = require('express-session'); const cookieParser = require('cookie-parser'); const dotenv = require('dotenv'); const morgan = require('morgan'); const path = require('path'); const hpp = require('hpp'); const helmet = require('helmet'); const postRouter = require('./routes/post'); const postsRouter = require('./routes/posts'); const userRouter = require('./routes/user'); const usersRouter = require('./routes/users'); const db = require('./models'); const passportConfig = require('./passport'); dotenv.config(); const app = express(); db.sequelize.sync() .then(() => { console.log('db 연결 성공') }) .catch(console.error); passportConfig(); if (process.env.NODE_ENV === 'production') { app.use(morgan('combined')); app.use(hpp()); app.use(helmet()); } else { app.use(morgan('dev')); } app.use( cors({ origin: ['http://localhost:3000', 'whatisyourmbti.com', 'http://43.201.56.221'], // true or * // access-control-allow-origin가 true된다. --> 다른 도메인끼리 api 요청 credentials: true, // access-control-allow-credential가 true된다. --> 다른 도메인끼리 쿠키 전달 method: '*', }) ); // 프론트에서 보낸 정보를 req.body에 넣어준다. 순서 중요! app.use(express.json()); // json 형식으로 보냈을때 데이터 처리해줌 app.use(express.urlencoded({ extended: true })); // form submit으로 보냈을 때 데이터 처리해줌 app.use(cookieParser(process.env.COOKIE_SECRET)); app.use(session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, } })); app.use(passport.initialize()); app.use(passport.session()); app.use((req, res, next) => { console.log('Session ID:', req.sessionID); console.log('Cookies:', req.cookies); console.log('Signed Cookies:', req.signedCookies); next(); }); app.get('/', (req, res) => { res.send('hello express'); }); app.get('/api', (req, res) => { res.send('hello api'); }); app.use('/post', postRouter); app.use('/posts', postsRouter); app.use('/user', userRouter); app.use('/users', usersRouter); app.listen(80, () => { console.log('서버 실행 중!'); });credentials: true, 쿠키옵션을 설정해주었는데0|app | Session ID:---------------------------- U8DRuillNv2DBRmexmO1mZZ7fGJeWXCw0|app | Cookies:------------------------------- [Object: null prototype] {}0|app | Signed Cookies:------------------------ [Object: null prototype] {}이런식으로 쿠키값이 전달되고 있지 않아서유저 정보가 필요한(로그인 확인)로직에서 401에러가 떨어지게 됩니다.app.use(session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, cookie: { httpOnly: true, secure: false, } }));위부분들을 검색해보고 바꿔보기도 했는데, 잘안되더라구요.클라이언트의 ip는 http://43.201.56.221입니다. 쿠키는 로그인 후 프론트서버에서 브라우저에 삽입해주고 있습니다.console.log(`${process.env.NEXT_PUBLIC_BASE_URL}/user/login ---------------------login api`); const authResponse = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/user/login`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ...credentials }), } ); // 프론트서버에서 백엔드서버의 로그인 토큰을 받아온것. 토큰은 문자열이라서 // cookie라이브러리로 객체로 만들어준다. let setCookie = authResponse.headers.get('Set-Cookie'); console.log('set-cookie', setCookie); if (setCookie) { const parsed = cookie.parse(setCookie); console.log(parsed, '---------------parsed cookie'); // 브론트서버에서 브라우저에 쿠키를 심어준다. // 프론트서버에 쿠키를 심으면 안된다! 왜냐하면 프론트서버는 서버라서 공용이다. // 여러 브라우저가 전부 프론트서버르 바라본다. 개인정보 유출 문제 발생할 수 있다. cookies().set('connect.sid', parsed['connect.sid'], parsed); // parsed = 나머지 옵션들 } console.log(authResponse, '--------------------------------authResponse'); let user = await authResponse.json(); console.log(user, '--------------------------------user'); // console.lo(authResponse); if (!authResponse.ok) { return null; } // return user object with the their profile data return { ...user, email: user.email, name: user.nickname, image: user.image, id: user.id, } } catch (err) { console.error('로그인 에러', err); } 그리고 cors에러는 발생하지 않고있습니다. 혹시 수정해야할 코드나, 참고해야할 부분이 있다면 알려주시면 감사하겠습니다.
-
해결됨Next + React Query로 SNS 서비스 만들기
next server action, client fetch 관련 질문입니다.
안녕하세요 제로초님 저는 react app 개발만 조금 해봤는데, next 강의에서 server action을 처음 접하면서 헷갈려서 질문 드립니다.예를 들어서 게시판 목록을 불러올 때 server fetch를 통해 화면에 출력하고 있고, 무한스크롤이나 add, edit, delete 동작 등을 server action으로 할 수 있다는 것을 알았는데요.그렇다면 next app을 개발할 때는 client fetch는 전혀 필요가 없는 건가요? 아니면 어떤 필요에 따라 client fetch와 server fetch를 혼용해서 사용해야 하는 건지.. 궁금합니다. 감사합니다!
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
파일 저장시 prettier가 의도적으로 줄 바꿈한 문장을 한 줄로 합쳐버립니다.
<저장 전><저장 후> <저장 전><저장 후> <저장 전><저장 후>파일 저장을 하면 prettier가 실행되면서 의도적으로 줄 바꿈 했던 것을 한 줄로 합쳐버립니다. 그렇다고 format on save를 끄거나 prettier를 끄고 싶지는 않습니다. 한 줄로 합쳐지지만 않게 하고 싶은데 어떻게 해야 할까요?
-
해결됨Next.js 시작하기
eslint 오류..
수업 내용을 따라 작성 하는데..이상한 점이 있어서 문의 드립니다.eslint, prettier 등 처음 부터 셋팅을 그대로 따라 했는데요.저는 그림 처러 저런 오류가 생깁니다. problem 을 보면이런게 생기고요.. 그런데 상단에 /* eslint-disable prettier/prettier */라는 것을 넣으면 오류가 사라지는데요.. 왜 그럴까요?제가 셋팅을 잘못 한게 있을까요??
-
미해결Next + React Query로 SNS 서비스 만들기
Parallel Routes에 대하여 질문있습니다.
안녕하세요 제로초님.Parallel Routes에 대하여 질문있습니다 (공식문서 폴더구조)우선 공식문서대로 위와같은 폴더구조로 한 후 export default function Layout({ children, team, analytics, }: { children: React.ReactNode analytics: React.ReactNode team: React.ReactNode }) { return ( <> {children} {team} {analytics} </> ) }Layout에 team과 analytics를 props로 주게되면team과 analytics에 있는 page.js가 잘 렌더링 되는 것을 확인하였습니다. 그래서 이것을 강의에 응용해보려고 했습니다. (강의 폴더구조 및 응용) src/app/(afterLogin)/@team(afterLogin)폴더에 @team 폴더를 만들고 그 안에 default.tsx랑 page.tsx파일을 만들었습니다. default.tsx파일이 없으면 404 not found 가 뜹니다. 그 후 AfterLoginLayout에 team을 props로 두어 렌더링하였습니다. 결과는 default.tsx가 렌더링 되었습니다. src/app/(afterLogin)/layout.tsx type Props = { children: ReactNode; team: ReactNode}; export default async function AfterLoginLayout({ children, team }: Props) { return ( <> {children} {team} </> ); } 공식문서에서 default.tsx는 "초기 로드 또는 전체 페이지 다시 로드 중에 일치하지 않는 슬롯에 대한 폴백으로 렌더링할 default.js 파일을 정의할 수 있습니다." 즉 파일을 찾지 못하여 default.tsx를 렌더링 한다는 말이라고 이해했습니다. 즉 궁금한 것은 공식문서 폴더구조에서는 @team폴더의 page.tsx를 렌더링하는 반면 강의 폴더구조에서는 page.tsx를 렌더링하지 않고 default.tsx를 렌더링하는지 궁금합니다.해당 강의에서 설명해주신 것 같아 여러번 보았지만 저의 이해력이 안좋아 질문드립니다. ㅜㅜ 항상 좋은강의 감사드립니다!
-
해결됨Next + React Query로 SNS 서비스 만들기
컴포넌트화 하는 기준이 궁금합니다.
강사님의 컴포넌트를 나눌 때의 기준이 궁금한데요. 지금까지 제가 이해한 내용으로는반복되는 부분은 컴포넌트 화 시켜서 공통컴포넌트 _component폴더에 두시는것 같습니다. 제가 궁금한 것은 (afterLogin)/home/page.tsx 내부 구조가 컴포넌트만 있는데 (사진첨부)(afterLogin)/layout.tsx파일의 내부구조는 컴포넌트화 되어있는 부분이 섞여있습니다page는 모두 컴포넌트화 시키셨는데 layout은 왜 모두 컴포넌트화를 시키지 않으셨을까요? 따로 컴포넌트화 하시는 기준이 있을까요?
-
해결됨실무에 바로 적용하는 스토리북과 UI 테스트
강사님 VS Code 테마가 예뻐서 어떤거 쓰시는지 궁금해요.☺️
강의를 들으면서 이해하기 어려운 부분강의를 따라하는데 에러가 발생하는 부분강의에는 없지만 스토리북에 대해 궁금한 부분들을 자유롭게 질문으로 올려주세요!확인하는대로 최대한 빠르게 답변드리겠습니다 이런것도 여기 질문해도 되나요? 강사님 VS Code 테마가 예뻐서 어떤거 쓰시는지 궁금합니다 ☺ 찾아봤는데 비슷한게 안보여서 질문드렸어요
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
settings.json에 올려두신 사진과 동일하게 안뜹니다
처음 세팅중인데 읽기전용이라 떠서 커뮤니티에 뜨는대로 따라했는데 올려두신 사진과 같은 내용이 뜨질않아서 어떻게 세틍을 해야하나 질문드려봅니다..
-
해결됨프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
Material--icons_4.0.0.woff2
Material--icons_4.0.0.woff2 는 리소스 크기가 3mb인데 해당 폰트는 font-display:block으로 하지 않는이상 폰트 다운드로 전에 영어를 출력시키거나 안보이도록 해야하는되 이 부분 레이아웃 시프트 발생하지 않도록 cls 잡는 방법이 무엇이 존재할까요???
-
미해결
리액트 배포 후 아이폰에서 보이지 않는 문제
안녕하세요리액트를 사용해서 웹 페이지를 배포 후 반응형 테스트를 위해 여러 기종에서 테스트 중인데요안드로이드 핸드폰에선 기종 상관 없이 전부 잘 보이는데아이폰에서는 아무것도 보이지 않고 하얀 화면만 보이는 문제가 생겼습니다혹시 리액트로 배포 후 ios 기기 호환성을 위해 따로 해줘야하는 작업이 있을까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
yarn dev를 하니 리엑트 버전 오류가 납니다.
첫번째 사진은 터미널창에서 yarn dev를 하니 리엑트 버전을18.2.0 버전으로 해야 한다고 합니다. .전에 eslint 설치중에 오류가 나서 node_modules, eslintrc.js , yarm.lock 을 지웠다가 재설치를 했습니다.이때문에 오류가 난것 같은데 구글링해도 해결방법을 모르겠어서 질문남깁니다 ㅜ
-
해결됨기초부터 배우는 Next YTMusic 클론 코딩 (with next.js 14, UI 마스터)
shadcn 라이브러리
shadcn는 next.js에서만 사용가능한 라이브러리 인가요?
-
미해결따라하며 배우는 리액트, 파이어베이스 - 채팅 어플리케이션 만들기[2023.12 리뉴얼]
이건 어디에 저장이 되는 것인가요?? redux에 저장이 되는 것인가요??
await updateProfile(auth.currentUser, { displayName: data.name, photoURL: `http://gravatar.com/avatar/${md5(createdUser.user.email)}?d=identicon` }) realtime db와는 아무런 연관이 없는데요??db에서 변화가 되면 프로필상에도 바뀌어야되는데 원칙이 아닌가요??
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
husky 설치 과정중 질문 있습니다!
yarn add --dev husky과 npx husky install 하니.husky 폴더가 생겼는데 강의와는 다른 폴더들이 많이 있구요 이후에 npx husky add .husky/pre-commit "yarn lint"실행하니 add 명령어를 권장하지 않는다고 뜹니다이 경우에 어떻게 해야할까요??
-
해결됨Supabase, Next 풀 스택 시작하기 (feat. 슈파베이스 OAuth, nextjs 14)
5.6 API 호출에서 from 속성을 불러올 수 없습니다.
5-2강의 내용은 문제 없이 잘 됐고, 그 다음부터 5-5까지도 문제가 없었습니다.에러가 다음과 같이 나옵니다.어떤 게 문제일지 잘 모르겠습니다. 도움을 구합니다.<콘솔로그 상 오류 메시지>Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'from') npm으로 설치를 진행하였으며, npx create-next-app@latest로 최신버전입니다.
-
해결됨2시간으로 끝내는 프론트엔드 테스트 기본기
jest.config.cjs로 작성했을 때 modules를 읽어올 수 없음
강의 1분쯤에 jest.config.cjs로 쓰는 것과 package.json에서 작성하는 법 2가지를 알려주셨을 때 전자대로 적용해 실행하니 아래와 같은 에러가 발생했습니다! 이후에 package.json에 작성해서 실행하는 방법으로 변경하니 정상적으로 작동했는데 혹시 이 원인을 알 수 있을까요? modules를 import하지 못한 이유를 잘 모르겠습니다!
-
미해결웹 게임을 만들며 배우는 React
action.type 불러오는 방식
import/export가 아닌 require/module.export로 파일 불러오고 있는데요. action.type 값 전달에서 궁금한 점이 있어서 질문 남겼습니다! 먼저 아래 코드로// main.jsx const SET_WINNER = 'SET_WINNER'; const CLICK_CELL = 'CLICK_CELL'; const CHANGE_TURN = 'CHANGE_TURN'; exports.SET_WINNER = SET_WINNER exports.CLICK_CELL = CLICK_CELL exports.CHANGE_TURN = CHANGE_TURN// td.jsx const { SET_WINNER, CLICK_CELL, CHANGE_TURN } = require('./tiktaktok_functional');불러오면 action.type이 undefined로 출력됩니다. 근데 아래 방식대로 작성하면 action.type이 불러와집니다.1.// main.jsx exports.SET_WINNER = SET_WINNER = 'SET_WINNER'; exports.CLICK_CELL = CLICK_CELL = 'CLICK_CELL'; exports.CHANGE_TURN = CHANGE_TURN = 'CHANGE_TURN';// td.jsx // 불러오지 않음2.// main.jsx const SET_WINNER = 'SET_WINNER'; const CLICK_CELL = 'CLICK_CELL'; const CHANGE_TURN = 'CHANGE_TURN'; exports.SET_WINNER exports.CLICK_CELL exports.CHANGE_TURN// td.jsx const CLICK_CELL = 'CLICK_CELL'; const CHANGE_TURN = 'CHANGE_TURN';원래라면 module.export 사용 중이면 어떻게 불러와야 되나요?
-
해결됨실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
5.1 최소 최대 가격 수정 관련 테스트 질문
최소 최대 가격을 수정할 때최소 금액이 0보다 작을 때최대 금액이 최소 금액보다 작을 때위 같은 조건을 처리할 때 관련 질문입니다describe 사용 여부 // 1 describe('최소 최대 가격 확인 테스트', () => { it("최소 금액이 0보다 작을 때, 이렇게~ 처리", () => {}); it("최대 금액이 최소 금액보다 작을 때, 이렇게~ 처리", () => {}); it("최소 최대 가격을 수정하면 setMinPrice, setMaxPrice action이 호출된다", () => {}) }) // 2 it("최소 금액이 0보다 작을 때, 이렇게~ 처리", () => {}); it("최대 금액이 최소 금액보다 작을 때, 이렇게~ 처리", () => {}); it("최소 최대 가격을 수정하면 setMinPrice, setMaxPrice action이 호출된다", () => {})위 같은 조건 테스트를 작성 하는게 좋은지 아니면 아예 입력 처리를 해서 작성 안하는게 좋은지 확인 (0보다 작은수는 입력되지 않고, 최대 금액은 최소 금액보다 무조건 크게 작성하도록 처리 등)
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
프로젝트 NEW 구현하기에서 파일 옮길때 오류
12분40초에 New.js 파일을 DiaryEditor.js 파일로 옮기는 작업에서 오류가 납니다.