묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티
스프링 시큐리티 기능 중
안녕하세요 강사님!지금 막 결제해서 강의를 시청하고 있는 학생입니다.다름이 아니라 제가 궁금한 부분이 시큐리티 전체적인 흐름도 있지만 시큐리티를 이용한 목업 기능도 사용을 해보고 싶어서 듣게 되었습니다. 가상 URL?같은 것도 만들 수 있는 거 같았는데 혹시 해당 강의를 끝까지 들으면 저도 목업 기능을 사용할 수 있을까요? 제가 아직 미흡해서 그런지 커리큘럼으로는 잘 모르겠어서요. 좋은 강의 감사합니다!
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
export default 관련질문
안녕하세요 좀 멍청한질문일수도 있겠는데, export default 로 자바스크립트 객체를 component 모듈에서 내보내기하고 App.vue에서 import하는것은 이해하였는데나머지 template , style은 어떻게 import 되는것일까요ㅠ 아니면 제가 export default 동작을 잘못 이해하고 있는걸까요? <template></template><script>export default { // 내보낼 객체 }<style></style>
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
브라우저에 localhost:3030 입력시
제로초님의 Github 을 보기도 했고 영상을 정지하고 따라 해보기도 했습니다만 브라우저에서 localhost:3030 을 입력해서 접속을 하면 위 스크린샷과 같이 나오게 됩니다. 에러코드500 은 서버쪽 문제이기에 에러메시지를 확인해보면 Info Webpack is building your sources... webpack 5.74.0 compiled successfully in 656 ms [Nest] 27340 - 2022. 09. 23. 오전 1:40:04 ERROR [ExceptionsHandler] secret option required for sessions Error: secret option required for sessions at session (E:\Github\Slack\anest\dist\main.js:2474:12) at Layer.handle [as handle_request] (E:\Github\Slack\anest\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:328:13) at E:\Github\Slack\anest\node_modules\express\lib\router\index.js:286:9 at Function.process_params (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:346:12) at next (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:280:10) at cookieParser (E:\Github\Slack\anest\node_modules\cookie-parser\index.js:57:14) at Layer.handle [as handle_request] (E:\Github\Slack\anest\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:328:13) at E:\Github\Slack\anest\node_modules\express\lib\router\index.js:286:9 [Nest] 27340 - 2022. 09. 23. 오전 1:40:04 ERROR [ExceptionsHandler] secret option required for sessions Error: secret option required for sessions at session (E:\Github\Slack\anest\dist\main.js:2474:12) at Layer.handle [as handle_request] (E:\Github\Slack\anest\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:328:13) at E:\Github\Slack\anest\node_modules\express\lib\router\index.js:286:9 at Function.process_params (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:346:12) at next (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:280:10) at cookieParser (E:\Github\Slack\anest\node_modules\cookie-parser\index.js:57:14) at Layer.handle [as handle_request] (E:\Github\Slack\anest\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (E:\Github\Slack\anest\node_modules\express\lib\router\index.js:328:13) at E:\Github\Slack\anest\node_modules\express\lib\router\index.js:286:9이라는 에러메시지를 출력하게 되는데 혹시나 싶어서 구글링을 해보았는데 예전에 다른강좌 에서 답변을 남기신것또한 참고를 해보았으나 해결이 되지 않아 질문 남김니다. 에러 해결을 위해 어느부분을 보면 좋을까요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
MemberRepositoryV1
MemberRepositoryV1에서 DataSource를 주입 받았는데 이는 어디서 빈으로 등록 된 건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7 - I : 4781 해설 강의가 없습니다.
현재 올라와있는 건 2293 해설 강의네요.
-
미해결FreeRTOS 프로그래밍
FreeRTOS Tick 관련 문의 드립니다.
안녕하세요막 FreeRTOS에 입문한 사람입니다.궁금한게 있어 질문드리려 합니다.FreeRTOS의 최대 TICK 주파수가 1kHz로 알고 있습니다.그렇다면 1kHz 이상의 주파수로 측정을 해야 한다면 어떻게 해야할까요?예를 들어 adc를 통해 아날로그 신호를 5kHz로 측정해야하는 경우는 어떻게 해야되는지요?FreeRTOS는 꼭 써야 하는 상황입니다.제 생각으로는 TICK 속도를 높이는 방법과 별도의 5kHz의 타이머 인터럽트를 사용하여 while(1) 루프 내에 프로그래밍하는 방법 두가지를 생각해보았습니다.[질문1] TICK 속도를 높이는게 가능하다면 어떠한 방법으로 설정하는지 궁금합니다.[질문2] 아니면 아래와 같이 while(1)루프 내에 별도의 5kHz 주파수의 타이머 인터럽트를 사용하여 프로그래밍 했을때 FreeRTOS의 태스크에는 영향이 없을지... 고려해야할게 있을지? 궁금합니다.int main(void) { while(1) { // 5kHz timer interrupt start if(tick_5khz_flag == 1) { tick_5khz_flag = 0; val = adc_read(); } // 5kHz timer interrupt End } }
-
미해결기출로 대비하는 개발자 전공면접 [CS 완전정복]
강의자료 HTTP 부분 request 단어가 repuest로 되어있습니다
1:36초 (HTTP 서류)
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
home_screen.dart 파일 생성이 안됩니다.
섹션 13까지 문제 없이 강의를 잘 들었는데 screen 폴더에 'home_screen.dart'라는 이름으로 파일을 생성하니 자동완성 기능도 되지 않고 dart 파일로 실행되지도 않습니다이전에 만들었던 프로젝트를 다시 들어가보니 마찬가지로 'home_screen.dart'로 이름을 지은 파일이 전부 실행되지 않고 앱이 정상적으로 emulator에서 돌아가지 않습니다파일 이름을 'home_screen.dart'가 아닌 다른 이름으로 저장하면 정상적으로 실행되는데 저 이름으로 저장한 경우에만 파일이 실행되지 않는 것 같습니다..이 문제를 어떻게 해결해야 할까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
404 오류 발생
index.html -> servlet -> new-form.jsp순으로 경로가야하는데 계속 new-form창에서 404오류가 납니다.경로도 맞게 지정한거같은데.. 계속 왜이러는지 잘모르겠습니다.혹시 jsp문제인가요? file로 생성할 떄 뒤에 .jsp붙여서 이미지에 jsp있으면 제대로 사용가능한거 아닌가요. ㅜ
-
미해결게임 프로그래머 취업 전략 가이드
개발분야 선택 고민입니다
안녕하세요 선생님! 강의 정말정말 잘 수강했습니다.고민이 있는데요.전에 콘텐츠 제작 쪽에 있었는데 오래할 수 없겠다는 생각이 들었기 때문에 진로를 전향하고 싶습니다. 비전과 흥미가 있는 개발자가 되고 싶은데, 개발 분야 중 가장 관심있는 게임 개발자가 되기에는 시간이 많이 걸릴 것 같아서 도전이 고민됩니다. 33살 비전공자 여자인데 최근에 게임회사 기획쪽에 잠깐 있다가 경영난으로 인해 비자발적으로 퇴사했습니다. 전공,학벌,스펙 다 안 좋고 나이때문에 내년 안에는 취업을 해야할 것 같습니다. 게임 개발은 웹/앱보다도 취준 가능한 실력을 갖추는 시간이 오래 걸릴 것 같습니다(작은 게임과 웹을 만들어보니 저에겐 게임제작이 더 어려웠지만 더 재밌었습니다. 게임쪽이 제일 재밌지만 그렇다고 다른 분야가 싫은 건 아닙니다). 그러면 신입으로 들어가는 건 힘들 것 같고(존폐 위기까지는 없을 듯한 회사) 지금도 멘탈이 좋지 않은 터라 버티지도 못할까 걱정됩니다. 게임은 온라인 부트캠프도 많이 없고, 지방이라 학원에 다닌다면 금전적으로 힘들어서 다른 분야로 취준해야하나 생각 중입니다. 며칠 다른 강의 듣느라 선생님의 부트캠프 모집글도 못봐버렸습니다.. 글 봐주셔서 감사드리고 곧 수강후기도 쓰겠습니다. 유튜브도 잘 보고있어요. 앞으로 더욱 번창하시길 바랍니다!
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
로그아웃시 refresh token 은 만료 시간 업데이트 했지만 access token 은 만료 시간 업데이트 못하는건가요?
로그아웃 하게된다면웹 브라우저시에 쿠키 및 로컬 스토리지에 아직 access token 이 남아 있을텐데다른 사용자가 이걸 발견하고 이용하면 문제 있는거 아닌가요??
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
서버 사이드랜더링 후 오류 관련 질문 드립니다.
Server ErrorError: Error serializing .initialState.user.loadMyInfoErr returned from getServerSideProps in "/". Reason: undefined cannot be serialized as JSON. Please use null or omit this value all together.선생님 해당 애러 한시간 넘게 지금 찾고있는데 일단 번역해보거나 지금 다른분이 올리셨던 질문이 똑같은게 있었는데 도움이 되질않았습니다. 보니 직렬화 문제? 그리고 initialState.user.loadMyInfoErr이쪽이 문제였던것같아 리듀서에 loadMyInfoerr를 그냥 없애보니 화면랜더링은 되는데 로그인이 안되는 게 발생했습니다. 일단 선생님께 질문드리고 난뒤에도 계속 찾아보겠습니다.//index.js import React, { useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' import { END } from 'redux-saga' import AppLayout from '../components/AppLayout' import PostForm from '../components/PostForm' import PostCard from '../components/PostCard' import { LOAD_POSTS_REQUEST } from '../reducers/post' import { LOAD_MYINFO_REQUEST } from '../reducers/user' import wrapper from '../store/configureStore' import axios from 'axios' const Home = () => { const dispatch = useDispatch(); const { me, logInErr } = useSelector((state) => state.user) const { mainPosts, hasMorePosts, loadPostsLoading, retweetErr } = useSelector((state) => state.post) useEffect(() => { if (retweetErr) { alert(retweetErr) } }, [retweetErr]) useEffect(() => { function onScroll() { if (window.scrollY + document.documentElement.clientHeight > document.documentElement.scrollHeight - 300) { if (hasMorePosts && !loadPostsLoading) { const lastId = mainPosts[mainPosts.length - 1]?.id; dispatch({ type: LOAD_POSTS_REQUEST, lastId, }); } } } window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); }; }, [hasMorePosts, loadPostsLoading, mainPosts]) return ( <AppLayout> {me && <PostForm />} {mainPosts.map((item) => <PostCard key={item.id} post={item} />)} </AppLayout> ) } export const getServerSideProps = wrapper.getServerSideProps( async (context) => { context.store.dispatch({ type: LOAD_MYINFO_REQUEST, }); context.store.dispatch({ type: LOAD_POSTS_REQUEST, }); context.store.dispatch(END); await context.store.sagaTask.toPromise(); }) export default Homeimport { delay, all, fork, put, takeLatest, call } from "redux-saga/effects"; import axios from 'axios' import { LOG_IN_REQUEST, LOG_IN_SUCCESS, LOG_IN_FAILURE, LOG_OUT_REQUEST, LOG_OUT_SUCCESS, LOG_OUT_FAILURE, SIGN_UP_REQUEST, SIGN_UP_SUCCESS, SIGN_UP_FAILURE, FOLLOW_REQUEST, FOLLOW_SUCCESS, FOLLOW_FAILURE, UNFOLLOW_REQUEST, UNFOLLOW_SUCCESS, UNFOLLOW_FAILURE, LOAD_USER_REQUEST, LOAD_USER_SUCCESSS, LOAD_USER_FAILURE, CHANGE_NICK_REQUEST, CHANGE_NICK_SUCCESS, CHANGE_NICK_FAILURE, LOAD_FOLLOWER_REQUEST, LOAD_FOLLOWER_SUCCESS, LOAD_FOLLOWER_FAILURE, LOAD_FOLLWING_REQUEST, LOAD_FOLLWING_SUCESSS, LOAD_FOLLWING_FAILURE, REMOVE_FOLLOWER_REQUEST, REMOVE_FOLLOWER_SUCCESS, REMOVE_FOLLOWER_FAILURE, LOAD_MYINFO_REQUEST, LOAD_MYINFO_SUCCESSS, LOAD_MYINFO_FAILURE } from '../reducers/user' function loadMyInfoAPI() { return axios.get('/user') } function* loadMyInfo() { try { const result = yield call(loadMyInfoAPI) yield put({ type: LOAD_MYINFO_SUCCESSS, data: result.data, }); } catch (err) { console.log(err); yield put({ type: LOAD_MYINFO_FAILURE, error: err.response.data }); } } function getUserAPI(data) { return axios.get(`/user/${data}`) } function* getUser(action) { try { const result = yield call(getUserAPI, action.data) yield put({ type: LOAD_USER_SUCCESSS, data: result.data, }); } catch (err) { yield put({ type: LOAD_USER_FAILURE, error: err.response.data }); } } function getFollwerAPI(data) { return axios.get('/user/follower', data) } function* getFollwer(action) { try { const result = yield call(getFollwerAPI, action.data) yield put({ type: LOAD_FOLLOWER_SUCCESS, data: result.data, }); } catch (err) { yield put({ type: LOAD_FOLLOWER_FAILURE, error: err.response.data }); } } function getFollowingAPI(data) { return axios.get('/user/following', data) } function* getFollowing(action) { try { const result = yield call(getFollowingAPI, action.data) yield put({ type: LOAD_FOLLWING_SUCESSS, data: result.data, }); } catch (err) { yield put({ type: LOAD_FOLLWING_FAILURE, error: err.response.data }); } } function logInAPI(data) { return axios.post('/user/login', data) } function* logIn(action) { try { const result = yield call(logInAPI, action.data) yield put({ type: LOG_IN_SUCCESS, data: result.data, }); } catch (err) { yield put({ type: LOG_IN_FAILURE, error: err.response.data }); } } function logOutAPI() { return axios.post('/user/logout'); } function* logOut() { try { yield call(logOutAPI); yield put({ type: LOG_OUT_SUCCESS, }); } catch (err) { console.error(err); yield put({ type: LOG_OUT_FAILURE, error: err.response.data, }); } } function signUpAPI(data) { return axios.post('/user', data) } function* signUp(action) { try { const result = yield call(signUpAPI, action.data); console.log(result); yield put({ type: SIGN_UP_SUCCESS, }); } catch (err) { console.error(err); yield put({ type: SIGN_UP_FAILURE, error: err.response.data, }); } } function followAPI(data) { return axios.patch(`/user/${data}/follow`) } function* follow(action) { try { const result = yield call(followAPI , action.data) yield put({ type: FOLLOW_SUCCESS, data: result.data }); } catch (err) { yield put({ type: FOLLOW_FAILURE, error: err.response.data }); } } function unFollowAPI(data) { return axios.delete(`/user/${data}/follow`) } function* unFollow(action) { try { const result = yield call(unFollowAPI, action.data) yield console.log(result) yield put({ type: UNFOLLOW_SUCCESS, data: result.data }); } catch (err) { yield put({ type: UNFOLLOW_FAILURE, error: err.response.data }); } } function chanegeNickAPI(data) { return axios.patch('/user/nickname', { nickname : data }) } function* chanegeNick(action) { try { const result = yield call(chanegeNickAPI, action.data) yield console.log(result) yield put({ type: CHANGE_NICK_SUCCESS, data: result.data, }); } catch (err) { yield put({ type: CHANGE_NICK_FAILURE, error: err.response.data }); } } function removeFollowerAPI(data) { return axios.delete(`/user/${data}/following`) } function* removeFollower(action) { try { const result = yield call(removeFollowerAPI, action.data) console.log(result) yield console.log(result) yield put({ type: REMOVE_FOLLOWER_SUCCESS, data: result.data, }); } catch (err) { yield put({ type: REMOVE_FOLLOWER_FAILURE, error: err.response.data }); } } function* watchLogIn() { yield takeLatest(LOG_IN_REQUEST, logIn) } function* watchLogOut() { yield takeLatest(LOG_OUT_REQUEST, logOut) } function* watchSignUp() { yield takeLatest(SIGN_UP_REQUEST, signUp) } function* watchFollow() { yield takeLatest(FOLLOW_REQUEST, follow) } function* watchUnFollow() { yield takeLatest(UNFOLLOW_REQUEST, unFollow) } function* watchGetUser() { yield takeLatest(LOAD_USER_REQUEST, getUser) } function* watchGetFollow() { yield takeLatest(LOAD_FOLLOWER_REQUEST, getFollwer) } function* watchGetFollowing() { yield takeLatest(LOAD_FOLLWING_REQUEST, getFollowing) } function* watchChanegeNick() { yield takeLatest(CHANGE_NICK_REQUEST, chanegeNick) } function* watchRemoveFollower(){ yield takeLatest(REMOVE_FOLLOWER_REQUEST, removeFollower) } function* watchLoadMyInfo(){ yield takeLatest(LOAD_MYINFO_REQUEST, loadMyInfo) } export default function* userSaga() { yield all([ fork(watchLogIn), fork(watchLoadMyInfo), fork(watchLogOut), fork(watchLogOut), fork(watchSignUp), fork(watchFollow), fork(watchUnFollow), fork(watchRemoveFollower), fork(watchGetUser), fork(watchChanegeNick), fork(watchGetFollow), fork(watchGetFollowing), ]) }const express = require('express') const bcrypt = require('bcrypt') const { User, Post, Image, Comment } = require('../models') const { isLoggedIn, isNotLoggedIn } = require('./middlewares') const passport = require('passport'); const db = require('../models'); const router = express.Router(); router.get('/', async (req, res, next) => { // GET /user try { if (req.user) { const fullUserWithoutPassword = await User.findOne({ where: { id: req.user.id }, attributes: { exclude: ['password'] }, include: [{ model: Post, attributes: ['id'], }, { model: User, as: 'Followings', attributes: ['id'], }, { model: User, as: 'Followers', attributes: ['id'], }] }) res.status(200).json(fullUserWithoutPassword); } else { res.status(200).json(null); } } catch (error) { console.error(error); next(error); } }); router.post('/login', isNotLoggedIn, (req, res, next) => { passport.authenticate('local', (err, user, info) => { if (err) { console.error(err) return next(err) } if (info) { return res.status(401).send(info.reason); } return req.login(user, async (loginErr) => { if (loginErr) { console.error(loginErr) return next(loginErr) } const fullUserWithoutPassword = await User.findOne({ where: { id: user.id }, attributes: { exclude: ['password'] }, include: [{ model: Post, }, { model: User, as: 'Followings', }, { model: User, as: 'Followers', }] }) return res.status(200).json(fullUserWithoutPassword) }) })(req, res, next) }) router.post('/logout', isLoggedIn, (req, res) => { req.logout(); req.session.destroy(); res.send('OK') }) router.post('/', isNotLoggedIn, async (req, res, next) => { try { const exUser = await User.findOne({ where: { email: req.body.email, } }); if (exUser) { return res.status(403).send('이미 사용 중인 아이디입니다.'); } const hashedPassword = await bcrypt.hash(req.body.password, 12); await User.create({ email: req.body.email, nickname: req.body.nick, password: hashedPassword, }); res.status(201).send('ok'); } catch (error) { console.error(error); next(error); // status 500 } }) router.patch('/nickname', isLoggedIn, async (req, res, next) => { try { console.log(req.body) await User.update({ nickname: req.body.nickname }, { where: { id: req.user.id } }) res.status(200).json({ nickname: req.body.nickname }) } catch (error) { console.log(error) next(error) } }) router.patch('/:userId/follow', isLoggedIn, async (req, res, next) => { // 유저 팔로우 try { const user = await User.findOne({ where: { id: req.params.userId } }) // 게시글 작성자 1번 if (!user) { res.status(403).send('없는 유저입니다.') } await user.addFollowers(req.user.id); // 게시글 작성자를 팔로우한다 / 내 계정 정보를 넘김 // 팔로워 아이디 2번 res.status(200).json({ userId: parseInt(req.params.userId, 10) }) } catch (error) { console.log(error) next(error) } }) router.delete('/:userId/follow', isLoggedIn, async (req, res, next) => { // 유저 팔로우 취소 try { const user = await User.findOne({ where: { id: req.params.userId } }) if (!user) { res.status(403).send('없는 유저입니다.') } await user.removeFollowers(req.user.id); res.status(200).json({ userId: parseInt(req.params.userId, 10) }) } catch (error) { console.log(error) next(error) } }) router.delete('/:userId/following', isLoggedIn, async (req, res, next) => { // 유저 팔로우 취소 try { const user = await User.findOne({ where: { id: req.params.userId } }) if (!user) { res.status(403).send('없는 유저입니다.') } await user.removeFollowings(req.user.id); res.status(200).json({ userId: parseInt(req.params.userId, 10) }) } catch (error) { console.log(error) next(error) } }) router.get('/follower', isLoggedIn, async (req, res, next) => { try { const user = await User.findOne({ where: { id: req.user.id } }) if (!user) { res.status(403).send('없는 유저입니다.') } const followers = await user.getFollowers(); res.status(200).json(followers) } catch (error) { console.log(error) next(error) } }) router.get('/following', isLoggedIn, async (req, res, next) => { try { const user = await User.findOne({ where: { id: req.user.id } }) if (!user) { res.status(403).send('없는 유저입니다.') } const followings = await user.getFollowings(); res.status(200).json(followings) } catch (error) { console.log(error) next(error) } }) module.exports = router;
-
미해결모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)
s1, s2 점수 확인
s1.score += 20을 더해서 70이 출력되고s2.score += 30을 더해서 80이 출력되야되는거 아닌가요?다른분이 비슷한 질문을 올렸데 답변이 안달려서 다시 질문드립니다.스크린샷은 강의 영상 26분:22초부분을 캡쳐했습니다.
-
미해결데이터 분석 SQL Fundamentals
강사님! 서브쿼리 1:N 관계 질문 드립니다!
강사님 먼저 서비스로 서브쿼리 강의를 열어주신거 너무 감사드립니다!서브쿼리 강의를 보며 실습을 하다 궁금한 사항이 생겨 질문 납깁니다 전 강의 에서 메인이 1 이고 서브가 N인 관계인 경우 메인 쿼리인 1을 따라간다 하셧는데 저의 부족한 지식으로 생각했을때 메인 쿼리는 1 보다 N 으로 놓아야 데이터도 많고 더 활용도가 높을거 같은데 아래 실습처럼 상황에 따라 메인 쿼리를 1로 하는 작업도 많이 하나요? SELECT d.*FROM hr."dept" AS dWHERE d."deptno" IN (SELECT deptno FROM hr."emp" AS e WHERE e."sal" > 1000) 10 ACCOUNTING NEW YORK20 RESEARCH DALLAS30 SALES CHICAGO
-
미해결스프링 시큐리티
19:04 SecurityConfig#customConfigurer(HttpSecurity http) 를 생성한 이유가 뭔가요?
지난 강좌에서 AjaxSeucirtyConfig 클래스에서Ajax 관련 작업을 하는 메소드들을 전부 이전시켰습니다.SecurityConfig 에서 aJax 관련 작업을 하는 메소드를 만들고 호출하는 이유를 알 수 있을까요?
-
미해결스프링 시큐리티
config 메소드에서 and() 메소드를 언제 호출해줘야 하나요?
메서드 체이닝 하면서 and() 메서드를 호출하시는 시점이. 누르고 원하는 메소드가 안보일 때 해주는 건가요?아니면 느낌적으로 붙여주고 말고 하는건가요?아니면 명확한 따로 기준이 있나요?
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
타입만들기가 아직 너무 어렵습니다. 혼자 문제를 만들어 풀어보다가 문의드립니다.
const obj = { a: '1', p: '2', l: '3', }; const test = (v) => { return v.replace(/a|p|l/gi, (matched) => { return obj[matched]; }); }; test('apple'); // 기대되는값 1223ereplace를 이용해서 한번 여기에 타입을 달아보고 싶어서 const test = (v: string) => { const matchedFunc: ( matched: keyof typeof obj, ) => typeof obj[keyof typeof obj] = (matched) => { return obj[matched]; }; return v.replace(/a|p|l/gi, matchedFunc); };이런식으로 수정을 시도했는데 일치하는 오버로드가 없다고 나옵니다.. interface Arr<T> { replace():void; }강의에서처럼 이렇게 두고 수정을 해보려고 해보았지만 아직 너무 어려운거 같습니다. 어떻게 하는게 좋을지 의견부탁드립니다.
-
미해결웹 게임을 만들며 배우는 React
구구단 만들기 강의에서 궁금한 점이 생겨 질문드립니다.
안녕하세요. 웹 게임을 만들며 배우는 React 강의 수강중인 초보자입니다!구구단 만들기 강의를 듣다가 궁금한게 생겨 문의드립니다<html> <head> <meta charset="UTF-8"/> <title>구구단</title> <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> </head> <body> <div id="root"></div> <!-- 결과: <div id="root"><button>Like</button></div> --> <script type="text/babel"> class GuGuDan extends React.Component { constructor(props){ super(props); this.state = { first: Math.ceil(Math.random() * 9), second: Math.ceil(Math.random() * 9), value: '', result: '', }; } render() { return ( <div> <div>{this.state.first} 곱하기 {this.state.second}는?</div> <form> <input type="number" value={this.state.value} onChange={(e)=> {this.setState({value : e.target.value}) }}/> <button>입력!</button> </form> <div>{this.state.result}</div> </div> ); } } </script> <script type="text/babel"> ReactDOM.render(<GuGuDan/>, document.querySelector('#root')); </script> </body> </html> 위 코드로 화면을 띄워주셨었는데요.위 코드에서 아직 button에 대한 동작은 작성하지 않았는데여기서 버튼만 눌러도 this.state.first와 this.state.second 값이 왜 변하는 걸까요 ??
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 주인 질문
강사님 말씀대로 편의메서드를 만들었습니다. 그러고 TestA와 member1을 1차캐시에 올렸습니다.그런다음 member.setTeam을 하면team의 members의 값이 변경이 되었습니다.그러면 여기서는 왜 update쿼리는 실행이 안되는 지 궁금합니다.
-
미해결자바스크립트 제대로 배워볼래?
64비트 부동소수점 내용 중
좋은 내용의 강의 감사드립니다.64비트 부동소수점 강의 내용의 정리에 대해 질문남깁니다.1.결국 js는 number를 int, float에 관계없이 64비트 부동소수점의 형태로 다루고 이로 인해 소수점 연산에 대해 오차가 발생할 수 있다(구체적으로 가수부 제한인 52비트를 넘는 경우).이를 보기 위해 주어진 소수(0.1과 0.2)를 2진수로 고쳐 연산을 하고 10진수로 고쳐서 그 예시를 들었다. 라고 이해를 하였는데 제대로 이해한게 맞을까요? 2진법으로 표현된 숫자에 대해 10진법으로 고치기 위해 0이하의 숫자에 대해 Math*pow(2, -55)한 원리가 궁급합니다.감사합니다.