묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Three.js로 시작하는 3D 인터랙티브 웹
캐릭터 이동시키면 z축 회전을 합니다
블렌더에서 새로 캐릭터 만들어서 적용해보고 있는데요일분이는 발이 땅에 고정된 상태로 이리저리 이동하는데방향을 바꿀 때 제 캐릭터는 다리가 땅에 고정되어있지 않고, 그러니까 Y축 회전을 하는게 아니고z축으로 회전해요...처음 시작 자세는 정상으로 뜨는데마우스 클릭으로 움직임 활성화하는 순간 자세가 변합니다위치 이동은 문제없이 잘 되고요어떤 것을 고쳐야할까요?ㅠㅠ
-
미해결웹 게임을 만들며 배우는 React
자식이 없는 ul 렌더링
안녕하세요 제로초님.<ul> {tries.map((t) => <Try key={} ... />)} </ul>만약 tries.length === 0 인 상태에서ul은 자식이 없는 상태로 화면에 렌더링 되는데ul이 렌더링 되지않게 하는 방법도 있나요?{ !!tries.length && <ul>{tries.map(...)}</ul> }위 방법이나 여러 방법으로 해봐도 오류 발생하네요ㅠㅠ vue에서는 ul에 v-if로 제어가 가능한데리액트에서도 비슷한 방법이 있는지 궁금합니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
문제 구현 방법을 떠올리는 방법이 궁금합니다
강사님께서 3. 카드 역배치 문제를 푸실 때, 예를 들어 리스트의 2번째부터 7번째까지 뒤집는 것이라면 (7-2)+1 // 2 이러한 식으로 3번만 반복해서 2번째와 7번째를 바꿔주면 된다고 하셨는데요. 저는 이 문제를 봤을 때, list[::-1] 이렇게 바꾸는 방법밖에 떠올리지 못했습니다.그리고 강사님이 (7-2)+1 // 2 이러한 식을 설명해주시면 이해는 되지만 제가 스스로 문제를 풀 때 떠올릴 수 없을 것 같다는 생각을 많이 하게 되는데, 이러한 식을 생각해낼 수 있는 방법이 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
AppConfig.java memberRepository() 메서드
섹션 3. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 스프링으로 전환하기 강의 듣던 중 질문있습니다.@Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); }위 코드에서 memberRepository() 메서드의 접근 지정자를 private에서 public으로 수정하셨는데요. 현재까지는 AppConfig에서만 사용되니 private으로 지정해도 상관없지 않나요? 나아가 이후에도 구현 객체를 반환하는 역할만 하지 않을까 하는 고민을 해봅니다.
-
미해결배틀로얄 게임을 만들어보며 배우는 언리얼 게임 개발
강의에서 추출한 하이트맵입니다.
이후 강의를 따라하는 데 필수 자료인 하이트맵이 올려져 있지 않아서 섹션 11에 올라와 있는 프로젝트 파일에서 추출하고 oxipng로 용량 줄였습니다.https://blog.kakaocdn.net/dn/EwIoH/btrLOnofkDR/7aCsdpD3jHqUb7xRIUmexk/Original_Heightmap.zip?attach=1&knm=tfile.ziphttps://blog.kakaocdn.net/dn/tmuNG/btrLOmizx8N/1pX94gZBXtkKlFmADgbC40/Original_Heightmap.z01?attach=1&knm=tfile.z01https://blog.kakaocdn.net/dn/85oKI/btrLK5bAnaQ/CaKwhqgXamCYBrSB4TWmUk/Original_Heightmap.z02?attach=1&knm=tfile.z02업로드할 곳이 없길래 분할 압축해서 티스토리 블로그에 올렸는데 외부 링크 다운로드 제한이 있는진 잘 모르겠습니다.자유주제로 올리면 강의 페이지에서 대시보드나 커뮤니티 눌렀을 때 글이 바로 뜨지 않아서 필요한 분들이 못 보실까봐 부득이하게 질문 카테고리로 올립니다.
-
해결됨[유니티6] 따라하면서 배우는 하이퍼캐주얼게임 시리즈 01
리셋버튼이 스테이지1로 바꿔주지 않습니다.
Pin Circle 게임에서 Reset 버튼을 눌러도스테이지1로 전환되지 않습니다. 예) 스테이지 3까지 클리어 -> 리셋버튼 클릭-> 시작버튼클릭 -> 스테이지4에서 시작(타겟에 적혀있는 스테이지 숫자만 1) 이미 클리어 될때 씬이동이 일어나기 때문입니다. 리셋버튼을 누른후에, 게임 시작을 누르면타겟에 적혀있는 숫자는 1로 바뀌지만스테이지1로 씬 전환이 일어나지는 않습니다. 리셋버튼을 누르면 호출되는 함수에서 Level 1로 씬 이동 해주는 코드를 넣어줘야 할것같습니다.저는 MainMenuUI.cs 에서 이렇게 수정했습니다. -기존 코드-public void ButtonClickEventReset(){PlayerPrefs.SetInt("StageLevel", 0);} -수정 코드-public void ButtonClickEventReset(){PlayerPrefs.SetInt("StageLevel", 0);int index = PlayerPrefs.GetInt("StageLevel");SceneManager.LoadScene(index);}
-
미해결게임 프로그래머 취업 전략 가이드
UE 공부/취업관련
안녕하세요C++만 계속 공부하다가 언리얼엔진 공부를 시작했는데 언리얼5가 나온 만큼 최신버전인 5로 공부를 시작했습니다. 그런데 여러 게임 회사들을 살펴보니 대부분은 4 경험/능력을 요구하는 것 같더라구요..(제가 가고 싶은 몇몇 회사들도 5보다는 4를 요구하고있고 5를 사용하는 곳은 신기술 등에 대해서 추가로 요구하는 부분이 많아서 쉽지 않을 것 같습니다ㅜ) 언리얼4와 5가 많이 다른가요?지금 하고 있는 5 (udemy로 강의를 듣고 있습니다) 를 중단하고 그냥 4를 쭉 공부하는 게 나을지, 아니면 5로 공부하다가 4로 넘어가도 금방 적응이 가능해서 괜찮을지 궁금합니다. 자체 엔진을 사용하는 게임회사에 지원하는 경우에도 언리얼 포폴을 사용해도 무관할까요..? 언리얼 공부 방법에 대해서도 조언을 얻고 싶습니다.강의(혹은 책)를 되는대로 들으면서 흡수한 다음 이걸 적용시켜서 게임을 만들어보면 되는 걸까요?아니면 만들 포트폴리오와 기술 내용?을 정해서 목표로 설정한 후, 공식문서나 필요한 내용을 다룬 강의/책 등을 선택적으로 찾아보고 헤딩하면서 일단 만들어보려고 하는 게 더 나은 방법일까요? (내년 여름에 취업하는 게 목표입니다. ) 언리얼과 상관없는 질문이긴 한데.. C++은 어떤식으로 공부를 해야할 지 모르겠습니다.루키스님 C++강의를 완강하고 나서 지금 modernC++을 공부중이고 알고리즘 공부도 하고 있습니다.그런데 알고리즘 문제 풀이를 할 때는 modernC++이나, C++의 다형성,상속성,은닉성 등과 관련된 것들을 연습해볼 수가 없는 것 같습니다.이런 것들을 연습하려면 어떻게 하는 게 좋을까요..? 언리얼을 하면서 C++코드 작성하는 것 정도면 충분한 연습이 될까요? 질문이 많아서 죄송하고, 좋은 강의 꾸준히 올려주셔서 정말 감사드립니다. 정말 많은 도움을 받았습니다.즐거운 추석 보내세요 :)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery
주문하기 화면에서 submit 시 위와 같은 에러가 발생합니다. Delivery어쩌구에서 에러가 발생하는 것 같은데 원인을 모르겠습니다.
-
해결됨(신규 강의로 재오픈 예정) 스스로 구축하는 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가 있으니까 백엔드 가서 응답을 받아오는건가요, 아니면 프론트에서 백엔드로 바로 요청을(? 어떻게 하는지는 모르겠지만..) 해서 응답을 받아오는 건가요?저 노란색 과정이 잘 이해가 안가서 조금 더 상세하게 설명해주실 수 있나요?감사합니다. 추석 잘 보내세요!