묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ResponseEntity와 @RestController
안녕하세요 강의 너무 잘 듣고 있습니다! 다름이 아니라 섹션 6. 스프링 MVC - 기본 기능 부분을 듣다가 궁금한 점이 생겨서 질문 드립니다. 우선 제가 이해하기로는 ResponseEntity를 사용하는 이유는 데이터(객체)와 함께 HTTP 응답 코드를 같이 반환 할 수 있기 때문이다물론 @ResponseBody와 @ResponseStatus를 같이 쓰면 데이터와 HTTP 응답 코드를 같이 보내줄 수 있지만, @ResponseStatus는 애노테이션이기에 동적으로 HTTP 응답 코드를 설정할 수 없기에 ResponseEntity를 사용하는게 더 효율적이다이렇게 두 가지 정도로 알고 있습니다. 여기서 제가 궁금한 점은 반환 타입이 ResponseEntity인 경우 왜 @RestController를 사용하는지 입니다. 그 동안 저도 ResponseEntity를 반환하는 컨트롤러에 @RestController를 항상 붙여줬는데, 강의를 보다 보니 ResponseEntity를 반환할 때는 @ReponseBody가 필요하지 않아서 @RestController가 아닌 @Controller로도 동작하는데 문제가 없어 보이기에 혹시 다른 이유가 있는지 궁금합니다.개인적으로 생각했을때 ResponseEntity를 반환하는 컨트롤러에 @RestController를 쓰는 이유는중간중간 ResponseEntity가 아닌 String, Object 같은 데이터만 반환하는 메서드가 있을 수 있고, 그런 메서드 마다 @ResponseBody를 붙이는게 번거롭기 때문에@RestController 적용시 스프링 컨테이너가 Bean Scope를 template 영역까지 고려하지 않아서 resource를 절약할 수 있기 때문에(?)이 두가지 정도 떠오릅니다. 만약 추가적으로 ResponseEntity를 반환하는 컨트롤러에서 @RestController를 사용하는 이유가 있을까요?그리고 두 번째 이유는 저도 정확히 아는게 아니라 주변에서 들었던 부분인데 이 이유도 해당된다면 조금 풀어서 설명해주실 수 있을까요?감사합니다!
-
미해결실전! 스프링 데이터 JPA
member 테이블에 member!!!!!!!!!이 안나옵니다.
member 에 저장된 데이터가 없습빈다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
로그인시 LOG_IN_REQUEST 부분
이와 비슷한 문제가 많아서 참고해서 복붙도 해보면서 했는데도 해결되지 않아질문 남깁니다. 로그인 버튼을 누르면 리덕스 데브툴에이와 같이 나오고 saga가 연결이 되지 않는 거 같아요(코드 첨부)sagas/index.jsimport { all, fork } from 'redux-saga/effects'; // import postSaga from './post'; import userSaga from './user'; export default function* rootSaga() { console.log('rootSaga') yield all([ fork(userSaga), // fork(postSaga), ]); } sagas/user.jsimport { all } from "axios"; import { delay, fork, put, takeLatest } from "redux-saga/effects"; import { LOG_IN_FAILURE, LOG_IN_REQUEST, LOG_IN_SUCCESS, LOG_OUT_FAILURE, LOG_OUT_REQUEST, LOG_OUT_SUCCESS } from "../reducers/user"; // function logInApi(data) { // // 비동기 처리 함수는 일반함수로 정의 // return axios.post("api/login", data); // } // function logOutApi() { // // 비동기 처리 함수는 일반함수로 정의 // return axios.post("api/login"); // } function* logIn(action) { console.log('login') try { console.log('saga logIn'); // const result = yield call(logInApi, action.data); //요청의 결과 yield delay(1000); yield put({ type: LOG_IN_SUCCESS, data: action.data, }); } catch (err) { console.error(err); yield put({ type: LOG_IN_FAILURE, data: err.response.data, }); } } function* logOut() { console.log('login') try { // const result = yield call(logOutApi); //요청의 결과 yield delay(1000); yield put({ type: LOG_OUT_SUCCESS, }); } catch (err) { console.error(err); yield put({ type: LOG_OUT_FAILURE, data: err.response.data, }); } } function* watchLogIn() { console.log('watchLogIn') yield takeLatest(LOG_IN_REQUEST, logIn); } function* watchLogOUT() { console.log('watchLogOUT') yield takeLatest(LOG_OUT_REQUEST, logOut); } export default function* userSaga() { yield all([ fork(watchLogIn), fork(watchLogOUT) ]) } const g = watchLogIn(); console.log(g.next())sagas/posts.js import { all } from "axios"; import { delay, fork, put, takeEvery } from "redux-saga/effects"; // function addPostsApi(data) { // // 비동기 처리 함수는 일반함수로 정의 // return axios.post("api/login", data); // } function* addPosts(action) { console.log('addPosts') try { // const result = yield call(addPostsApi, action.data); //요청의 결과 yield delay(1000); yield put({ type: "ADD_POST_SUCESS", data: action.data, }); } catch (err) { yield put({ type: "ADD_POST_FAILURE", data: err.response.data, }); } } function* watchAddPost() { yield takeEvery("ADD_POST_REQUEST", addPosts); } export default function* postSaga() { yield all([fork(watchAddPost)]); } reducers/index.jsimport { HYDRATE } from "next-redux-wrapper"; import { combineReducers } from "redux"; import user from "./user"; import post from "./post"; // (이전 상태, 액션) => 다음 상태 const rootReducer = combineReducers({ index: (state = {}, action) => { switch (action.type) { case HYDRATE: console.log("HYDRATE", action); return { ...state, ...action.payload }; default: return state; } }, user, post, }); export default rootReducer; reducers/user.jsexport const initialState = { isLoggingIn: false, //로그인 시도(로딩)중 isLoggedIn: false, // 로그인된 상태 isLoggingOut: false, // 로그아웃 시도(로딩)중 me: null, //내정보 signUpData: {}, loginData: {}, }; 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 loginRequestAction = (data) => ({ type: LOG_IN_REQUEST, data }); export const logOutRequestAction = () => ({ type: LOG_OUT_REQUEST, }); const user = (state = initialState, action) => { switch (action.type) { case LOG_IN_REQUEST: console.log('reducer login') return { ...state, isLoggingIn: true, }; case LOG_IN_SUCCESS: return { ...state, isLoggingIn: false, isLoggedIn: true, me: {...action.data, nickname: 'skylove1004'}, }; case LOG_IN_FAILURE: return { ...state, isLoggingIn: false, isLoggedIn: false, }; case LOG_OUT_REQUEST: return { ...state, isLoggingOut: true, }; case LOG_OUT_SUCCESS: return { ...state, isLoggingOut: false, isLoggedIn: false, me: null, }; case LOG_OUT_FAILURE: return { ...state, isLoggingOut: false, }; default: return state; } }; export const userState = (state) => state.user; export default user;reducers/post.jsexport const initialState = { mainPosts: [ { id: 1, User: { id: 1, nickname: "skyblue5030", }, content: "첫 번째 게시글 #express #react", Images: [ { src: "https://bookthumb-phinf.pstatic.net/cover/137/995/13799585.jpg?udate=20180726", }, { src: "https://gimg.gilbut.co.kr/book/BN001958/rn_view_BN001958.jpg", }, { src: "https://gimg.gilbut.co.kr/book/BN001998/rn_view_BN001998.jpg", }, ], Comments: [ { User: { nickname: "nero", }, content: "우와 개정판이 나왔군요~", }, { User: { nickname: "hero", }, content: "얼른 사고싶어요~", }, ], }, ], imagePaths: [], //이미지업로드시 추가됨 postAdded: false, }; const ADD_POST = "ADD_POST"; export const addPost = { type: ADD_POST, }; const dummyPost = { id: 2, content: "더미데이터입니다.", User: { id: 1, nickname: "제로초", }, Images: [], Comments: [], }; // 데이터를 먼저 구성, 화면은 작성한 데이터나 데이터 변경을 기준으로 구성 // 데이터 구조는 서버측과 합의해서 구성해야 나중에 수정할 일이 없음 const post = (state = initialState, action) => { switch (action.type) { case 'ADD_POST_SUCCESS': return { ...state, mainPosts: [dummyPost, ...state.mainPosts], // 데이터을 앞에 추가해서 게시글이 위로 올라가게 postAdded: true, }; default: return state; } }; export const postState = (state) => state.post; export default post; store/configureStore.js import { applyMiddleware, compose, createStore } from "redux"; import createSagaMiddleware from "redux-saga"; import { createWrapper } from "next-redux-wrapper"; import { composeWithDevTools } from "redux-devtools-extension"; import reducer from "../reducers"; import rootSaga from "../sagas"; const loggerMidddleware = ({ getState }) => (next) => (action) => { console.log({ action, getState }); return next(action); }; const configureStore = () => { const sagaMiddleware = createSagaMiddleware(); const middlewares = [sagaMiddleware, loggerMidddleware]; const enhancer = process.env.NODE_ENV === "production" ? compose(applyMiddleware(...middlewares)) : composeWithDevTools(applyMiddleware(...middlewares)); const store = createStore(reducer, enhancer); store.sagaTask = sagaMiddleware.run(rootSaga); return store; }; const wrapper = createWrapper(configureStore, { debug: process.env.NODE_ENV === "development", }); export default wrapper;
-
미해결PHP 7+ 프로그래밍: 객체지향
ios환경에서는 어떻게 설치해야 하나요?
안녕하세요. php를 배우고 있는 개발자입니다.제가 맥os를 사용하고 있습니다. m2칩입니다.강의는 윈도우 기준인거 같아, 맥도 설명해 주시면 감사하겠습니다!
-
미해결[LG유플러스] 앱 만들기 초급 과정 (Flutter)
긱 SDK 카피 코드 방법 문의
안녕하세요영상 2분 24초경 킥 SDK 코드 카피 방법 안내해주시는데, 실제 링크에서는 카피할 코드가 확인되지 않아서 문의 드려요.Windows install | Flutter
-
미해결실리콘밸리 엔지니어와 함께하는 OpenAI API (ChatGPT)
chat gpt api 관련 질문 드립니다!
chat gpt api를 통해 챗봇을 테스트로 개발하려고 합니다. openai.ChatCompletion.create 사용하여 질문을 던지고 응답을 받은 후에 똑같은 함수로 다음 질문을 던졌을 때 맥락 공유가 안되어 질문드려요!어떻게 작성해야 맥락 공유가 가능할까요..ㅜ?-------------------------*코드 openai.api_key = "my_key"default_system_set = "You are the manager of a shared office"default_user_set = "현재 지점은 서울대 지점 빈방 2개 남아있어. 이 정보를 기반으로 상담해주면돼. 앞으로 하는 질문은 전부 입주자라 생각하고 대답해줘."# 매니저 설정answer=openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": default_system_set}, {"role": "user", "content": default_user_set} ], max_tokens=50, )def get_response(prompt: str): return openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": prompt} ], max_tokens=200, )
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[수업 외 질문] 추가적으로 문제를 더 늘릴 생각은 있으신가요?
안녕하세요 강사님. 문제를 꾸준히는 아니더라도 가끔씩 계속해서 도전하고 있는데요. 지금 보면 문제가 많긴 하지만 더 추가하실 예정이 있는지 궁금합니다. 만약 있으시면 어디 파트가 추가될 예정인지 좀 알고 싶어요. 제 개인적인 희망은 구현 파트가 아주 많았으면 하는 것입니다.
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형 2번 문제 유형관련 질문
안녕하세요!덕분에 공부 잘 하고 있습니다!다름이 아니라 작업형 2번 문제에 지도학습 중 분류와 회귀 위주로 기출이 나오고 강의를 해주시는데, 비지도 학습의 군집분석이나 연관분석 문제는 배제하고 공부를 해도 될런지요?만약 공부를 해야 한다면 어디를 참조하여 공부를 하면 될까요? (예시문제 등)
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
File과 Socket에 대해서
안녕하세요 선생님! 질문 있어 글을 남깁니다.프로세스가 data를 전송하기 위해 Socket을 통해 데이터를 전송한다고 이해했습니다.Socket은 커널 기능을 이용하기 위해, 더 자세하게는 TCP/IP 프로토콜을 이용할 수 있도록 해주는 인터페이스라고 이해했습니다.지금까지 제가 이해한 부분은 맞는지 궁금합니다.또 File은 mp3 파일, 문서 파일 등 우리가 생각하는 파일이고, Socket이 File의 일종이라고 설명해주셨는데 이 부분이 잘 와닿지 않습니다.다른 질문글에서도 프로세스가 Socket을 open하고 각 Socket이 포트 번호를 부여받는다고 답변을 달아주신 것도 보았습니다.이 설명을 보고나니까 File과 Socket이 무슨 연관성이 있길래 File의 일종이라고 설명해주시는지 더 와닿지 않는 것 같습니다... 정확히 잘 이해가 안됩니다. 좀 더 설명해주실 수 있을까요?
-
해결됨카프카 완벽 가이드 - 코어편
Custom 객체 직렬화 kafka-console-consumer 조회 시 null
텍스트가 추가될 때마다 메시지를 전송하는 Producer의 Custom 객체 직렬화 구현 - 01~02강의에서 kafka서버에서 kafka-console-consumer --bootstrap-server localhost:9092 --topic order-serde-topic 로 데이터 조회 시 null이 조회되는 에러가 있습니다. 원인은 "텍스트가 추가될 때마다 메시지를 전송하는 Producer의 Custom 객체 직렬화 구현 - 01" 번 강의에서 OrderSerializer 객체에서 serialize 메소드의 serializedOrder 를 null 로 초기화 한 뒤에 값을 대입하지 않고 반환하도록 하고 지나갔네요 objectMapper.writeValueAsBytes(order); 부분을 아래와 같이 수정하면 됩니다.serializedOrder = objectMapper.writeValueAsBytes(order);
-
미해결C# 프로그래밍 기초
람다는 수업 강의에서 안배우는건가요??
안녕하세요 교수님 이번에 교수님 강의로 c#을 배워 볼라고 하는 학생 입니다.혹시 제가 찾아봤을 때는 람다식 관련해서 강의가 없는데 이 강의에서는 람다식을 따로 배우지는 않는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 매소드 양방향 관계
양방향으로 관계가 어떤 경우일까요? 1대다, 다대다 이런 경우를 말하는건가요? 연관관계 메서드가, 객체를 생성하고 값을 셋팅할때 한개라도 빼먹는 경우가 있어서 간편하게 하려고 두개를 묶어서 나타내는 것이라고 생각하면 맞나요? 강의 25분 9초에서 연관 관계 메서드를 왜 적어줘야 하는지 잘 모르겠습니다. 그러니까, order라는 엔티티를 만든 곳에 member객체를 필드명 member 와 구별하기 위해 this.member = member 하면서 셋팅을 하고, member.getOrders().add(this) 즉, 회원 주문에 회원이름을 넣어주고? 이거를 여기에 기본적으로 셋팅해주는 이유가 뭔가요??
-
미해결현직 CISO가 알려주는 정보보호/정보기술 채용 합격 비법
강의 내용 중복 관련 문의
안녕하세요강의 중에 중복된 내용이 보여 확인 요청드립니다.면접보기(3/3) 이론 면접 강의 내용이 중복되어 있으며(14:42초부터 내용 중복)강의교안에 있는 V. 이직하기 내용에 대한 설명이 누락되어 있습니다.내용 확인 부탁드립니다.
-
미해결장박사의 블록체인 이해와 구조
선생님 강의 정말 잘 듣고 있습니다. 혹시 죄송하지만 강의자료를 얻을 수 있을까요?
혹시 강의 자료를 받을 수 있는지 해서 이렇게 질문을 올립니다. sho518@naver.com 이쪽으로 보내주신다면 정말 감사하겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다.
구글에 쳐봐도 제데로된 해결 방안이 안 나옵니다. 재부팅도 해보고, 핫스팟 문제도 해결해봤지만 계속해서 똑같은 오류가 발생합니다.해결부탁드립니다.ㅠㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
http://localhost:8080/hello 에서 에러가 나네요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용] 몇 번을 확인했는데 에러가 나서 찾기가 어렵네요도움 부탁드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
build 오류 발생 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강의 잘 듣고 있습니다.cmd에서 선생님과 동일하게 build 명령어 입력했는데 실행 할 수 없다고 떠서 문의 드립니다.관리자 모드 cmd에서도 동일한 증상인데 무엇이 문제일까요..?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션이 왜 10개가 만들어지는 것인가요?
영상에서 커넥션이 10개 만들어지는 것을 보여주셨는데 반복해서 코드를 실행하지 않았는데 왜 10개가 만들어지는 건가요?datasource.setMeximumPoolSize(10);은 커넥션에 풀의 최대 크기를 10개로 지정하는 것 아닌가요? 이 코드만으로 최대 크기도 지정하면서 커넥션 10개 생성까지 할 수 있는 건가요?실무에서도 보통 10개를 쓰신다고 말씀하셨는데 메이저 웹이나 어플일 경우 사용자 수가 기본 만 단위는 넘어갈텐데 10개로 다 커버가 가능한가요?
-
미해결스프링 핵심 원리 - 기본편
cannot resolve symbol springframework 오류입니다
이런 식으로 에러가 떴는데, 무엇을 잘못 건드렸는지 모르겠어요ㅠㅠgradle을 다시 refresh 해봤는데 똑같습니다+) File > Invalidate Caches / Restart 로 해결했습니다.그 뒤로이렇게 out폴더까지 빨갛게 뜨는데 괜찮나요? 실행은 아직까지는 괜찮은데선생님은 .gradle폴더와 build폴더만 빨갛게 표시되서요
-
해결됨기출로 대비하는 개발자 전공면접 [CS 완전정복]
노션 공유 요청 드립니다
노션 공유 요청을 드렸는데 아직 받지 못해서 질문 글 남깁니다!메일은 ericsong19990917@gmail.com 입니다.좋은 강의 감사드립니다!