묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[React 1부] 만들고 비교하며 학습하는 React
mvc 패턴 비동기 처리 질문입니다
mvc 패턴은 비동기 처리를 어떻게 하나요? ex1) // model async setData() { const response = await fetch(...); const data = await response.json(); return data; } // controller constructor() { this.getData(); } getData() { this.data = this.model.setData(); } 이렇게 해서 view에 전달하면 되나요? ex2) // model async setData() { const response = await fetch(...); const data = await response.json(); this.foo(data); } this.foo(data) { // data에 대한 잔처리 } // controller ?? 이렇게 한다면 controller에서는 어떻게 데이터를 받아야 하나요? 감사합니다!
-
미해결3. 웹개발 코스 [스프링 프레임워크+전자정부 표준프레임워크]
map,hashmap,parametermap 알기쉽게 설명좀요
map,hashmap,parametermap 알기쉽게 설명좀요 제가 비전공자인데요 정보처리기사취득하고 겨우겨우 끄적이는데 아 남에게도 설명할정도로 정확한 로직을 알고싶은게 저의 목표입니다 저나 비전공자나 전공자도 알기쉽게설명부탁드립니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
무한정 back으로부터 post 데이터를 불러와요!
안녕하세요 zerocho 선생님... 다른게 아니라 이 부분에서 아주 크나큰 문제에 맞닥뜨려 작업을 못하고 있습니다. pages/index.js에서 useEffect를 사용해서 첫 페이지에 오면 로그인 유무를 판단하고 또 기존에 있던 게시글을 불러와야 하는것을 잘 아는데 문제는 로그인할 경우에는 딱 한번만 LOAD_MY_INFO_REQUEST를 잘 수행하는데 LOAD_POST_REQUEST를하는순간 무한 응답을 합니다. post man에서 받아온 데이터를 다음과 같습니다. 사실 저는 springboot를 back으로 사용하고 있는데 이유는 JPA를 좀 사용해보고 싶어서 였습니다. next.js를 아예 안쓰는것이 나앗던 것 같지만 처음에 강의를 접하고 할때는 아무것도 몰라서... 무진 후회중.. 그냥따라할걸... 하여간... 기존의 데이터도 이런 식으로 받아오는데 문제는 무한 응답을 요청하니까 도대체 어디서 잘못된건지 모르겠다는 것입니다. ㅠㅠ 제발좀 도와주십시오.;.. pages/index.js import { useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import AppLayout from "../components/AppLayout"; import PostCard from "../components/middleComponent/Post/PostCard"; import PostForm from "../components/middleComponent/Post/PostForm"; import { LOAD_POST_REQUEST } from "../reducers/post"; import { LOAD_MY_INFO_REQUEST } from "../reducers/user"; const Home = () => { const dispatch = useDispatch(); const { me } = useSelector((state) => state.user); const { mainPosts, hasMorePost, loadPostLoading } = useSelector((state) => state.post); useEffect(() => { console.log("useEffect in index.js") dispatch({ type: LOAD_MY_INFO_REQUEST }); // dispatch({ // type: LOAD_POST_REQUEST, // }); }, [hasMorePost, loadPostLoading]); useEffect(() => { function onScroll() { if (window.scrollY + document.documentElement.clientHeight > document.documentElement.scrollHeight - 300){ if (hasMorePost && !loadPostLoading) { dispatch({ type: LOAD_POST_REQUEST, }); } } } window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); } }, []); console.log(mainPosts); return ( <AppLayout> {me && <PostForm />} {mainPosts.map((post) => <PostCard key={post.id} post={post}/>)} </AppLayout> ); } export default Home; reducers/post.js import shortId from 'shortid'; import produces, { produce } from 'immer'; import faker from 'faker'; import { ConsoleSqlOutlined } from '@ant-design/icons'; export const initialState = { mainPosts: [], imagePaths: [], hasMorePost: true, loadPostLoading: false, loadPostDone: false, loadPostError: null, addPostLoading: false, addPostDone: false, addPostError: null, addCommentLoading: false, addCommentDone: false, addCommentError: null, removePostLoading: false, removePostDone: false, removePostError: null, } export const generateDummyPost = (number) => Array(number).fill().map(() => ({ id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, content:faker.lorem.paragraph(), Images: [{ src: faker.image.imageUrl(), }], Comments: [{ User: { id: shortId.generate(), nickname: faker.name.findName() }, content: faker.lorem.sentence(), }], })); export const LOAD_POST_REQUEST = 'LOAD_POST_REQUEST'; export const LOAD_POST_SUCCESS = 'LOAD_POST_SUCCESS'; export const LOAD_POST_FAILURE = 'LOAD_POST_FAILURE'; export const ADD_POST_REQUEST = 'ADD_POST_REQUEST'; export const ADD_POST_SUCCESS = 'ADD_POST_SUCCESS'; export const ADD_POST_FAILURE = 'ADD_POST_FAILURE'; export const ADD_COMMENT_REQUEST = 'ADD_COMMENT_REQUEST'; export const ADD_COMMENT_SUCCESS = 'ADD_COMMENT_SUCCESS'; export const ADD_COMMENT_FAILURE = 'ADD_COMMENT_FAILURE'; export const REMOVE_POST_REQUEST = 'REMOVE_POST_REQUEST'; export const REMOVE_POST_SUCCESS = 'REMOVE_POST_SUCCESS'; export const REMOVE_POST_FAILURE = 'REMOVE_POST_FAILURE'; export const ADD_POST_TO_ME = 'ADD_POST_TO_ME'; export const REMOVE_POST_OF_ME = 'REMOVE_POST_OF_ME'; export const addPost = (data) => ({ type: ADD_POST_REQUEST, data }) export const addComment = (data) => ({ type: ADD_COMMENT_REQUEST, data }) // const dummyPost = (data) => ({ // id: data.id, // content: data.content, // User: { // id: 1, // nickname: 'thelovedaejeon', // }, // Images: [], // Comments: [], // }); // const dummyComment = (data) => ({ // id: shortId.generate(), // content: data, // User: { // id: 1, // nickname: 'thelovedaejeon', // }, // }) //이전 상태를 action을 통해 다음 상태로 만들어 내는 함수 (불변성을 지키면서) const reducer = (state = initialState, action) => { return produce (state, (draft) => { switch (action.type){ case LOAD_POST_REQUEST: draft.loadPostLoading = true; draft.loadPostDone= false; draft.loadPostError= null; break; case LOAD_POST_SUCCESS: draft.loadPostLoading = false; draft.loadPostDone= true; draft.mainPosts = action.data.concat(draft.mainPosts); draft.hasMorePost = false; break; case LOAD_POST_FAILURE: draft.loadPostLoading = false; draft.loadPostError = action.error; break; case ADD_POST_REQUEST: draft.addPostLoading = true; draft.addPostDone= false; draft.addPostError= null; break; case ADD_POST_SUCCESS: draft.addPostLoading = false; draft.addPostDone= true; draft.mainPosts.unshift(dummyPost(action.data)); break; case ADD_POST_FAILURE: draft.addPostLoading = false; draft.addPostError = action.error; break; case REMOVE_POST_REQUEST: draft.removePostLoading = true; draft.removePostDone = false; draft.removePostError = null; break; case REMOVE_POST_SUCCESS: draft.removePostLoading = false; draft.removePostDone = true; draft.mainPosts = draft.mainPosts.filter((v) => v.id !== action.data); break; case REMOVE_POST_FAILURE: draft.removePostLoading = false; draft.removePostError = action.error; break; case ADD_COMMENT_REQUEST: draft.addCommentLoading = true; draft.addCommentDone = false; draft.addCommentError = null; break; case ADD_COMMENT_SUCCESS:{ const post = draft.mainPosts.find((v) => v.id === action.data.postId); post.Comments.unshift(dummyComment(action.data.content)); draft.addCommentLoading = false; draft.addCommentDone = true; break; // const postIndex = state.mainPosts.findIndex((v) => v.id === action.data.postId); // const post = { ...state.mainPosts[postIndex] }; // post.Comments = [dummyComment(action.data.content), ...post.Comments]; // const mainPosts = [...state.mainPosts]; // mainPosts[postIndex] = post; // return { // ...state, // mainPosts, // addCommentLoading: false, // addCommentDone: true, // }; } case ADD_COMMENT_FAILURE: draft.addCommentLoading = false; draft.addCommentError = action.error; break; default: break; } }); }; export default reducer; sagas/post.js import { delay, fork, all, takeLatest, put, call} from "redux-saga/effects"; import shortId from "shortid"; import axios from 'axios'; // import Axios from 'axios'; // import qs from 'query-string'; import Cookies from 'universal-cookie'; import { ADD_COMMENT_FAILURE, ADD_COMMENT_REQUEST, ADD_COMMENT_SUCCESS, ADD_POST_FAILURE, ADD_POST_REQUEST, ADD_POST_SUCCESS, ADD_POST_TO_ME, generateDummyPost, LOAD_POST_FAILURE, LOAD_POST_REQUEST, LOAD_POST_SUCCESS, REMOVE_POST_FAILURE, REMOVE_POST_REQUEST, REMOVE_POST_SUCCESS } from "../reducers/post"; import { REMOVE_POST_OF_ME } from "../reducers/user"; const cookies = new Cookies(); function addPostAPI(data) { const accessToken = cookies.get("accessToken"); const userEmail = cookies.get("userEmail"); const newObj = { description : data, email : userEmail } return axios.post('/auth/post', newObj,{ headers:{ 'Authorization': `Bearer ${accessToken}`, "Content-Type": "application/json" } }); } function* addPost(action) { try { const result = yield call(addPostAPI, action.data); yield put({ type: ADD_POST_SUCCESS, data: { id : result.data.postId, content: action.data } }) yield put({ type: ADD_POST_TO_ME, data: result.data.postId, }) } catch (error) { console.log(error); yield put({ type: ADD_POST_FAILURE, data: error.data }) } } function loadPostAPI(data) { return axios.get('/api/posts'); } function* loadPost(action) { try { const result = yield call(loadPostAPI); console.log(result); console.log(result.data); yield put({ type: LOAD_POST_SUCCESS, data: result.data.result, }); } catch (error) { console.log(error); yield put({ type: LOAD_POST_FAILURE, data: error.data }) } } function removePostAPI(data) { return axios.post('/api/post', data); } function* removePost(action) { try { delay(1000); // const result = yield call(addPostAPI, action.data); const id = shortId.generate(); yield put({ type: REMOVE_POST_SUCCESS, data: action.data }); yield put({ type: REMOVE_POST_OF_ME, data: action.data }) } catch (error) { yield put({ type: REMOVE_POST_FAILURE, data: error.data }) } } function addCommentAPI(data) { return axios.post('/api/post/${data.postId}/comment', data); } function* addComment(action) { try { delay(1000); // const result = yield call(addPostAPI, action.data); yield put({ type: ADD_COMMENT_SUCCESS, data: action.data }) } catch (error) { yield put({ type: ADD_COMMENT_FAILURE, data: error.data }) } } function* watchAddPost(){ yield takeLatest(ADD_POST_REQUEST, addPost); // 첫번째것만 하고 싶으면 takeLeading } function* watchLoadPost(){ yield takeLatest(LOAD_POST_REQUEST, loadPost); // 첫번째것만 하고 싶으면 takeLeading } function* watchRemovePost(){ yield takeLatest(REMOVE_POST_REQUEST, removePost); // 첫번째것만 하고 싶으면 takeLeading } function* watchAddComment(){ yield takeLatest(ADD_COMMENT_REQUEST, addComment); // 첫번째것만 하고 싶으면 takeLeading } export default function* postSaga(){ yield all([ fork(watchLoadPost), fork(watchAddPost), fork(watchRemovePost), fork(watchAddComment), ]) };
-
미해결Klaytn 클레이튼 블록체인 어플리케이션 만들기 - 이론과 실습
checkValidKeystore 함수 수정
저같은 경우는 keystore파일이 version4네요. crypto 대신 keyring 이 존재합니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
Router node v.6 바뀐 부분
이렇게 적으면 v6에서 작동합니다. 앞에 분들이 여럿 글을 적어 주셨지만 정리된 게 없는 것 같아서 이렇게 올립니다. 공식문서에 나와있지만 영어가 어려우신 분들이나 처음 공부하시는 분들은 이거 참고 하시면 될 겁니다. 그리고 Link부분은 아직 안 나왔는데 적혀있어서, 오류떠서 주석 처리 했습니다. ```js import { BrowserRouter, Route, Routes, //Link } from "react-router-dom"; import LandingPage from './components/views/LandingPage/LandingPage' import LoginPage from './components/views/LoginPage/LoginPage' import RegisterPage from './components/views/RegisterPage/RegisterPage' function App() { return ( <BrowserRouter> <Routes> <Route exact path="/" element = {<LandingPage/>}/> <Route exact path="/login" element = {<LoginPage/>}/> <Route exact path="/register" element = {<RegisterPage/>}/> </Routes> </BrowserRouter> ); }
-
미해결따라하며 배우는 NestJS
useGards데코레이터 이후 Unauthorized입니다..
로그인으로 발급받은 토큰을 Bearer Token으로 두고 포스트 리퀘스트를 보내면 권한이 막히네요.. JWT.io사이트에서 로그인후 발급받은 토큰을 검증해봐도 정상적이라 나오고 설정시 이용하는 키도 잘 적어줫는데.. 무슨일일까요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
validator질문 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 저는 강의 내용과 다르게 엔티티와 DTO를 구분해놨습니다. 컨트롤러가 받는 값 즉, modelattribute와 validator 는 엔티티의 특정 필드만 뽑아서 만든 saveDto로 받는데요 validator를 만들때 support에서는 saveDto 클래스로 설정하고 validate에서 받는 target의 다운캐스팅 자료형도 saveDto로 받았습니다 문제는 컨트롤러에서 initBinder를 할 때 save하는 메서드에만 @Validated를 추가하니 , 다른 dto를쓰는 detail페이지나 이런 것들을 호출할때 에러가 나는데 , 제가 알기로는 initBinder를 쓴 컨트롤러에 전부다 적용 되는건 알고 있는데 특정 메서드에만 적용 할 수 없을까요? @Validated를 쓴 메서드에만 적용하고 싶습니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
api json과 자바 빈 접근방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 http 요청, 응답 관련해서 api 통신에서는 json이 거의 표준이라고 하셨는데요. 수업을 들으면서 든 생각이 '그럼 복잡한 데이터 구조는 어떻게 보내지?' 였습니다. 제가 예전에 python을 이용해 json 자료를 사용해본 경험이 있는데 딕셔너리와 리스트 자료형이 복잡하게 얽혀있었습니다. 파이썬에서는 그냥 json 문자열 그대로 변수에 넣으면 알아서 자료화 되었기에 복잡한 구조가 크게 문제가 되지 않았었습니다. 하지만 오늘 수업에서 본 자바빈 접근법을 사용한다면 그 복잡한 자료의 형태를 제가 여러 클래스를 통해 지정해야하는건가 하는가 하는 걱정이 들었습니다. 다중 중첩된 객체는 둘째치고 단순히 하나의 클래스만 사용해도 그 필드 속성이 많으면 클래스 선언하기가 매우 번거로워보였습니다. 자바는 어쩔 수 없이 위와 같은 방법을 사용하는 수 밖에 없나요? 아니면 자바에서도 복잡한 구조의 json자료형을 편하게 쓸 수 있는 방법이 있나요? 혹시 데이터 분석은 주로 python을 이용하는 이유가 이런데에 있는걸까요?
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
올바른 괄호 채점질문
안녕하세요. visual studio 2015를 사용중인 수강생입니다. 올바른 괄호 문제에서 코드를 강사님과 똑같이 이렇게 작성했으나 , 프로젝트 디렉토리 내에서 Debug폴더에 AA.exe파일을 제출해서 실행해보니 계속 이러한 결과만 나타납니다. 컴파일러를 Dev C++을 사용해야 할까요..? 감사합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
jwt 관련 질문
안녕하세요 제로초님 jwt로 구현을 해보려고 시도 중입니다!이해가 안되는 것들이 많아 질문 남깁니다 ㅠㅠ 1. 서버에서 jwt토큰을 발급할때 클라이언트에서 사용할 데이터들(이름, 주소, 프로필 이미지 등)을 jwt 토큰 페이로드에 넣어서 보내고 클라이언트에선 토큰만으로 해당 데이터를 추출하여 사용하는 방식이 맞는건가요? 2. refresh 토큰은 서버에서 별도로 저장하지만 클라이언트에서도 access 토큰이 만료되면 refresh 토큰을 보내야 해서 클라이언트에서도 별도로 저장을 해야할지 싶은데 로컬스토리지나 쿠키에 저장을 한다면 결국 탈취당할 위험이 있기에 클라이언트에서 refresh토큰을 어디에 보관해야하는지 궁금합니다. 3. XSS 공격을 막기위해 cookie에 HttpOnly 옵션으로 자바스크립트에서 접근을 못하게 막는다면 클라이언트 개발하는 코드에서도 document.cookie 로 쿠키에 접근을 못하는게 맞나요??4. 쿠키에 저장하게 된다면 모든 요청마다 헤더에 쿠키정보가 자동으로 담겨서 보내지는 걸로 알고있는데 그렇기에 쿠키보다 로컬스토리지를 사용하는 방법이 더 선호되는지 궁금합니다!
-
미해결Klaytn 클레이튼 블록체인 어플리케이션 만들기 - 이론과 실습
invalid or does not take any parameters 오류 해결방법
2_deploy_contracts.js 파일 맨 끝에 빈 라인 없으면 오류 나네요. > truffle migrate --reset 후 다시 > truffle deploy --network klaytn 하시면 됩니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Event 방식
AutoResetEvent 방식을 공부하다 궁금한게 생겨서 질문 남깁니다. AutoResetEvent 방식은 강의에서 말씀하신것처럼 운영체제에게 이벤트를 요청하며 CPU 점유를 반환하고 대기하고 있다가, 이벤트가 처리되어 락을 얻을 수 있는 순간이 왔을때, 운영체제가 직접 아까 요청했던 그 쓰레드를 깨워서 실행하도록 하는 방식이라고 이해해도 되나요? 기존의 랜덤메타와 다른건, 이벤트를 등록해두고, 이벤트가 처리되어 본인이 실행될 수 있을때, 다른 스케쥴링을 다소 무시하고 먼저 본인이 새치기하듯 먼저 실행된다고 이해했는데 잘 이해했는지 궁금합니다. 그리고 이러한 방식이 기존의 2번 방식이었던 Sleep, Yield와 같은 랜덤메타 방식보다 좀더 성능적(속도)으로 느리다고 이해했는데 잘 이해했는지 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
오타 확인 부탁드립니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 수업 자료 중 3.템플릿 메서드 패턴과 콜백 패턴.pdf의 39번 page의 OrderServiceV5의 public void orderItem(String itemId) 메서드 내부의 template.execute()의 파라미터로 들어가는 문자열이 OrderController.request() -> OrderService.orderItem() 로 바뀌어야할 것 같습니다. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SpinLock과 Mutex 클래스에 대해
SpinLock은 계속 CPU를 들고 반복한다는걸 알고 있는데, 정확히는 자신에게 주어진 Time slice(시간)을 모두 사용했다면 결국 스핀락 방식도 CPU를 반환하고 나중에 다시 자신의 차례가 됐을때 다시 자신에게 주어진 최대 시간을 모두 사용한뒤 반복하는 과정을 반복한다고 이해하는게 맞나요? 이전에는 정확하게 알지못해서 스핀락 구조일때 정말로 해당 쓰레드는 절대로 CPU(코어)를 돌려주지 않고 영원히 독점하는줄 알았는데 그게 아니라, 운영체제 정책에 따라 자신에게 할당된 최대 시간(time slice) 만큼만 최대로 독점한다는 의미로 이해하는게 맞는지 궁금합니다. 그리고 강의 마지막에서 나온 Mutex 클래스의 동기화 방식은 기존에 학습했던 3가지의 경우(스핀락, 랜덤메타(양보), 이벤트)에서 이벤트와 동일하다고 이해해도 괜찮을까요? 아니면 위의 3가지 경우와 완전히 다른 4번쨰 방식이라고 아는게 좋을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티코어에서 락을 얻기 위한 경쟁
강의를 듣고 공부하다가 궁금한게 생겨서 질문 남깁니다. 만약 멀티코어 환경에서 1. 서로다른 코어에서 실행중인 서로다른 쓰레드가 2. 동시에 동일하게 실행하고 있던 같은 프로세스 내의 공유자원에 접근하기 위해 락을 얻으려할때, 3. interlocked든 다른 lock이든 정말 미세한 차이가 안날만큼 정확하게 동시에 락을 획득하는 경우는 존재할 수 없나요? 없다면 그 이유가 무엇인지 궁금합니다. (물론, 그럴 확률이 매우 적을수 있다는건 알지만, 완벽하게 이런 경우를 차단할수도 없는게 아닌가 헷갈립니다ㅠ)
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
n:m 관계 정의 시 궁금점
n:m 관계 정의 시에 궁금한 점이 있어서 질문 남깁니다. 동적인 카테고리가 있는 게시판의 경우 유저가 해당 카테고리에 게시글을 쓰는 걸 구현하기 위해서 category 라는 테이블을 만들고 user가 category에 여러 게시글을 쓸 수 있고 여러 카테고리에 게시글을 쓸 수 있어서 n:m 관계라고 정의했습니다. user - board - category 이런 식으로 되어있을 때 board에서 user의 정보와 category의 정보가 필요할 때 각각을 가지고 올 수 있어야 하는데sequelize에서는 관계가 없기 때문에 가져올 수 없다고 하더군요 이런 경우에는 user-category n:m으로 관계를 정의 하는게 아닌 user-board n:1 board-category 1:n 으로 정의하는 것이 맞을까요??
-
미해결코딩테스트 실전 모의고사(with C++) : 대기업 대비
오렌지 나무 문제 질문드립니다
안녕하세요. 선생님 질문드립니다. 아래와 같이 검사 범위를 지정하면 반드시 우리가 원하는 모든 영역을 다 검사할 수 있다는 것은 직관적으로 이해해야하는 것인가요? 혹시 우리가 원하는 모든 영역을 다 검사한다는 것을 좀 더 쉽게 이해할 수 있을까요? 제 경우 더 어려운 방법이긴 하지만, 모든 점을 순회하며 각 점을 기준으로 아래와 같이 4개의 영역을 S범위로 하여 검사하면 될 거라 직관적으로 생각했습니다. (빨간 점은 모든 나무 중 하나의 나무)
-
미해결Database - SQL
강의 소리가 좀 작네요
모니터 사운드로 듣는데 최대치 입니다만.. 인프런 사운드 최대치 모니터 사운드 최대치 인데 작네요 ㅠㅠ
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
3번째 사진 그림 질문이있습니다.
3번째 사진에서 그럼 제가 이해한게 맞는지에 대해 여쭤보고싶은데요. 이 부분이 리액트서버 3000번 포트로부터 받아왔다는 예시를 그랩마켓 로고로 보여주셨었는데 그거까지는 이해가 됐거든요..?ㅠㅠ (질문 1) 그런데 그럼 아래의 그림! 이 부분은 저희가 만드는 곳중 어디서버를 의미하는 걸까요?제가 생각했을때는 저희가 만든 server.js가 API서버이니까 그거를 말하는 것 같고, 저희가 만든 api를 통해서 축구공이나 농구공, 키보드 이미지를 보여준거를 표시해놓은게 맞나요?(url경로가 저희가 아직까지는 사용하고 있지않은 .../grab.png랑 .../silky.png라서 헷갈려서 질문드립니다 ㅠㅠ)그래서! 저 리액트서버(스토리지 서버)의 경로를 바꿔주겠다.이런 의미 맞으신건지 여쭤보고싶습니다.. (질문 2)그런데 또 한 가지 의문점은 이미지는 잘 나오고 있는데 경로를 왜 바꿔주시는건가요? (앞에서 얘기해주실 수도있었겠지만..제가 놓쳤다면 죄송합니다..)
-
미해결함수형 프로그래밍과 JavaScript ES6+
공부 방향성 질문
안녕하세요 프론트엔드로 취업을 준비중인 취준생입니다. 질문사항은 다음과같습니다. 1. 강의의 최종목적이 go,pipe,curry등의 재사용성이 높은 함수를 직접 구현해서 사용하는것을 목표로해야하는지, 단순히 작동원리를 파악하는것을 목표로 두어야하는지가 궁금합니다. 어떻게든 강의내용을 돌려보면서 어떻게 동작하는지, 사용함으로써 얻게되는 이점에대해선 알 수 있을거같은데 프로젝트에서 이러한 함수들을 직접 구현할 수 있을지가의문이듭니다. 2. 이후 강의인 응용편을 바로 듣는것을 추천하는지, 아니면 우선 지금 듣는 이 강의를 다듣고 지금까지배웠던 여러 함수들을 작은프로젝트에 적용해보면서 익숙해진후에 응용편을 듣는것을 추천하시는지 궁금합니다.(강의는 이미 구매한 상태입니다.)