묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결처음 배우는 리액트 네이티브
채널화면에서 에러가 나네요 ..
아마 파이어베이스에서 channels 의 하위 컬렉션 members 생성시의 에러인것 같은데 실력부족입니다 https://github.com/dongguntechnology/rn_chat Possible Unhandled Promise Rejection (id: 0): FirebaseError: Function doc() cannot be called with an empty path.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
[템플릿엔진] 노드에서 View html을 작성할때, 퍼그/넌적스 쓰지않고 순수? html로 view 사용할 수 있나요?
안녕하세요, 정적인 프로젝트(html/css)만 해보다보니 퍼그/넌적스와 템플릿 엔진으로 html 작성이 조금 더딘데요,, 혹시, 노드 프로젝트 View, 템플릿 엔진(값)을 설정할때, 퍼그나, 넌적스 와 같은 템플릿 엔진을 말고, 일반?(순수) html 작성으로 view 템플릿 값을 설정할 수 있을까요? 보통은 '노드 html작성' 이라 검색을 하면 퍼그/넌적스 view 엔진 설정 설명이 많아서요, 어떤 키워드로 구글링을 하면 좋을까요, 어떻게 검색을 해, 퍼그방식이 아닌, 순수 html 파일 한개는 서빙 하는데 성공했는데요, 목표는 view폴더 안에 여러 폴더를 만들고, 계층구조에 맞게 다수 html/css를 보여주는 겁니다. 그래도 app.js에서 view 렌더 설정은 해야할꺼 같은데, 퍼그/넌적스는 아니고,,, 하지 않으면 퍼그를 써야하고ㅠ 저와 같은 상황과 희망사항이 가능한 내용일까요? 읽어주셔 감사합니다.
-
미해결Django REST Framework 핵심사항
fields E300, E307 에러
안녕하세요 강사님, viewset 으로 Post API 만들기 강의 진행중에 발생한 에러입니다. 강의 내용대로 post url을 라우터에 등록하고, serializers 생성, view 생성 이후에 재가동하니 다음과 같은 에러가 발생하면서 동작하지 않습니다. 검색해보니 ForeignKey 로 참조하는 모델 클래스에 앱이 명시되지 않아서 그런거 같다는 거 같은데 자세한 원인은 모르겠습니다. https://stackoverflow.com/questions/56972174/errors-book-book-author-fields-e300-book-book-author-fields-e307 1. 해당 오류의 원인과 lazy reference란 무엇인지요? 2. 해결방안이 궁금합니다. (다른 앱의 model을 참조할때 발생하는 문제라면 어떻게 해야하는지) Post class는 `from blog.models import Post` 로 import 하여 가져왔습니다. from django.db import models # blog/models.py class Post(models.Model): category = models.ForeignKey('Category', on_delete=models.SET_NULL, blank=True, null=True) tags = models.ManyToManyField('Tag', blank=True) title = models.CharField('TITLE', max_length=50) description = models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple one-line text.') image = models.ImageField('IMAGE', upload_to='blog/%Y/%m/', blank=True, null=True) content = models.TextField('CONTENT') create_dt = models.DateTimeField('CREATE DT', auto_now_add=True) update_dt = models.DateTimeField('UPDATE DT', auto_now=True) like = models.PositiveSmallIntegerField('LIKE', default=0) class Meta: ordering = ('update_dt',) def __str__(self): return self.title - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨모든 개발자를 위한 HTTP 웹 기본 지식
HTML Form에서 GET/POST만 지원하는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] http://haah.kr/2017/05/23/rest-http-method-in-html-form - 해당 글을 읽어 봤는데 잘 이해가 되지 않습니다. - DELETE는 form 을 통해 값을 전달할게 없다는것은 알겠는데 - 위 블로그 글에서 PUT 의 내용이 이해가 안되네요.. - 그래서 GET/POST만 지원하는 궁극적인 이유가 무엇인가요~? 아래는 PUT 내용입니다. - PUT도 전송해야할 것은 대상 리소스를 대체할 representation 그 자체인데, 대상 리소스더러 조각난 form 데이터를 처리하라고 보낼 수는 없는 노릇
-
미해결제품 관리자와 서비스 기획자를 위한 실전 노하우 - 아낌없이 드립니다!
동종업계 리텐션 조사
동종업계 리텐션보다 잘 나올 경우 이를 긍정 지표라 설정할 수 있다면 동종업계의 리텐션은 어떻게 알 수 있나요?
-
미해결프레이머를 활용하여 쉽고 간단하게 프로토타입 제작하기
Override 쪽 파트 코드창 관련 질문
안녕하세요. Override쪽 파트를 수강 관련 질문이 있어서 이렇게 글을 남깁니다. 해당 과정으로 코드창에 들어와보니 강의에서 구현된 코드창과 다른 모습을 보이는데요. 이게 프레이머에서 업데이트 되어 이렇게 노출되는건지 아니면 제가 잘못들어가 이 화면이 노출되는건지 모르겠습니다 ㅠㅠ 프론트 하는 친구에게 물어보니 현재 제가 보는 화면은 리엑트 코드와 거의 유사한 화면이라고 답변 받았습니다.. 먼저 제가 맞는 화면을 보는지 궁금하고, 프레이머가 업데이트 된 것이라면 해당 업데이트에 맞춰 강의 내용 업데이트가 가능한지 궁금합니다.
-
미해결비전공자를 위한 개발자 취업 올인원 가이드 [통합편]
git TIL 저장소 관련 질문
안녕하세요, 한정수 강연자님! 여기까지 수강하면서 든 아이디어가 생겼는데, 다름 아니라 TIL 저장소에 스크렙한 기술 면접 질문들에 대한 저의 답변을 적는 것입니다. 그런데 혹시 취업을 위해 나중에 깃 주소를 제출하게 될 때, 그런 것들이 오히려 마이너스로 적용할까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 실행 시 JUnit Exception 발생하는 문제 질문드립니다
안녕하세요 영한님, 강의 잘 듣고 있습니다! JUnit 테스트 실행 시 에러가 발생하는데 해결을 못 해서 질문드립니다..ㅠ 에러 로그 화면입니다. 메서드 옆에 있는 초록색 삼각형 버튼을 눌러서 `Run 'MemoryMemberRepositoryTest`를 선택하면 아래 에러가 발생합니다. build.gradle 파일과 외부 라이브러리 junit-platform-* 이 보이는 부분을 캡쳐했습니다. MemoryMemberRepositoryTest 입니다. 답변해 주시면 감사하겠습니다. 좋은 밤 되세요^^!
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
모듈을 지우고 다시 설치하고를 두번 반복했는데도 해결이 안됩니다.
code: 'MODULE_NOT_FOUND', requireStack: [ 'C:\\Users\\Desktop\\vue_online_study\\advanced\\vue-endgame\\vue-til-server\\dist\\api\\auth.js', 'C:\\Users\\Desktop\\vue_online_study\\advanced\\vue-endgame\\vue-til-server\\dist\\app.js' ] } npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! server@1.0.0 start: `node dist/app.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the server@1.0.0 start script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\snowb\AppData\Roaming\npm-cache\_logs\2022-03-10T14_51_30_459Z-debug.log npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! server@1.0.0 restart: `rimraf dist && npm run build && npm run start` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the server@1.0.0 restart script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\snowb\AppData\Roaming\npm-cache\_logs\2022-03-10T14_51_30_560Z-debug.log [nodemon] app crashed - waiting for file changes before starting... 어떻게 하면 될까요 ㅠ
-
해결됨배달앱 클론코딩 [with React Native]
토큰 질문있습니다!
제로초님 저번에 강좌에서 낸 숙제라고 하신 앱을 킬때마다 리프레시 토큰 갱신하는것을 구현해 보았습니다. 그런데 제가 옳은 방법으로 했는지 피드백 부탁드립니다!! 질문 1. 로그인을 해서 accesstoken과 refreshtoken을 이미 발급받았고 앱을 껐다가 다시 켰을 때를 가정했을 시 getTokenAndRefresh 함수가 실행되어 (1)의 axios.post(`${Config.API_URL}/refreshToken`,백앤드 요청이 갑니다. AppInner.tsx useEffect(() => { const getTokenAndRefresh = async () => { try { const token = await EncryptedStorage.getItem('refreshToken'); if (!token) { return; } const response = await axios.post( ////////////(1) `${Config.API_URL}/refreshToken`, {}, { headers: { authorization: `Bearer ${token}`, }, }, ); dispatch( userSlice.actions.setUser({ name: response.data.data.name, email: response.data.data.email, accessToken: response.data.data.accessToken, }), ); await EncryptedStorage.setItem( (3) ////////추가된 부분 'refreshToken', response.data.data.refreshToken, ); } catch (error) { console.error(error); if ((error as AxiosError).response?.data.code === 'expired') { // refreshToken 만료되었을 때 Alert.alert('알림', '다시 로그인 해주세요.'); } } }; getTokenAndRefresh(); }, [dispatch]); app.js의 백앤드에서 리프레시 토큰 유효성 검사를 한 후 (2) refreshtoken(새로 추가한 부분)와 accesstoken을 같이 발급해 줍니다. 그러면 다시 AppInner 프론트 페이지로 가서 accesstoken을 리덕스에 저장하고 refreshtoken은1은(2의) await EncryptedStorage.setItem에 저장해줍니다. app.js (백앤드) app.post("/refreshToken", verifyRefreshToken, (req, res, next) => { const refreshToken = jwt.sign( // (2) 추가된 부분 { sub: "refresh", email: res.locals.email }, jwtSecret, { expiresIn: "24h" } ); const accessToken = jwt.sign( { sub: "access", email: res.locals.email }, jwtSecret, { expiresIn: "5m" } ); if (!users[res.locals.email]) { return res.status(404).json({ message: "가입되지 않은 회원입니다." }); } res.json({ data: { accessToken, refreshToken, // 추가된 부분 email: res.locals.email, name: users[res.locals.email].name, }, }); }); 이렇게 구현해 보았는데요. 결과는 로그인 하면 기존처럼 accesstoken과 refreshtoken이 발급되고 앱을 껐다가 키면 리프레시 토큰 유효성 검사를 한 뒤 유효하면 accesstoken과 refreshtoken을 다시 발급해주며 갱신시켜 줍니다. 만약 refreshotken이 만료되었다면 로그인 페이지로 이동하게 되구요. 시도를 해보니 잘 작동을 하는것 같은데 혹시 제가 무엇을 빼놓지는 않았는지 옳은방법으로 한것인지 제로초님의 의견이 궁금합니다!. 질문2. 강의중 제로초님은 accesstoken은 리덕스에 refreshtoken은 암호 저장소에 저장한다고 하셨는데 그러면 백엔드 db에는 둘 중 어느 토큰도 저장하지 않으시는지 궁금합니다. 만약 그렇다면 로그인 할때 백엔드에서 app.post("/login", (req, res, next) => { const refreshToken = jwt.sign( { sub: "refresh", email: req.body.email }, jwtSecret, { expiresIn: "24h" } ); const accessToken = jwt.sign( { sub: "access", email: req.body.email }, jwtSecret, { expiresIn: "5m" } ); users[req.body.email].refreshToken = refreshToken; /////// 이 부분 return res.json({ data: { name: users[req.body.email].name, email: req.body.email, refreshToken, accessToken, }, }); }); users[req.body.email].refreshToken = refreshToken;이 코드가 의미하는바가 무엇인지 궁금합니다. 디비용 더미 데이터 같은데 지웠는데도 잘 실행되더라구요. 없어도 되는 코드인가요?...
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
gitignore 에 venv/를 추가하였는데 git add .에 venv파일이 추가되네요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. gitignore 에 venv/를 추가하였는데 git add .에 venv파일이 추가되는데 왜그럴까요? 처음에 venv 파일 안에 gitignore생성해서 나중에 밖으로 빼내긴했는데 그것때문에 그럴까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
코드에 대해
request.getParameterNames().asIterator().forEachRemaining(paramName->paramMap.put(paramName, request.getParameter(paramName)));이부분에 대해서 혹시 각 함수가 어떤 역할을 하는 함수인지 여쭤봐도 될까요?? 제가 이해력이 부족해서 잘 이해가 가지않습니다..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
페치조인가 즉시로딩
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 그럼 [질문 내용]여기에 질문 내용을 남겨주세요. 페치조인과 즉시로딩의 차이가 어떤걸까요??
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
다음 강좌 오픈 일정에 대해 여쭤보려고 질문남깁니다!
우선 정말 좋은 강좌 찍어주셔서 감사드립니다! 실제로 많이 이용하는 기능들을 어떤식으로 구현하는 것인지 알려주시니 이 정도로 도움이 많이 되는 강좌는 처음들어봐요 ㅎㅎ 제가 궁금한 것은 안드로이드 Jetpack과 디자인 패턴, 최신 기술 살펴보기 강좌가 제작 예정이라고 되어있는데 앱을 조금이나마 유지보수가 편리하게 만들려면 AAC와 디자인 패턴을 잘 알아야 할 것같아서 강좌를 찾던 중에 개복치 개발자님의 강좌가 제작 예정이라고 되어있어 현재 기다리고 있는데 혹시 언제쯤 제작하여 오픈하실 계획인지 대강이라도 알려주시면 그동안 혼자 공부하다가 바로 수강하고싶어요 ㅠㅠ AAC가 대강 어떤거고 어떻게 쓰는거다 라는 것 정도만 알고 있다보니 제대로 사용하고 있는것인지도 모르겠고 해서 제대로 배워보고싶습니다! 빠른 시일내에 해당 강좌를 듣고싶어요!! 바쁘시겠지만 개발자님의 강좌를 기다리고있는 사람이 있다는 것을 알아주셨으면합니다 ㅠㅠ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
궁금한게 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비안녕하세요 선생님 궁금한게 있어서 질문 남깁니다! max = x.length 면 결국엔 max는 9가 되는데 저 부분이 answer = x와 무슨 관계인지 이해가 되질 않습니다. x의 길이를 구한것이지 x를 구한게 아닌데 어떻게 x를 answer 에 대입할 수 있는건가요 ??
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
채팅 데이터 처리 질문
현재 채팅앱 구현중인데, 경험이없어 조언을 얻고싶어 질문드립니다! 지금까지 나름 조사해본결과, 채팅 데이터 처리방법으로는1. 소켓으로 채팅 하나하나올때마다 MySQL에 저장한다. 클라이언트가 앱 최초 실행시 Local DB에 저장되어있던 마지막 ChatId로 MySQL에서 그 이후 채팅을 조회후 클라이언트에게 보내줌. ---가장 깔끔하고 쉽지만,대규모 채팅앱이 되었을경우 매번 INSERT를 해버리면 MySQL이 감당을 못할것같음.--- 2. 소켓으로 채팅 올때마다 redis에 저장후 일정시간혹은 일정량이차면 한꺼번에 MySQL에 저장한다. 클라가 앱 최초 실행시 Local DB에 있던 마지막 Chat createdAt으로 그시간 뒤의 채팅들은 MySQL에서 조회후, redis에 임시저장된 채팅들이 있다면 그것들을 합처주고 클라이언트에게 보내줌. ---좀 번거롭지만 MySQL INSERT를 한번에 해줌으로서 DB부하를 줄일 수 있을것같음. 다만, 아주 극적인 타이밍으로 클라가 MySQL에 채팅내역을 조회함과 동시에 redis에서 일정량이차서 MySQL에 INSERT 해주고 redis가 비워저버릴경우 해당 클라이언트는 합처줘야할 대화내용이 유실될수있을것같음.(아주 주관적인 이론)--- 이정도가 있는것같은데, "대규모 채팅앱"이라고 가정할경우 1.더 좋은 방법이 있는지, 2.만약 위의 두번째방법이 괜찮지만 제 이론대로 대화내용 유실 문제가 있을수있다면, 해결방법이 있는지. 3.제로초님은 어떤방식을 선호하는지 등 조언을 듣고싶습니다..!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
querydsl은 다른 커리큘럼에서 알려주시는걸까요?
안녕하세요 강의 너무 재밌게 수강한 학생입니다. 전에 주문 검색에서 동적쿼리에 대한 해결법 여러가지를 소개해 주시면서 가장 querydsl 을 쓴다. 이 부분은 나중에 말해주겠다 라고 하셨던 것 같아서 되게 두근대는 마음이 있었거든요 이 부분은 다른 커리큘럼에서 언급이 되는걸까요?? 개인적으로 너무 기대되어서 궁금한 마음 갖고 듣고있었는데 듣다보니까 완강해버렸습니다 ㅠㅠ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
4번 answer 정의
4번 문제에 let answer = 0; 이 아닌 let answer;만 정의 한 후 코드를 돌렸을 때 NaN이란느 값을 얻었습니다. answer을 초기화 해주지 않았기 때문인가요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
api status 질문드립니다
cat 에서 const tokenResult = await axios.post('http://localhost:8002/v1/token', { clientSecret: process.env.CLIENT_SECRET, }); 일부로 없는 client_secret으로 응답했을때 const domain = await Domain.findOne({ where: { clientSecret }, include: { model: User, attribute: ['nick', 'id'], }, }); if (!domain) { return res.status(401).json({ code: 401, message: '등록되지 않은 도메인입니다. 먼저 도메인을 등록하세요', }); } 여기서 domian null값찍히고 res.status(401).json으로 응답 받구 POST /v1/token 401 38.669 ms - 100 찍히는거 확인했습니다. GET /test 500 54.443 ms - 575 근데 여기서 500애러를 바로 떨궈버리는데 맞는건가요?? else { // 토큰 발급 실패 return res.json(tokenResult.data); // 발급 실패 사유 응답 } 여기가 언제걸리는지 궁금합니다. 그리고 cat에서 router.get('/test', async (req, res, next) => { // 토큰 테스트 라우터 try { if (!req.session.jwt) { // 세션에 토큰이 없으면 토큰 발급 시도 const tokenResult = await axios.post('http://localhost:8002/v1/token', { clientSecret: process.env.CLIENT_SECRET, }); if (tokenResult.data && tokenResult.data.code === 200) { // 토큰 발급 성공 req.session.jwt = tokenResult.data.token; // 세션에 토큰 저장 } else { // 토큰 발급 실패 return res.json(tokenResult.data); // 발급 실패 사유 응답 } } // 발급받은 토큰 테스트 const result = await axios.get('http://localhost:8002/v1/test', { headers: { authorization: req.session.jwt }, }); return res.json(result.data); } catch (error) { console.error(error); if (error.response.status === 419) { // 토큰 만료 시 return res.json(error.response.data); } return next(error); } }); 여기서 응답했을때 nodebirdapi에서 if(error.name == 'TokenExpiredError'){ return res.status(419).json({ code : 419, message:'토큰이 만료되었습니다.' }); } return res.status(401).json({ code : 401, message:'유효하지 않은 토큰입니다.' }); res.status.400번대인애들은 바로 catch에 걸리는건가요? return res.json(tokenResult.data); // 발급 실패 사유 응답 그럼 얘는 의미없는거 아닌가하고 질문드립니다.
-
미해결스프링 배치
샘플소스 문의 내용들이 종종 보여서...
어... 머랄 까 저희 익숙한 형태로 소스는 제공되지 않고 있는것 같습니다. 예를 들자면 chap1.zip 이런형태? 강사님이 git 으로 관리 하시고 단원? 챕터를 브런치로 관리 하시는 듯합니다. git 주소는 강의소개 탭 에 막~~ 스크롤 하면 강사소개 부분에 git 단어 클릭 하시면 강사님 git 으로 들어 가시면 됩니다. 거기에 spring-batch-lecture 라고 찿아 들어 가시면 됩는데 해당 레파지토리 들어 가시면 코드탭 누르면 왼쪽 상단 부분쪽에 master 라는 단어가 보입니다. 그 버튼을 클릭 하시면 Part2.1.x , Part1.1.1 이런식으로 브런치들이 보입니다. 이게 여러분들이 원하시는 단원별 소스 입니다. 하지만. Part.x.x 정확히 맞아 떨어지지는 않는것 같습니다. 그 근방에 소스는 맞는듯 하고 몇번 클릭 해서 원하는 소스 를 찿으시면 될것 같습니다. 저또한 샘플 소스 찿아 한참을 찿아 해메다가 저같은 분 계실까봐 남깁니다.