묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자를 위한 개발자 취업 올인원 가이드 [통합편]
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 정확히 맞아 떨어지지는 않는것 같습니다. 그 근방에 소스는 맞는듯 하고 몇번 클릭 해서 원하는 소스 를 찿으시면 될것 같습니다. 저또한 샘플 소스 찿아 한참을 찿아 해메다가 저같은 분 계실까봐 남깁니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
쿠키가 전달이 안돼요
공지사항에 올려주신 next-redux-wrapper 7버전으로 작성했습니다, 근데 쿠키가 백엔드로 전달이 안되네요 로그아웃으로 인식되는건 여전하고 cookie 가 아닌 cookies 에 담겨있는데 무슨의미일까요 export const getServerSideProps = wrapper.getServerSideProps( // 서버쪽에서 실행되면 context.req 라는 것이 존재한다. (store) => async ({ req }) => { const cookie = req ? req.headers.cookie : ''; axios.defaults.headers.Cookie = ''; if (req && cookie) { axios.defaults.headers.Cookies = cookie; } store.dispatch({ type: LOAD_MY_INFO_REQUEST, }); store.dispatch({ type: LOAD_POSTS_REQUEST, }); // REQUEST 가 saga 에서 SUCCESS 될 때까지 기다려준다 store.dispatch(END); await store.sagaTask.toPromise(); // configureStore.js 의 store.sagaTask } );
-
미해결비전공자를 위한 개발자 취업 올인원 가이드 [통합편]
기술 면접 관련 질문
안녕하세요, 한정수 강연자님! 제가 강의에 달아주신 링크들도 참조하고, 따로 구글링하면서 기술 면접 질문들에 대해서 알아봤는데여. 이실직고하자면, 너무나 방대한 양에 압도되어서 어떻게 해야할지 갈피가 안잡힙니다. 그 이전 강의에서 알려주신 대로 순서를 정해서 질문들을 간추려 준비하겠지만, 왠지 앞으로 제가 모르는 질문을 보면 불안해하고 그래서 공부하면서 해결하면 또 모를만한 질문이 나와서 불안해하는 무한 사이클을 탈 거 같습니다. 이렇다보니 이 문제?를 해결하기 위해서 면접 볼 수준이 되는, 내가 언어든 웹 이든 기술 면접 질문을 준비했다! 하는 수준을 준비하면서도 제 스스로 가늠할 수 있는 셀프 체크가 따로 있지 않을까 싶어 질문드렸습니다.
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌2)
faq 탭 콘텐츠 질문있습니다.
faq 탭 콘텐츠 질문있는데요 faq-title을 눌렀을때 자신을 닫는 코드는 어떻게 작성해야되나요? <script> $('.faq-title').click(function(){ $(this).addClass('active') $(this).siblings('.faq-title').removeClass('active') $(this).next().stop().slideDown() $(this).siblings('.faq-title').next().stop().slideUp() }) </script>
-
미해결스프링 핵심 원리 - 기본편
컨테이너의 싱글톤 빈 관리 질문
ac.close() 로 컨테이너를 종료하고 빈의 destroy() 메소드까지 호출이 된 상태인데요, 그 다음 destroy() 메소드를 호출했더니 빈이 없어져 에러가 날 줄 알았는데 정상작동 합니다. 싱글톤 빈은 컨테이너가 종료될 때까지 관리를 하기 때문에 close 되면 없어질거라 생각했는데 제 이해가 틀린건가요? 종료될 시 어떻게 컨테이너가 동작하는지 궁금합니다.
-
미해결윤재성의 자바 기반 안드로이드 앱개발 Part 1 - UI Programming
7강 View의 기본 개념에서 import 관련 질문드립니다.
안녕하세요 7강 내용 중, Button btn1; TextView text1; 을 선언하는 부분에서, 저는 Button과 TextView 부분에 빨간 글씨로 에러가 발생해서, 원인을 검색해보니 Button과 TextView가 import 되지 않아서 오류가 발생한 것인 걸 확인했습니다. 강의에서는 따로 저 부분을 import 하는 과정은 나타나 있지 않았는데요, 왜 강의에서는 오류가 발생하지 않았는지 궁금합니다.
-
미해결파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
requests.get()으로 제가 실습해보고 싶은 주소의 html 파일이 제대로 불러와지지 않습니다
- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다)- 이외의 문의등은 평생강의이므로 양해를 부탁드립니다- 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요~ 오늘부터 본격적으로 강의 듣기 시작했는데, 너무 부담되지 않는 선에서 체계적으로 가르쳐주시려는 마음이 느껴져서 기분 좋게 강의 들었습니다. :) 질문 드릴 내용은 제목에 적은 것과 같은데, 제가 실습해보고 싶었던 주소에서는 requests.get() 메소드를 사용해도 res.content 속성 값이 다음과 같이만 뜹니다 ; -> b'' 제가 실습해보고 싶었던 주소는 여기고요. -> https://gall.dcinside.com/board/lists?id=sc 네이버로 했을 때는 잘 되던데 저 주소는 안 되네요 ; 답변 좀 부탁드릴게요~