묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결제대로 파는 Git & GitHub - by 얄코(Yalco)
[맥북사용자] 예제를 다운받은 시점의 uncommitted changes가 자동 생성되는 것 같습니다.
main 3rd commit 시점으로 main 브랜치를 reset 한 후 영상 [01:00]처럼 branch간 switch가 가능했습니다. uncommitted changes가 발생하는 이유가 궁금해 질문 남기게 되었습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 종료하는 방법
빌드 종료하는 법강의에서 skExecutor' 를 입력하는 것을 보고 따라하려 했으나 제 터미널에는 입력이 안되서 여쭤봅니다! 혹시 다른 방법이 있을까요?
-
미해결마인크래프트 게임을 활용한 파이썬 프로그래밍 완벽 이해
ModuleNotFoundError: No module named 'mcpi
인스톨이 완료되었는데 모듈 런하면 에러 발생합니다 ㅠ_ㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
만약 백엔드 개발자가 서버 사이드 렌더링을 할줄 알면
만약 백엔드 개발자가 서버 사이드 렌더링을 할줄 알면 프론트엔드 개발자가 필요 없어지나요? 만약 백엔드 개발자가 SSR까지 하면 프론트엔드 개발자가 해야할 일은 무엇인가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 소스 코드 제공 부탁드립니다.
강의 소스 코드 제공 부탁드립니다. 수강 진행하다 에러가 나는 부분이 있는데 못찾겠네요.
-
미해결만들면서 배우는 리액트 : 기초
추가 기능
완강 후에 혼자 추가 기능을 구현해보고 있는데 질문 드려도 될까요?! 하트를 클릭하고 재클릭했을 때, favorites에서 해당 이미지를 제외시키는 기능을 구현하려고 합니다.(하트 누를 때마다 추가되었다가 삭제되었다가 ..) 그래서 저는 handleHeartClick()에 if(alreadyFavorite)의 경우를 추가해서 favorites 목록에서 해당 이미지를 제외하고, 로컬스토리지에서도 데이터를 삭제하려고 했습니다. 그런데 실행시켜보니 favorites 목록에서는 지워졌는데 로컬스토리지 데이터는 삭제가 안됩니다ㅠ 어떻게 구현해야 할지 모르겠어서 질문 드립니다..!! 밑에는 제가 짠 코드입니다. function handleHeartClick() { if (alreadyFavorite) { const nextFavorites = favorites.filter(favorite => favorite != mainCat); setFavorites(nextFavorites); jsonLocalStorage.removeItem(mainCat); return; } const nextFavorites = [...favorites, mainCat]; setFavorites(nextFavorites); jsonLocalStorage.setItem('favorites', nextFavorites) };
-
미해결Do it! 자바 프로그래밍 입문 with 은종쌤
증감연사자
int num = 10; int val = num++; System.out.println(val); 의 경우 실행시켜 보니까 출력이 10이 나오더라구요. 그 이유가 대입연산자가 증감연산자보다 우선순위가 높아서 대입만 이루어지기 때문에 이러한 결과가 나오는 건가요?
-
미해결Slack 클론 코딩[실시간 채팅 with React]
Cannot read properties of undefined (reading 'map') 관련 질문드립니다.
안녕하세요. Cannot read properties of undefined (reading 'map') 하여 질문을 드리고자합니다. 문제는 해결 했으나 타입스크립트가 미숙하여 이런 현상이 발생한거 같은데 왜 이런 문제가 발생했는지 잘 몰라서 질문 드립니다. 오류가 발생 된 flow는 login 시 /workspace/sleact/channel/일반 으로 접을 했을 경우 그림과 같은 에러가 발생하였습니다. map 관련해서 초기 값이 안들어오는 부분의 에러인것을 확인하고 userData 옵셔널 체이닝을 에 해당 하는 값에 앞부분만 주었는데 에러가 발생한거 같습니다. 자세한 코드는 이렇습니다. <Workspaces> {/* 해당 워크 스페이스 이동 */} {userData?.Workspaces.map((ws) => { return ( <Link key={ws.id} to={`/workspace/${123}/channel/일반`}> <WorkspaceButton>{ws.name.slice(0, 1).toUpperCase()} </WorkspaceButton> </Link> ); })} <AddButton onClick={onClickCreateWorkspace}> +</AddButton> </Workspaces> 여기서 Workspaces에도 옵셔널 체이닝을 걸어줘야 에러가 풀렸는데요. userData?Workspaces?.map... 제로초님의 코딩을 전부 클론하여 작성하였는데 왜 이런 문제가 발생했는지 이해를 못하고 있습니다. 혹여 typescript에서는 전부 옵셔널 체이닝을 적용해줘야하나요 ... ?? 세부적인 코드는 아래 첨부드립니다. 아 그리고 userData는 정상적으로 다 받아옵니다. import fetcher from '@utils/fetcher'; import axios from 'axios'; import { type } from 'os'; import React, { useCallback, ReactNode, useState } from 'react'; import { Redirect, Route, Switch, useParams } from 'react-router'; import useSWR from 'swr'; import { Header, RightMenu, ProfileImg, WorkspaceWrapper, Workspaces, Channels, Chats, WorkspaceName, MenuScroll, ProfileModal, LogOutButton, WorkspaceButton, AddButton, WorkspaceModal, } from '@layouts/Workspace/styles'; import gravatar from 'gravatar'; import Channel from '@pages/Channel'; import DirectMessage from '@pages/DirectMessage'; import Menu from '@components/Menu'; import { Link } from 'react-router-dom'; import { IChannel, IUser, IWorkspace } from '@typings/db'; import { Button, Input, Label } from '@pages/SignUp/styles'; import useInput from '@hooks/useInput'; import Modal from '@components/Modal'; import { toast } from 'react-toastify'; import CreateChannelModal from '@components/CreateChannelModal'; type Props = { children?: ReactNode; }; function Workspace({ children }: Props) { const [showUserMenu, setShowUserMenu] = useState(false); const [showCreateWorkspaceModal, setShowCreateWorkspaceModal] = useState(false); const [showWorkSpaceModal, setShowWorkSpaceModal] = useState(false); const [showCreateChannelModal, setShowCreateChannelModal] = useState(false); const [newWorkSpace, onChangeNewSpace, setNewWorkSpace] = useInput(''); const [newUrl, onChangeNewUrl, setNewUrl] = useInput(''); const { workspace } = useParams<{ workspace: string }>(); const { data: userData, error, revalidate, mutate, } = useSWR<IUser | false>('http://localhost:3095/api/users', fetcher); const { data: channelData } = useSWR<IChannel[]>( userData ? `http://localhost:3095/api/workspaces/${workspace}/channels` : null, fetcher, ); const onLogout = useCallback(() => { axios .post('http://localhost:3095/api/users/logout', null, { withCredentials: true, }) .then(() => { // revalidate(); mutate(false, false); }); }, []); const onClickUserProfile = useCallback((e) => { e.stopPropagation(); setShowUserMenu((prev) => !prev); }, []); const onClickCreateWorkspace = useCallback(() => { setShowCreateWorkspaceModal(true); }, []); const onCreateWorkspace = useCallback( (e) => { e.preventDefault(); if (!newWorkSpace || !newWorkSpace.trim()) return; if (!newUrl || !newUrl.trim()) return; axios .post( 'http://localhost:3095/api/workspaces', { workspace: newWorkSpace, url: newUrl, }, { withCredentials: true, }, ) .then(() => { revalidate(); setShowCreateWorkspaceModal(false); setNewWorkSpace(''); setNewUrl(''); }) .catch((error) => { console.dir(error); toast.error(error.response?.data, { position: 'bottom-center' }); }); }, [newWorkSpace, newUrl], ); const onCloseModal = useCallback(() => { setShowCreateWorkspaceModal(false); setShowCreateChannelModal(false); }, []); const toggleWorkSpaceModal = useCallback(() => { setShowWorkSpaceModal((prev) => !prev); }, []); const onClickAddChannel = useCallback(() => { setShowCreateChannelModal(true); }, []); if (!userData) { return <Redirect to="/login" />; } return ( <div> <Header> <RightMenu> {/* 우측 상단 프로필 active */} <span onClick={onClickUserProfile}> <ProfileImg src={gravatar.url(userData.email, { s: '28px', d: 'retro' })} alt={userData.nickname} /> {showUserMenu && ( <Menu style={{ right: 0, top: 38 }} show={showUserMenu} onCloseModal={onClickUserProfile}> <ProfileModal> <img src={gravatar.url(userData.email, { s: '36px', d: 'retro' })} alt={userData.nickname} /> <div> <span id="profile-name">{userData.nickname}</span> <span id="profile-active">Active</span> </div> </ProfileModal> <LogOutButton onClick={onLogout}>로그아웃</LogOutButton> </Menu> )} </span> </RightMenu> </Header> <WorkspaceWrapper> <Workspaces> {/* 해당 워크 스페이스 이동 */} {userData?.Workspaces.map((ws) => { return ( <Link key={ws.id} to={`/workspace/${123}/channel/일반`}> <WorkspaceButton>{ws.name.slice(0, 1).toUpperCase()} </WorkspaceButton> </Link> ); })} <AddButton onClick={onClickCreateWorkspace}> +</AddButton> </Workspaces> <Channels> <WorkspaceName onClick={toggleWorkSpaceModal}>Sleact</WorkspaceName> <MenuScroll> <Menu show={showWorkSpaceModal} onCloseModal={toggleWorkSpaceModal} style={{ top: 95, left: 80 }}> <WorkspaceModal> <button onClick={onClickAddChannel}>채널만들기</button> <button onClick={onLogout}>로그아웃</button> </WorkspaceModal> </Menu> {channelData?.map((v) => ( <div>{v.name}</div> ))} </MenuScroll> </Channels> <Chats> <Switch> <Route path="/workspace/:workspace/channel/:channel" component={Channel} /> <Route path="/workspace/:workspace/dm/:id" component={DirectMessage} /> </Switch> </Chats> </WorkspaceWrapper> {/* 워크 스페이스 생성 모달 onClickCreateWorkspace */} <Modal show={showCreateWorkspaceModal} onCloseModal={onCloseModal}> <form onSubmit={onCreateWorkspace}> <Label id="workspace-label"> <span>워크스페이스 이름</span> <Input id="workspace" value={newWorkSpace} onChange={onChangeNewSpace}></Input> </Label> <Label id="workspace-label"> <span>워크스페이스 url</span> <Input id="workspace" value={newUrl} onChange={onChangeNewUrl}></Input> </Label> <Button type="submit">생성하기</Button> </form> </Modal> {/* 채널 만들기 모달 onClickAddChannel*/} <CreateChannelModal show={showCreateChannelModal} onCloseModal={onCloseModal} setShowCreateChannelModal={setShowCreateChannelModal} /> </div> ); } export default Workspace;
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TypeConversion 내부 질문드립니다
항상 좋은 강의 감사드립니다. 1. if (Conversion<const FromType*, const ToType*>::exist) 이 부분에서왜 포인터를 사용했는지 궁금합니다. 2. TypeConversion은 결국 많은 템플릿을 생성하게 되는데 그럴 경우 메모리에 문제가 없는지 궁금합니다. 3.Conversion 의 경우 컴파일러가 비슷하다고 판단 할경우 From을 To로 변환을 하고 결국 그걸 이용해 변경 여부를 판단하게 되는데 컴파일러 입장에서 비슷할 경우 변환을 시키지 않는 것이 이득일텐데 굳이 변환을 하는 원리가 궁금합니다. 4. 마지막으로 struct로 만드실 때와 class로 만들 실 때의 기준이 있으신가요? template 흑마법 정말 잘 배웠습니다 핵? 편법같은 느낌이 있어 관심이 많이 가게 되었습니다. 추후 강의 기대하겠습니다!
-
미해결Do it! 자바 프로그래밍 입문 with 은종쌤
형 변환에서의 데이터 손실에 대한 질문
double dNum = 3.14; int num = (int)dNum; 에서 num은 메모리에서 4byte의 공간을 가지게 되는데 위의 경우 형 변환으로 인해 .14가 날라갑니다. 그런데 그것이 메모리 상에서 아예 사라지는 것인지 아니면 메모리에는 값이 남아 있는데 4bytes씩 읽어서 .14를 못 읽어서 그런 것인지 궁금합니다. 만약 후자라면 메모리를 직접 접근해서 메모리 값으로 읽으면 값이 온전하게 3.14라고 읽을 수 있나요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
문제 풀이 마구간정하기
function solution(target,array){ array.sort((a,b)=>a-b); let left = 1; let right = array[array.length-1]; let answer while(left<=right){ let mid = Math.floor((left+right)/2); let cnt = 1; let start = array[0]; let result =[] for(let i=1; i<array.length; i++ ){ let between =array[i]- start; if(mid<=between){ cnt++; result.push(between) start = array[i]; } } if(target === cnt){ answer = Math.min(...result); break }else if(target<cnt){ left = mid +1; }else{ right = mid -1; } } return answer; } 이런식으로 풀어도 괜찮을까요?
-
미해결스프링 시큐리티
여기서 왜 401 ERROR 가 발생하는지 잘 모르겠습니다.
안녕하세요. 강의 매우 잘 듣고 있습니다. 다름이 아니라 질문이 있는데요. 시큐리티 설정은 이렇게 해주고, ajax.http 실행시켜주면 HTTP/1.1 401 X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Frame-Options: DENY Content-Length: 0 Date: Sat, 05 Feb 2022 13:50:25 GMT Keep-Alive: timeout=60 Connection: keep-alive <Response body is empty> Response code: 401; Time: 4ms; Content length: 0 bytes 401 에러가 발생하는데 어디쪽을 확인하면 좋을까요..? AjaxSecurityConfig @Order(0)@Configurationpublic class AjaxSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(ajaxAuthenticationProvider()); } @Bean public AuthenticationProvider ajaxAuthenticationProvider() { return new AjaxAuthenticationProvider(); } @Bean public AuthenticationSuccessHandler ajaxAuthenticationSuccessHandler() { return new AjaxAuthenticationSuccessHandler(); } @Bean public AuthenticationFailureHandler ajaxAuthenticationFailureHandler() { return new AjaxAuthenticationFailureHandler(); } @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/api/**") .authorizeRequests() .antMatchers("/api/messages").hasRole("MANAGER") .anyRequest().authenticated() .and() .addFilterBefore(ajaxLoginProcessingFilter(), UsernamePasswordAuthenticationFilter.class) ; http .exceptionHandling() .authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint()) .accessDeniedHandler(ajaxAccessDeniedHandler()) ; http.csrf().disable(); } @Bean public AccessDeniedHandler ajaxAccessDeniedHandler() { return new AjaxAccessDeniedHandler(); } @Bean public AjaxLoginProcessingFilter ajaxLoginProcessingFilter() throws Exception { AjaxLoginProcessingFilter filter = new AjaxLoginProcessingFilter(); filter.setAuthenticationManager(authenticationManagerBean()); filter.setAuthenticationSuccessHandler(ajaxAuthenticationSuccessHandler()); filter.setAuthenticationFailureHandler(ajaxAuthenticationFailureHandler()); return filter; }}
-
해결됨프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
useRef로 dom을 선택한 부분이 img태그가 아닌 최상단 div태그인 이유가 궁금합니다.
안녕하세요! 강사님 질문드립니다.useRef로 img의 dom을 선택하는데 ref를 img태그(19번)가 아닌상단의 div태그(18번)의 ref를 걸으신 이유가 따로 있는걸까요? 아니면 둘다 똑같은건가요? 저는 당연히 img태그의 ref를 걸어야한다고 생각했어서 질문드려요! (19번라인) 앗 죄송해요 22분 22초경에 img태그로 ref위치 수정하시네요!!.. 답변안해주셔도될것같습니다~ 좋은강의 만들어주셔서 감사합니다
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
ssh 명령어 port 22: Connection timed out
안녕하세요. 제로초님! 좋은 강의 잘 수강하고 있습니다. ec2 생성하기 영상에서 배포에 필요한 첫 단계로 aws 인스턴스를 만들어 ssh 연결을 하는 과정에서 어려움이 발생했습니다. 스스로 최대한 해결하려고 시도해봤지만, 안타깝게도 그러지 못 하고 며칠간 삽질만 했습니다. 삽질한 내용을 이 곳에 담기 어려워보여개인 기술 블로그에 작성하였으니 해당 내용을 보시고 조언을 해주시면 감사하겠습니다. https://juicyjerry.tistory.com/283 좋은 강의를 만들어 주셔서 감사드리고 오늘도 좋은 하루 보내세요
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
Custom Dataset과 헷갈리는 부분이 있어서 질문드립니다.
1. 앞선 Oxford pet 데이터도 VOC 스타일과 유사하다고 하셨는데, 그렇다면 Middle Format이 아닌, voc2coco 패키지를 활용하여 Coco Format 으로 맞추어줘도 괜찮은 걸까요? 2. 또한 그렇다면 MMDetection 쓸때 사용하는 데이터셋이 VOC 스타일인지, Coco 스타일인지, Custom 스타일인지 파악하는게 우선이 되어야 할까요? 3. 메타파일 중 trainval 은 train 파일과 val 파일을 합쳐놓은 것 같은데 굳이 이렇게 합쳐서 하나의 메타파일로 둔 이유는 무엇인가요??
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요. 코드 리뷰 부탁드립니다 :)
하루하루 선생님 강의 들으며 공부하고 있습니다. 강의 듣기 전에 문제 읽고 먼저 코드를 짜보는데 항상 부족함을 느끼네요. 이번 문제 코드는 괜찮은지 리뷰 부탁드립니다 :) function solution(k, arr){ let answer = rt = sum = 0; let n = arr.length; for(let lt=0;lt<n-k+1;lt++){ while(rt-lt<k){ sum+=arr[rt++]; } answer = Math.max(answer, sum); sum -= arr[lt]; } return answer; }
-
미해결실전! Querydsl
sql 로그 질문
영한님 안녕하세요. 오늘 2번째 질문이네요..핫.. 다름이 아니라 제 sql 쿼리가 줄 바꿈 없이 쭉 한줄로 출력됩니다. 학습하기에 너무 불편해서 바꾸고 싶은데 구글링을 해봐도 관련 사항이 보이지 않아서 여기에 질문하게 되었습니다. 혹시 쿼리문을 보기 쉽도록 바꾸려면 어떤 설정을 추가해야할까요?
-
미해결실전! Querydsl
Member의 pk질문
영한님 안녕하세요. 먼저 항상 좋은 강의를 제공해주시는 점 깊은 감사의 말씀 드립니다.사실 질문이 querydsl보다는 다른 것과 관계된 질문일 수 있을 것 같습니다. 현재 코드에서 member가 1~4까지 만들어졌는데 왜 db의 pk는 3~6이 되는 것인가요? 제 생각대로라면 당연히 pk가 1부터 4가 되어야할 것 같습니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
소셜 로그인 질문 (passport-apple)
저는 passport-jwt를 사용하여 로그인을 구현하였는데, 소셜 로그인을 위해 passport-apple 를 사용하여 유저 정보를 받아오려고하는데 막혔습니다. https://github.com/ananay/passport-apple/issues/30 nest.js에서 passport-apple사용시 Strategy 클래스의 validate함수에 인자가 제대로 들어오지않는 이슈가 있는것같습니다. 제가 유저정보를 받아온후 그것을 db에 저장후 jwt를 발행하여 다음요청부터는 애플을 거치지않고 제 서버로 jwt를 보내면 제가 유저정보 주는방식으로 구현하려고하는데, 유저 정보를 어떻게 받아와야하는지 모르겠습니다. 구글링해보니 idToken을 decode하면 유저정보가 들어있다고하는데, import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { PassportStrategy } from '@nestjs/passport'; import { DecodedIdToken, Strategy, VerifyCallback } from 'passport-apple'; @Injectable() export class AppleStrategy extends PassportStrategy(Strategy, 'apple') { constructor(private jwtService: JwtService) { super({ clientID: process.env.APPLE_CLIENT_ID, teamID: process.env.APPLE_TEAM_ID, callbackURL: process.env.APPLE_CALLBACK_URL, keyID: process.env.APPLE_KEY_ID, privateKeyString: process.env.APPLE_KEY.replace(/\\n/g, '\n'), passReqToCallback: false, }); } async validate( accessToken: string, idToken: string, profile: any, done: VerifyCallback, ) { const decodedIdToken: DecodedIdToken = this.jwtService.verify(idToken); console.log(decodedIdToken); const user = { provider: 'apple', snsId: decodedIdToken.sub, password: decodedIdToken.sub, }; console.log(user); done(null, user); } } 이렇게 코드를 짜니 [Nest] 31 - 02/06/2022, 8:41:18 AM ERROR [ExceptionsHandler] jwt malformed JsonWebTokenError: jwt malformed at Object.module.exports [as verify] (/usr/src/app/node_modules/jsonwebtoken/verify.js:63:17) at JwtService.verify (/usr/src/app/node_modules/@nestjs/jwt/dist/jwt.service.js:37:20) at AppleStrategy.validate (/usr/src/app/src/auth/strategies/apple.strategy.ts:25:60) at AppleStrategy.<anonymous> (/usr/src/app/node_modules/@nestjs/passport/dist/passport/passport.strategy.js:20:55) at Generator.next (<anonymous>) at /usr/src/app/node_modules/@nestjs/passport/dist/passport/passport.strategy.js:8:71 at new Promise (<anonymous>) at __awaiter (/usr/src/app/node_modules/@nestjs/passport/dist/passport/passport.strategy.js:4:12) at AppleStrategy.callback [as _verify] (/usr/src/app/node_modules/@nestjs/passport/dist/passport/passport.strategy.js:17:45) at /usr/src/app/node_modules/passport-oauth2/lib/strategy.js:205:24 이러한 에러가 뜹니다. idToken을 어떻게 해독해야하는지 알수있을까요..? 혹시 실무에서 애플로그인 서비스를 구현해보셨다면 이방법말고 다른방법이라도 있다면 알려주시면 감사하겠습니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
유레카서버 딜레이 관련 질문
안녕하세요. 선생님 좋은 강의 보고 있는 중 궁금한게 생겨 질문 드립니다. first-service를 랜덤포트 두 개로 할당 받았습니다. (ex. 60294, 60295) 할당받은 두 서비스는 라운드로빈 방식으로 로드밸런싱 된 것도 확인 했습니다. 이후 60294 포트를 종료 후엔 당연히 60295 포트로만 요청이 들어갈줄 알았는데 잠시동안 60294포트로 요청이 들어가더라구요. 이미 60294 포트는 종료 되었기 때문에 당연히 오류가 발생을 했습니다. 여기서 제가 이해 하기로는 60294포트 서비스는 종료가 되었지만 유레카 서버가 약 30초 단위로 리프레쉬 되기 때문이라고 생각 하는데.. 잘 이해한게 맞을까요?? 혹시 다른 이유가 있다면 답변 부탁드립니다 ~! 그리고 스프링 클라우드를 사용하고 무중단 배포 환경을 구성 한다고 했을 때 유레카 서버 딜레이 시간이 있으면 안될 것 같은데 유레카 서버 딜레이 타임이 없도록 설정 한다면 발생되는 문제가 있을까요?? 감사합니다!