묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오류 발생시 입력 값?
안녕하세요, 가격에 qqq 를 넘기게 되면 , 컨트롤러로 넘어가기 전에 스프링에서 만들어주는 FieldError(스프링의 바인딩 오류 처리)의 rejectedValue 에 qqq 가 담기게 된다고 이해했습니다. 그러면 컨트롤러 내부에서 직접 생성하는 FieldError에 있는 rejectedValue의 값은 무시가 되는건가요?? 해당 위치에 임의의 String을 넣어봐도 화면에 출력이 되지 않습니다. 타임리프의 th:field 가 동작할 때 이런 과정을 자동으로 해주는걸까요?? 항상 답변 감사합니다.
-
미해결
안녕하세요 피씨에서 엑셀 저장하면
모바일 엑셀에서도 자동저장 되는 방법은 없나요? 피씨엑셀도 저장하고 모바일 원라이브에서도 저장하려고 하니 너무 번거롭고 실수하다간 모바일엔 저장이 안되고 그러네요 피씨에서 한번만 저장하면 원pc+원드라이브도 같이 저장되는 방법은 없나요? 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
Quest Detail View
Quest Detail View는 Tracker랑 다르게 몬스터를 잡으면 퀘스트 진행도가 바로바로 업데이트가 안되고 퀘스트를 클릭 했을 때 업데이트가 되는데 이걸 어떻게 고쳐야 Tracker랑 똑같이 바로바로 업데이트가 될까요?
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
강사님 2분 50초에 대해 질문드립니다
강사님 안녕하세요 강의 2분 50초에 보여주신 asysnc await 구문을 then 구문으로 변경하면 이렇게 변경할 수 있는지 질문드리고 싶습니다 PPT에서 보여주신 then 소스코드가 13행부터 보여주신 걸 수도 있는데, 혹시 제가 틀린 걸 수도 있어서 궁금해서 질문드립니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
23분 질문
InterLocked질문입니다. 33번째 줄처럼 InterLocked.Exchange를 해주어 인자로 ref _disconnected 값을 가져오는데 _disconnected 의 주소값을 가져외서 Exchange를 해주는 것이니까 _disconnected 가 0일경우 1로 바꿔주는데 1일 경우는 retunr을 하는 것까지는 이해했습니다. 그런데 두번째로 사용하려고 하면 _disconnected 가 계속 1인 상태이니까 어디선가는 0으로 초기화를 해주어야 다음 클라 세션이 연결을 끊을때 끊을 수 잇는것 아닌가요..?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
maven이 아니라 gradle로 진행중이신 분들
```// maven 기준 > mvn spring-boot:run \ -Dspring-boot.run.jvmArguments='-Dserver-port=9003' // gradle 기준 (4.9 이상)> ./gradlew bootRun --args='--server.port=9003' // java jar 기준 > java -jar "-Dserver.port=9003" ./user-service.jar // 참고: gradle로 jar 만들려면.. > ./gradlew build //실행후 project의 최상단 디렉토리/build/libs에서 jar확인// gradle로 boot 실행하기> ./gradlew bootRun```알아서 잘 하시리라 생각되지만 조금이라도 시간절약이 되실까하여 올려봅니다
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
moment 질문
굉장히 사소한 질문이긴 한데요, 제가 moment 를 실험삼아 써보다가 페북이나 유튜브처럼 방금, ~분전 등으로 표시되는 fromNow() 를 써봤는데 분명 방금 쓴 댓글인데 10분이나 22분전으로 막 표시되는 등 시간 정확성이 떨어지는데 이유가 뭘까요?? 다른 것들은 시간 표시가 잘 되었는데 말이죠 moment(post.createdAt).startOf('hour').fromNow()
-
미해결함수형 프로그래밍과 JavaScript ES6+
지연성 이전까지 함수들 사용 목적
안녕하세요! 강의 잘 보고있습니다. 우선, 질 좋은 강의를 제공해주셔서 감사합니다. 지연성 강의 들어가기 이전, map,filter,reduce에 대해 서 기존 array에 존재하는 메서드들을 iterator에 적용할수있는 함수로 새롭게 만들어 주셨는데, 새로운 함수를 만들어서 사용하는 이유가 array가 아닌 iterator 객체들도 사용할 수 있게 하기 위함일까요? 그게 아니라면, 지연성에 들어가기 위한 빌드업 과정이라고 생각해야할까요?? 감사합니다!
-
미해결실전! Querydsl
페이징에 대해서 문의드립니다.
정말 좋은 강의 감사합니다. 다름이 아니라 querydsl로 페이징 처리를 하게 될 경우 기본이 0부터 시작이 되는데 web 화면에서 작업을 해 보니 <ul> <li> <a th:href="@{/list(searchType=${param.searchType}, keyword=${param.keyword}, page=${userList.getNumber() - 1})}"> <i class="fas fa-angle-double-left"></i> </a> </li> <li th:each="i : ${#numbers.sequence(0, userList.getTotalPages() - 1 )}"> <a th:href="@{/list(searchType=${param.searchType}, keyword=${param.keywrod}, page=${i})}" th:classappend="${i == (userList.getNumber() + 1) ? 'text-blue-600 bg-blue-50 border-blue-300' : ''}" th:text="${i + 1}">1</a> </li> <li> <a th:href="@{/list(searchType=${param.searchKeyword}, keyword=${param.keyword}, page=${userList.getNumber() + 1})}"> <i class="fas fa-chevron-right"></i> </a> </li> <li> <a th:href="@{/list(searchType=${param.searchType}, keyword=${param.keyword}, page=${userList.getNumber() + 1})}"> <i class="fas fa-angle-double-right"></i> </a> </li> </ul> 위와같이 작업을 했는데 하단에 페이지 번호는 1번부터 보여지는데 실제 URL로 보여지는 주소는 ?searchType=&keyword=&page=0 이런식으로 페이지 번호가 0번부터 시작이 됩니다. 그리고 하단의 페이지 번호를 클릭을 해도 당연히 4페이지를 클릭하면 URL에는 page=3으로 표시가 되는데 이 표시되는 값을 변경을 할려면 어떻게 해야할까요??구현하려고 하는 것은 하단의 4페이지를 클릭을 하면 4페이지의 정상적인 데이터가 보여지고, 상단의 URL에도 page=4로 표시가 되게 하려고 하는데 잘 안되네요. 어떤식으로 수정을 해 줘야 할까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
한개만 더 질문드릴게요ㅜㅜ
바로 아래에도 질문글 남겼는데...잘 이해가 안되는 부분이 있어서 한개만 더 질문드리겠습니다ㅠ 7:40분 경에 bindingResult.rejectValue("itemName", "required"); # new String[]{"required.item.itemName", "required"); 부분에서 개발자가 에러코드를 "required"로 해놓으면 먼저 "required.item.itemName"을 찾고 없으면 "required"를 찾는다고 말씀하셨는데, required.item.itemName과 required 둘 다 있는 상태인데 범용적인 required를 사용해야하는 경우에는 어떻게 해야되나요? 그럴땐 String 배열로 "required.item.itemName"을 안넘기면 되나요...? 감사합니다ㅜ!!
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
모듈과 always블록의 관계(?)에 대한 질문입니다.
안녕하세요, 맛비님. 강의 영상을 통해 항상 많은 배움을 얻는 중입니다. 감사합니다. 파이프라인 실습편 강의의 Q&A를 읽다가 질문이 하나 생겼습니다. 해당 질문의 답변중에 모듈간의 handshake를 통해 timing을 맞춘다고 답변을 해주신 게 있습니다. 모듈간에 handshake가 필요한 건 이해하였습니다. 제가 궁금한 건, 만약 모듈들을 한 모듈안의 always(clk) 구문으로 구현한다면, always 구문간에 통신할 때도 handshake가 필요한 지 궁금합니다. 제 생각에는 한 모듈안에 여러 always(clk) 구문으로 구현하더라도 각 alway 블록이 하나의 모듈과 같다고 생각이 들긴 합니다. 질문을 정리하면 다음과 같습니다. 1. 모듈들을 한 모듈안의 always 구문으로 보통 구현하지 않는 것 같은데, 가독성을 위한 이유 말고 다른 이유가 있는지 2. 한 모듈 안의 여러 always 구문 v.s. always 블록마다 모듈로 구현 -> 차이점이 무엇인지 기존에 질문이 있을 것 같아서 찾아봤는데 없는 것 같아서 질문드립니다 ㅠ 아직 많이 헷갈리네요 ㅠ 읽어주셔서 감사합니다. 김민호 드림
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
우선순위
안녕하세요 김영한 개발자님! 항상 강의 잘 보고 있습니다. 오류 코드를 범용성으로 사용하다가, 세밀하게 작성해야 하는 경우에는 세밀한 내용을 우선순위로 사용한다고 말씀하셨는데, 예를 들어서 평소에는 'required=필수 값 입니다,'로 사용하고 상품이름을 세밀하게 사용하고 싶으면 'required.item.itemName=상품 이름을 필수입니다,'를 new String[]{"required.item.itemName", "required"} 이런 방법으로 사용하면 된다고 이해했습니다. 그럼 만약에 회원가입에서 "가입자의 이름은 필수입니다"라고 표현하고 싶으면 'required.name.userName=가입자의 이름은 필수입니다'라고 properties에 작성한 다음에 new String[]{"required.name.userName", "required"} 이렇게 작성하면 되는 걸까요? 이 때는 그럼 required.item.itemName은 우선순위로 설정하지 않아도 괜찮나요? 항상 친절한 답변해주시는 서포터즈 분들도 감사드립니다!
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
셀레니움 클릭시 오류
안녕하세요 강의를 듣던중 웹페이지 까지는 잘 열리는데 쇼핑버튼을 클릭하는 과정에서 자꾸 시스템에 부착된 장치가 작동을 하지 않는다고하여서 구글링도 해보고 주피터로도 실행해보고 다 해봤는데 오류가 해결되지않아서 이렇게 질문을 남겼습니다. ㅜㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send관련 질문입니다.
로그도 찍어보고 브레이크 포인트도 잡아보면서 해보아도 도저히 무슨문제인지 파악이 안되서 질문드립니다. 핸들러함수안에서 아래와같이 1번패킷과 2번패킷으로 Send를 두번 연속호출했을 때 클라이언트에선 2번패킷으로만 두번 호출되더라구요. 근데 또 1번패킷과 2번패킷 Send사이에 브레이크 포인트로 지연시간을 잠깐 둔 후 실행하면 클라이언트에서 제대로 1번 2번 순서대로 받게 되더라구요. 왜 이런 현상이 나오는지에 대해 질문드립니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
해시태그와 이미지 업로드가 안됩니다.
해시태그를 달고 이미지 첨부해서 올려도 게시글과 사진이 서버로 넘어가지 않는거 같습니다. Request 요청은 가는데 그 이후로 처리가 안되네요. MySQL Workbench에서 새로고침눌러봐도 게시글 해시태그 이미지 모두 안올라 가집니다.. const express = require('express'); const multer = require('multer'); const path = require('path'); const fs = require('fs'); const { Post, Image, Comment, User, Hashtag } = require('../models'); const { isLoggedIn } = require('./middlewares'); const router = express.Router(); try { fs.accessSync('uploads'); } catch (error) { console.log('uploads 폴더가 없으므로 생성합니다.'); fs.mkdirSync('uploads'); } const upload = multer({ storage: multer.diskStorage({ destination(req, file, done) { done(null, 'uploads'); }, filename(req, file, done) { const ext = path.extname(file.originalname); // 확장자 추출(png) const basename = path.basename(file.originalname, ext); // 레니 done(null, basename + '_' + new Date().getTime() + ext); // 레니15335436332.png }, }), limits: { fileSize: 20 * 1024 * 1024 }, // 20MB }); router.post('/', isLoggedIn, upload.none(), async (req, res, next) => { try { const hashtags = req.body.content.match(/#[^\s#]+/g); const post = await Post.create({ content: req.body.content, UserId: req.user.id, }); if (hashtags) { const result = await Promise.all(hashtags.map((tag) => Hashtag.findOrCreate({ where: {name: tag.slice(1).toLowerCase() }, }))); // [[노드, true], [리액트, true]] await post.addHashtags(result.map((v) => v[0])); } if (req.body.image) { if (Array.isArray(req.body.image)) { // 이미지를 여러개 올리면 배열로 올라감 const images = await Promise.all(req.body.image.map((image) => Image.create({ src: image }))); // map을 해서 시퀄라이즈 create 만들어주세요. await post.addImages(images); } else { // 이미지를 하나만 올리면 image: 레니.png const image = await Image.create({ src: req.body.image }); await post.addImages(image); } } const fullPost = await Post.findOne({ where: { id: post.id }, include: [{ model: Image, }, { model: Comment, include: [{ model: User, // 댓글 작성자 attributes: ['id', 'nickname'], }], }, { model: User, // 게시글 작성자 attributes: ['id', 'nickname'], }, { model: User, // 좋아요 누른 사람 as: 'Likers', attributes: ['id'], }] }) res.status(201).json(fullPost); } catch(error) { console.error(error); next(error); } }); router.post('/images', isLoggedIn, upload.array('image'), async (req, res, next) => { // POST /post/images console.log(req.files); res.json(files.map((v) => v.filename)); }); router.post('/:postId/comment', isLoggedIn, async (req, res, next) => { // POST / post/1/comment try { const post = await Post.findOne({ where: { id: req.params.postId } }); if (!post) { return res.status(403).send('존재하지 않는 게시글입니다.'); } const comment = await Comment.create({ content: req.body.content, PostId: parseInt(req.params.postId, 10), // reducer > post.js > ADD_COMMENT_SUCCESS -> action.data.PostId 대소문자 일치시켜주어야 한다! UserId: req.user.id, }) // const fullComment = await Comment.findOne({ // where: { id: comment.id }, // include: [{ // model: User, // attributes: ['id', 'nickname'], // }], // }) res.status(201).json(comment); } catch(error) { console.error(error); next(error); } }); router.patch('/:postId/like', isLoggedIn, async (req, res, next) => { // PATCH /post/1/like try { const post = await Post.findOne({ where: { id: req.params.postId }}); if (!post) { return res.status(403).send('게시글이 존재하지 않습니다.'); } await post.addLikers(req.user.id); res.json({ PostId: post.id, UserId: req.user.id}); } catch (error) { console.error(error); next(error); } }); router.delete('/:postId/like', isLoggedIn, async (req, res, next) => { // DELETE /post/1/like try { const post = await Post.findOne({ where: { id: req.params.postId }}); if (!post) { return res.status(403).send('게시글이 존재하지 않습니다.'); } await post.removeLikers(req.user.id); res.json({ PostId: post.id, UserId: req.user.id}); } catch (error) { console.error(error); next(error); } }); router.delete('/:postId', isLoggedIn, async (req, res) => { // DELETE /post/10 try { await Post.destroy({ where: { id: req.params.postId, UserId: req.user.id, }, }); res.status(200).json({ PostId: parseInt(req.params.postId, 10) }); } catch(error) { console.error(error); next(error); } }); module.exports = router;
-
미해결스프링 핵심 원리 - 고급편
스프링 빈 생성 순서에 따라 프록시 객체가 주입되지 않을수도 있는지?
안녕하십니까, 강의 너무 잘 들었고, 실무에도 큰 도움이 될것 같습니다. 실무에 적용해보려고 테스트중인데, 잘 되지 않는 부분이 있어 문의 드립니다. @Aspect 로 어드바이저를 만들어, 특정 빈에 대해 프록시객체가 적용되길 기대하였는데, 그 빈을 주입받는 서비스에 가서 로그를 찍어보니, 프록시 객체가 주입된것이 아니고, 원래의 타겟 객체가 주입되어있었습니다. 표현식이 잘못된거나 한건 아니었습니다. 이것저것 해보다가 빈 생성 순서때문이 아닐까 싶어, 스프링 설정 파일에서 조정을 좀 했더니, 이번엔 잘 되더라구요, @Aspect 로 선언한 class 가 먼저 빈으로 등록이 되고, 원본 타겟이 이후에 빈으로 등록이 되어야만 정상적으로 AOP 가 적용되는것이 맞는걸까요?
-
미해결Slack 클론 코딩[실시간 채팅 with React]
images저장 코드가 이해가 되질 않습니다
안녕하세요 제로초님 질문에 대한 빠른답변 항상 감사드립니다 :) 제로초님 sleact express code에서 이미지를 저장하는 부분의 코드가 이해가 되지 않아서 질문 올립니다 밑에 처럼 코드가 되어있는데 for문을 돌면서 req.files 길이 마다 n번 create를 하는 것인가요? 궁금해서 console.log(req.files)를 입력해보았는데 undefined라고 뜹니다. 코드를 작성하면 잘 저장은 되는데.. 왜 for문을 도는 건가요?? for (let i = 0; i < req.files.length; i++) { const chat = await ChannelChat.create({ UserId: req.user.id, ChannelId: exChannel[0].id, content: req.files[i].path, }); }
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
self 입력?
self 는 왜 입력하나요? 임의로 정의하신건지, 어떤 의미가 있는 지 궁금합니다. 강의에는 설명이 없네요~!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
메모리 저장
루키스님 좋은강의 잘 듣고있습니다! 다름이 아니라 강의를 듣다가 메모리에 데이터가 저장된 부분을 보니 데이터가 연속적으로 저장되지않고 16바이트 정도 띄워져서 저장이 된걸보고 구글링을하다 64비트 환경이여서 메모리 정렬때문에 8바이트 단위로 저장이 된거구나 라고 생각했는데 이 이유가 맞나요?? 또,막상 이렇게 확인해보니 cccccccc 0113f8a0 0000001 ccccccccc 이런식으로 저장된걸 보니 왜 cccccccc 0113f8a0 ccccccccc 0000001 이 아니지라는 의문이 생기더라구요 이유를 알고싶으면 운영체제를 공부해야하나요? 아니면 컴퓨터 구조쪽을 공부해야하나요??? 무엇을 공부해야 알 수 있을지 궁금해요 ㅜㅜ
-
미해결[리뉴얼] 처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
mongoDB 의 capped 컬렉션 질문
몽고DB 데이터 삭제 - SQL과 비교강의 10분 20초 안녕하세요. 좋은 강의 잘 듣고 있습니다 :) 저는 employees 컬렉션을 만들 때 { capped : true, size:10000 } 으로 옵션을 주고 컬렉션을 만들었는데요. Q1 아래와 같이 조건을 주고 데이터를 삭제하려고 하니 capped 조건이 있는 컬렉션에서 데이터를 삭제할 수 없다는 에러 메시지가 뜨는데 capped 조건이 있는 컬렉션에서는 왜 데이터 삭제가 안되나요? db.employees.deleteMany( { age : { $lt : 30 } } ) Q2 예를 들어 key 값이 user_id이고 value 값이 a007인 데이터를 a0078로 데이터 수정을 하려고 할 때 capped 옵션(size : 10000으로 설정)이 부여된 컬렉션에 데이터를 업데이트 할 때 a007과 a0078의 규격이 달라서 그런지 데이터 수정이 안됩니다. 수업에서 들은 바로는 capped 옵션을 통해 데이터 저장 공간을 미리 넉넉히 확보해 두는 것으로 알고 있는데 위와 같이 규격이 하나 차이난다고 오류가 나올리가 없는데 왜 데이터 수정에 오류가 생기는 걸까요..? 항상 답변 감사합니다 :)