묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨(신규 강의로 재오픈 예정) 스스로 구축하는 AWS 클라우드 네트워크 - 기본편
라우트테이블문의
기본적으로 생성되는 라우트테이블Name이 -로 되어있는녀석은 뭔가요? Main이라는 속성이 Yes로 되어있던데, 삭제는 또 가능한거같네요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v3에서 Order은 영속상태인가&트랜잭션
orderV3 메서드를 보면 orderRepository.findAllWithItem(); 은 List<Order>를 반환합니다. 이때 Order은 영속상태인가요?1번과 연관된 질문입니다.만약 Order이 영속상태라면 트랜젝션은 어느시점에 열린건가요? orderV3 메서드나 OrderApiController 클래스 모두 @Transactional 이 보이지 않습니다. 만약 생략 되었다면 어느 경우에 @Transactional 이 생략되어도 트랜젝션이 열리는 것인지 궁금합니다.2번 질문의 경우 JPA책의 578쪽을 보면 '스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다' 라 적혀 있는데 트랜잭션이 없다면 영속성 컨텍스트가 열릴 수 있는지 궁금했습니다.
-
해결됨남박사의 파이썬 기초부터 실전 100% 활용
집합 요소에 문자열
집합 요소에 문자열을 넣고 출력하면 출력 순서가 달라집니다.예)a = set("안녕하세요")print(a)=> {'녕', '요', '안', '세', '하'} 왜 이렇게 되는지 궁금합니다!!
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
user router가 실행되지 않는 문제 질문드리겠습니다.
아래와 같이 saga도 정상적으로 동작하며, 회원가입 기능, DB에 user 정보 저장, 중복ID체크 오류 모두 정상적으로 동작합니다.근데 network탭을 확인해보니 아래와 같이 user router가 실행되지 않습니다.또한 cors문제도 해결했는데 Resopnse Headers탭에는 Access-Control-Allow-Origin이 적용되지 않아 질문드립니다.참고할 수 있는 코드 첨부하겠습니다.바쁘시겠지만 답변해주시면 정말 감사하겠습니다. <참고 코드>signupformimport React, { useCallback, useEffect } from 'react'; import { Button, Checkbox, Form, Input, message } from 'antd'; import { useSelector, useDispatch } from 'react-redux'; import Router from 'next/router'; import { formItemLayout, tailFormItemLayout } from './styles'; import { signupRequestAction } from '../../reducers/user'; const SignupForm = () => { const { signUpLoading, signUpDone, signUpError } = useSelector((state => state.user)); const dispatch = useDispatch(); const [form] = Form.useForm(); useEffect(() => { if (signUpDone) { Router.push('/'); message.success('정상적으로 회원가입이 완료됬습니다.'); } }, [signUpDone]); useEffect(() => { if (signUpError) { message.error(signUpError); } }, [signUpError]); const onSubmitForm = useCallback((value) => { console.log(value); dispatch(signupRequestAction(value)); }, []); return ( <section> <Form {...formItemLayout} form={form} name="signup" onFinish={onSubmitForm} scrollToFirstError > <Form.Item name="email" label="E-MAIL" rules={[ { type: 'email', message: 'E-mail형식이 올바르지 않습니다.', }, { required: true, message: 'E-mail을 입력하세요.', }, ]} > <Input /> </Form.Item> <Form.Item name="password" label="Password" rules={[ { required: true, message: '비밀번호를 입력하세요.', }, ]} hasFeedback > <Input.Password /> </Form.Item> <Form.Item name="confirm-password" label="Confirm Password" dependencies={['password']} hasFeedback rules={[ { required: true, message: '비밀번호를 입력하세요.', }, ({ getFieldValue }) => ({ validator(_, value) { if (!value || getFieldValue('password') === value) { return Promise.resolve(); } return Promise.reject(new Error('비밀번호가 일치하지 않습니다.')); }, }), ]} > <Input.Password /> </Form.Item> <Form.Item name="nickname" label="Nickname" rules={[ { type: 'text', }, { required: true, message: '닉네임을 입력하세요.', }, ]} > <Input /> </Form.Item> <Form.Item name="agreement" valuePropName="checked" rules={[ { validator: (_, value) => value ? Promise.resolve() : Promise.reject(new Error('약관에 동의해 주세요.')), }, ]} {...tailFormItemLayout} > <Checkbox> 이용약관에 모두 동의합니다. </Checkbox> </Form.Item> <Form.Item {...tailFormItemLayout}> <Button type="primary" htmlType="submit" loading={signUpLoading} >회원가입</Button> </Form.Item> </Form> </section> ); }; export default SignupForm; reducers/user.jsimport produce from 'immer'; import { dummyPost } from './post'; export const initialState = { me: null, signUpData: {}, loginData: {}, logInLoading: false, logInDone: false, logInError: null, logOutLoading: false, logOutDone: false, logOutError: null, signUpLoading: false, signUpDone: false, signUpError: null, nicknameEditLoading: false, nicknameEditDone: false, nicknameEditError: null, }; const dummyUser = (data) => ({ ...data, // email, password nickname: 'Mirrer', id: 2, Posts: [], Scrap: [], Board: [], }); export const LOG_IN_REQUEST = 'LOG_IN_REQUEST'; export const LOG_IN_SUCCESS = 'LOG_IN_SUCCESS'; export const LOG_IN_FAILURE = 'LOG_IN_FAILURE'; export const LOG_OUT_REQUEST = 'LOG_OUT_REQUEST'; export const LOG_OUT_SUCCESS = 'LOG_OUT_SUCCESS'; export const LOG_OUT_FAILURE = 'LOG_OUT_FAILURE'; export const SIGN_UP_REQUEST = 'SIGN_UP_REQUEST'; export const SIGN_UP_SUCCESS = 'SIGN_UP_SUCCESS'; export const SIGN_UP_FAILURE = 'SIGN_UP_FAILURE'; export const NICKNAME_EDIT_REQUEST = 'NICKNAME_EDIT_REQUEST'; export const NICKNAME_EDIT_SUCCESS = 'NICKNAME_EDIT_SUCCESS'; export const NICKNAME_EDIT_FAILURE = 'NICKNAME_EDIT_FAILURE'; export const BOARD_ADD_POST_TO_ME = 'BOARD_ADD_POST_TO_ME'; export const BOARD_REMOVE_POST_OF_ME = 'BOARD_REMOVE_POST_OF_ME'; export const SCRAP_ADD_POST_TO_ME = 'SCRAP_ADD_POST_TO_ME'; export const SCRAP_REMOVE_POST_OF_ME = 'SCRAP_REMOVE_POST_OF_ME'; export const loginRequestAction = (data) => { return { type: LOG_IN_REQUEST, data } }; export const signupRequestAction = (data) => { return { type: SIGN_UP_REQUEST, data } }; export const nicknameEditRequestAction = (data) => { return { type: NICKNAME_EDIT_REQUEST, data } }; const reducer = (state = initialState, action) => { return produce(state, (draft) => { switch (action.type) { case LOG_IN_REQUEST: draft.logInLoading = true; draft.logInDone = false; draft.logInError = null; break; case LOG_IN_SUCCESS: draft.logInLoading = false; draft.logInDone = true; draft.me = dummyUser(action.data); break; case LOG_IN_FAILURE: draft.logInLoading = false; draft.logInError = action.error; break; case LOG_OUT_REQUEST: draft.logOutLoading = true; draft.logOutDone = false; draft.logOutError = null; break; case LOG_OUT_SUCCESS: draft.logOutLoading = false; draft.logOutDone = true; draft.me = null; break; case LOG_OUT_FAILURE: draft.logOutLoading = false; draft.logOutError = action.error; break; case SIGN_UP_REQUEST: draft.signUpLoading = true; draft.signUpDone = false; draft.signUpError = null; break; case SIGN_UP_SUCCESS: draft.signUpLoading = false; draft.signUpDone = true; break; case SIGN_UP_FAILURE: draft.signUpLoading = false; draft.signUpError = action.error; break; case NICKNAME_EDIT_REQUEST: draft.nicknameEditLoading = true; draft.nicknameEditDone = false; draft.nicknameEditError = null; break; case NICKNAME_EDIT_SUCCESS: draft.me.nickname = action.data.nicknameEdit; draft.nicknameEditLoading = false; draft.nicknameEditDone = true; break; case NICKNAME_EDIT_FAILURE: draft.nicknameEditLoading = false; draft.nicknameEditError = action.error; break; case SCRAP_ADD_POST_TO_ME: draft.me.Scrap.unshift(dummyPost(action.data)); break; case SCRAP_REMOVE_POST_OF_ME: draft.me.Scrap = draft.me.Scrap.filter((v) => v.id !== action.data); break; case BOARD_ADD_POST_TO_ME: draft.me.Board.unshift(dummyPost(action.data)); break; case BOARD_REMOVE_POST_OF_ME: draft.me.Board = draft.me.Board.filter((v) => v.id !== action.data); break; default: break; } }); }; export default reducer; sagas/user.jsimport { all, fork, delay, 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, NICKNAME_EDIT_REQUEST, NICKNAME_EDIT_SUCCESS, NICKNAME_EDIT_FAILURE, } from '../reducers/user'; // function logInAPI(data) { // return axios.post('/api/login', data); // } function* logIn(action) { try { // const result = yield call(logInAPI, action.data); yield delay(1000); yield put({ type: LOG_IN_SUCCESS, data: action.data, }) } catch(err) { yield put({ type: LOG_IN_FAILURE, error: err.response.data }) } } // function logOutAPI() { // return axios.post('/api/logout'); // } function* logOut() { try { // const result = yield call(logOutAPI); yield delay(1000); yield put({ type: LOG_OUT_SUCCESS, }) } catch(err) { yield put({ type: LOG_OUT_FAILURE, error: err.response.data }) } } function signUpAPI(data) { console.log('signUpAPI 실행'); return axios.post('/user', data); } function* signUp(action) { console.log('signUp 실행'); try { const result = yield call(signUpAPI, action.data); console.log(result); yield put({ type: SIGN_UP_SUCCESS, }) } catch(err) { console.log(err); yield put({ type: SIGN_UP_FAILURE, error: err.response.data }) } } // function NicknameEditAPI() { // return axios.post('/api/NicknameEdit'); // } function* nicknameEdit(action) { try { // const result = yield call(NicknameEditAPI); console.log(action.data); yield delay(1000); yield put({ type: NICKNAME_EDIT_SUCCESS, data: action.data, }) } catch(err) { yield put({ type: NICKNAME_EDIT_FAILURE, error: err.response.data }) } } function* watchLogIn() { yield takeLatest(LOG_IN_REQUEST, logIn); } function* watchLogOut() { yield takeLatest(LOG_OUT_REQUEST, logOut); } function* watchSignUp() { console.log('watchSignUp 실행'); yield takeLatest(SIGN_UP_REQUEST, signUp); } function* watchNicknameEdit() { yield takeLatest(NICKNAME_EDIT_REQUEST, nicknameEdit); } export default function* userSaga() { yield all([ fork(watchLogIn), fork(watchLogOut), fork(watchSignUp), fork(watchNicknameEdit), ]); } back/app.jsconst express = require('express'); const cors = require('cors'); const postRouter = require('./routes/post'); const userRouter = require('./routes/user'); const db = require('./models') const app = express(); db.sequelize.sync() .then(() => { console.log('db 연결 성공'); }) .catch(console.error); app.use(cors({ origin: true, })); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.get('/', (req, res) => { res.send('Hello Express'); }); app.get('/api', (req, res) => { res.send('Hello API'); }); app.get('/api/posts', (req, res) => { res.json([ { id: 1, content: 'Hello1'}, { id: 2, content: 'Hello2'}, { id: 3, content: 'Hello3'}, ]) }); app.use('/post', postRouter); app.use('/user', userRouter); app.listen(3065, () => { console.log('서버 실행 중'); }); back/routes/user.jsconst express = require('express'); const bcrypt = require('bcrypt'); const { User } = require('../models'); const router = express.Router(); router.post('/', 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, 10); await User.create({ email: req.body.email, password: hashedPassword, nickname: req.body.nickname, }); res.status(200).send('OK'); } catch (error) { console.error(error); next(error); } }); module.exports = router; back/models/user.jsconst DataTypes = require('sequelize'); const { Model } = DataTypes; module.exports = class User extends Model { static init(sequelize) { return super.init({ email: { type: DataTypes.STRING(30), allowNull: false, unique: true, }, nickname: { type: DataTypes.STRING(30), allowNull: false, }, password: { type: DataTypes.STRING(100), allowNull: false, }, }, { modelName: 'User', tableName: 'users', charset: 'utf8', collate: 'utf8_general_ci', sequelize, }); } static associate(db) { db.User.hasMany(db.Post); db.User.hasMany(db.Comment); db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked' }) } };
-
미해결
작업 폴더에 css폴더 만들었는데 사이드 바엔 css폴더가 보이지 않습니다.
강의에서 사이드 바의 CSS폴더에서 마우스 오른쪽 클릭해 파일 만들기해서 style.css 파일 만들라고 하셨는데 작업 폴더에 css폴더 만들었는데 사이드 바엔 css폴더가 보이지 않습니다. 어떻게 보이게 합니까?
-
미해결[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드
사이드 바에 css폴더와 script폴더, images폴더 보이게 어떻게 합니까?
작업폴더 내에 index파일과 css폴더와 script폴더, images폴더 만들어 놓았는데 사이트 바에 css폴더와 script폴더, images폴더가 보이지 않는데 강의 화면에 처럼 사이드바에 보이게 어떻게 합니까?
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
3:12 초의 내용을 인덱스드 시그니쳐 처럼 어떻게 쓰나요?
3:12 초의 코드를 보면변수 aaaa의 속성에 type의 모든 속성을 넣어주어야 하고 있습니다.(모든 속성 안넣으면 빨간줄 뜸)인덱스드 시그니쳐처럼 let temp: A = { Human: "Human" }; let temp: A = { Human: "Human", Mammal: "Mammal" };(작성한 코드처럼 )필요한 만큼만 넣고 상황에 따라 확장하려면 어떻게 해야하나요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ModelAttribute 어노테이션에 대해 질문 있습니다.
@ModelAttribute 에 대해 의문이 생겨 커뮤니티 글도 읽어보고 구글링도하면 찾아봤는데 이제 제가 생각한 부분이 맞는건지궁금해서 질문을 합니다. 아래 두 함수는 똑같은 기능을 구현하고 있는건가요? @GetMapping("/add") public String addItem(@Valid ItemSaveForm formm, Model model) { model.addAttribute("formm", formm); return "validation/v3/addForm"; } @GetMapping("/add") public String addItem(@Valid @ModelAttribute("formm") ItemSaveForm formm) { return "validation/v3/addForm"; }
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
하나의 프로세스만 사용한다는 의미
안녕하세요 우연 찮게 강의를 보게 되었는데 도움이 많이 됩니다. 감사합니다! 미천한 실력이라 기초적인 질문 하나 하고싶습니다. synchronized가 하나의 서버, 하나의 프로세스에서만 적용된다는 의미는 예를들어, 스프링부트로 하나의 어플리케이션을 뛰운다는 단위인가요? 하나의 서버에서 여러 어플리케이션을 뛰운다면 synchronized는 각 어플리케이션에서만 동기화가 적용되는 것일까요 ?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 메시지 컨버터 사용 시 핸들러 어댑터의 반환 값
안녕하세요!강의를 들으며 결국 HandlerAdapter는 내부 로직을 통해 핸들러 종류에 관계없이 ModelAndView를 생성해 DispatcherServlet에게 전달해준다고 이해했습니다.그렇다면, @ResponseBody 등을 사용해 HTTP 메시지 바디에 값을 직접 입력하는 경우에도 ModelAndVIew가 반환되나요? ModelAndVIew 가 내부적으로 뭔가 HTTP 메시지 바디를 그대로 들고있을 수 있는 field 같은 것이 있는건지 궁금합니다.감사합니다!
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
강의 잘 듣고있습니다. 그런데 소스코드에 오타가 있는듯합니다.
참조를 이용한 값의 교환 함수swapA(&wallet1, &wallet2); 에서 &를 빼주셔야하고값을 이용한 값의 교환 함수swapC(&wallet1, &wallet2); 에서도 &를 빼주셔야할듯 합니다.
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
Nginx의 Proxy를 이용한 설계 관련해서 질문있습니다
안녕하세요! 좋은 내용으로 강의해주셔서 정말 감사드립니다. 질문이 하나 있습니다. 리액트에서 axois.get("/api/values") 이런식으로 요청해서 백엔드에서 응답을 받아오는데, 그 부분이 위의 사진에서 노란색 부분인가요?리액트에서 요청하면 다시 엔진엑스를 거쳐서 /api가 있으니까 백엔드 가서 응답을 받아오는건가요, 아니면 프론트에서 백엔드로 바로 요청을(? 어떻게 하는지는 모르겠지만..) 해서 응답을 받아오는 건가요?저 노란색 과정이 잘 이해가 안가서 조금 더 상세하게 설명해주실 수 있나요?감사합니다. 추석 잘 보내세요!
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
passport-local 사용.
소개해주시는 nestjs 문서에서는, 로그인시의 Authentication을 passport-local strategy를 통해 구현하고 있습니다.다만 강사님 강의에서는 이를 사용하지 않고, authService의 jwtLogin으로만 처리합니다.이 부분에서 질문이 있습니다.제가 느끼기에, 굳이 passport local 전략은 필요하지 않다고 생각합니다. 공식 문서에서 굳이 이를 사용한 이유가 있을까요?passport local은 로그인 때만 사용되는 전략인가요? 그러면 jwt등의 사용자 접속을 유지시키는 전략과는 다르다고 봐야하나요?그것(2번)이 아니고, passport local도 jwt 전략과 같은 개념부류에 속한다면, stateful혹은 stateless한 방식으로 사용자 접속을 유지시켜야할텐데 이를 어떻게 처리하는지 궁금합니다. 좋은 강의 감사합니다.
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
vs code 인터프리터 설정 (3)
https://inf.run/scRw안녕하세요.인터프리터 설정 관련으로 위 문의를 남겼던 수강생입니다.강사님께서 말씀하신 대로 해봤는데도 문제가 해결되지 않아서 다시 문의 드립니다.새로운 계정에서도 해보고, 내부망도 아닙니다.인터프리터 설정에서 막혀서 아직 시작도 못하고 있습니다...다른 문제가 있을까요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
6-7 좌표 정렬 문제 질문
안녕하세요 강의 잘 듣고 있습니다. compareTo 메소드를 정의하는게 이해가 잘 안되는 부분이 있습니다.compareTo 메소드를 재정의 해주었는데 그러면 Collections.sort(리스트); 이렇게 해주면 Collections 내부에서 제가 재정의한 compareTo 메소드를 사용해 알아서 리스트를 정렬해준다고 이해하면 되는걸까요?
-
미해결15일간의 빅데이터 파일럿 프로젝트
Memory limit exceeded 에러
Impala 쿼리 실행 시 위와 같은 에러가 나는 경우가 있습니다Impala 데몬 메모리 제한이 낮게 잡혀 있어서 생기는 문제인데요 해결방법은 클라우데라 매니저 -> Impala -> 구성 -> mem_limit 로 검색 -> Impala Daemon 메모리 제한을 늘려주시면 됩니다저는 1GiB 로 늘려서 쿼리를 실행에 성공했습니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
연구소 문제 런타임 에러
안녕하세요,강의 재미있게 잘 듣고 있습니다 ㅎㅎ http://boj.kr/fe9681a5260641dd90842b66b46cf5ec 기본 로직은 같은 것 같아서 크게 코드 위치를 수정을 하지 않았는데, 로컬에서 돌리면 아무 결과 출력이 안되고, 백준에 제출하니 never be null 런타임 에러가 발생하였습니다. 어떤 부분이 문제일까요? 감사합니다: ) 즐거운 추석되세요
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Js를 하는게 좋을까요?
안녕하세요 백엔드(자바스프링) 개발자를 꿈꾸는 수강생입니다. 처음에 백엔드 개발자가 되고자 할때는 js 지식은 별로 도움이 안 될 것 같다라고 생각했지만 제가 html,css,타임리프 엔진으로 뷰를 직접 제작할 때마다 페이지가 동적이거나 비동기 처리가 되면 더 좋을 것 같다라는 아쉬움을 가끔 느낍니다. 보통 현업에서 백은 api만 주지만 그렇다고 해서 js를 어느정도는 알아야 할 것 같아서요. 물론 회사마다 요구조건이 다르겠지만, 일반적으로 스프링 개발자가 어느정도의 js 지식이 필요한지 궁금합니다. Orm(jpa), 자바,스프링은 항상 심도있게 학습중입니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Exception in thread "main" java.lang.reflect.InvocationTargetException
계속 터미널에 java -jar jpashop-0.0.1-SNAPSHOT.jar 이렇게 작성을 하는데이런 오류가 반복되서 질문합니다. Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication at jpabook.jpashop.JpashopApplication.main(JpashopApplication.java:12) ... 8 moreCaused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 9 more
-
미해결JSP 웹 쇼핑몰 프로그래밍 기본 과정(JSP WEB Programming)
예제 코드 소스
안녕하세요! 해당 강의 예제 코드 소스는 어디서 볼 수 있나요?