묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결테스트주도개발(TDD)로 만드는 NodeJS API 서버
오타로 인해 한참을 헤맸네요.
강의를 거의 끝까지 잘 따라가면서 코딩을 하고 있습니다.마지막 DB연동한 테스트 코드에서 한 가지 에러가 해결되지 않았어요. PUT /users/:id 성공시 변경된 name을 반환: Uncaught AssertionError: expected Object {} to have property name하지만 아무리 구현코드, 테스트코드를 살펴봐도 잘못된 점이 없어보여요. request(app) .put('/users/2') .send({ name: 'Malcolm' }) .end((err, res) => { console.log(res);이 부분에서 err는 null이길래 res 전체를 콘솔로 찍어보니, text: '<!DOCTYPE html>\n' + '<html lang="en">\n' + '<head>\n' + '<meta charset="utf-8">\n' + '<title>Error</title>\n' + '</head>\n' + '<body>\n' + '<pre>TypeError: models.User.fineOne is not a function<br> res에서 화면에 뿌려지는 text 부분의 html에서 fineOne이 오타라는걸 알았네요.err가 아닌 res에서 에러코드를 찾아야 하는게 우선 이해가 잘 안가네요. 물론 경험치에서 디버깅 스킬이 늘긴 하겠지만초보로써는 직접 저 에러가 터미널에 뜨는게 맞는거 아닌가 하는 생각이 들었네요.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 식 기본 객체 표현식 오류 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 타임리프 - 기본기능 강의중 식 기본 객체 예제 실습 중 표현식 오류가 나서 질문 드립니다.오류내용은 다음과 같습니다.org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#request" (template: "basic/basic-objects" - line 11, col 7) at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:292) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] ...중략 Caused by: java.lang.IllegalArgumentException: The 'request','session','servletContext' and 'response' expression utility objects are no longer available by default for template expressions and their use is not recommended. In cases where they are really needed, they should be manually added as context variables. at org.thymeleaf.standard.expression.StandardExpressionObjectFactory.buildObject(StandardExpressionObjectFactory.java:207) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.spring6.expression.SpringStandardExpressionObjectFactory.buildObject(SpringStandardExpressionObjectFactory.java:110) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.DialectSetConfiguration$AggregateExpressionObjectFactory.buildObject(DialectSetConfiguration.java:777) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.expression.ExpressionObjects.getObject(ExpressionObjects.java:108) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.spring6.expression.ThymeleafEvaluationContext.lookupVariable(ThymeleafEvaluationContext.java:134) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.springframework.expression.spel.ExpressionState.lookupVariable(ExpressionState.java:146) ~[spring-expression-6.0.2.jar:6.0.2] at org.springframework.expression.spel.ast.VariableReference.getValueInternal(VariableReference.java:76) ~[spring-expression-6.0.2.jar:6.0.2] at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:112) ~[spring-expression-6.0.2.jar:6.0.2] at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:338) ~[spring-expression-6.0.2.jar:6.0.2] at org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:265) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] ... 58 common frames omitted 2022-12-08T22:59:02.658+09:00 ERROR 8488 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#request" (template: "basic/basic-objects" - line 11, col 7)] with root cause java.lang.IllegalArgumentException: The 'request','session','servletContext' and 'response' expression utility objects are no longer available by default for template expressions and their use is not recommended. In cases where they are really needed, they should be manually added as context variables. at org.thymeleaf.standard.expression.StandardExpressionObjectFactory.buildObject(StandardExpressionObjectFactory.java:207) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.spring6.expression.SpringStandardExpressionObjectFactory.buildObject(SpringStandardExpressionObjectFactory.java:110) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE] at org.thymeleaf.DialectSetConfiguration$AggregateExpressionObjectFactory.buildObject(DialectSetConfiguration.java:777) ~[thymeleaf-3.1.0.RELEASE.jar:3.1.0.RELEASE] ...중략해당 내용을 해석해보니 더이상 #request와 같은 표현식은 제공이 안되고 수동적으로 변수를 주입해서 사용하라는 것 같습니다. (modelAttribute로 request를 넘겨줘보니 출력이 잘되는걸 확인했습니다.) 혹시라도 제가 실수를 해서 표현식이 안되는 것인지 아니면 진짜로 더이상 이런 표현식을 제공하지 않는 것인지 궁금합니다.항상 좋은 강의 감사합니다
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
client firebase config 파일 문의
안녕하세요.강좌에서 보면 server쪽 화면변수(config)들 Herok에 등록하고, process.env로 접근하도록 설명해 주셨습니다. 그런데 client쪽 firebase관련 key값들은 Herok에 등록하지 않고 firebase.js에 추가하여 사용하는 것으로 이해했습니다. 이런 경우 보안에 문제가 될 수 있지 않나요? Herok setting의 config에 client쪽 key값(apiKey, authDomain, projectId, storageBucket, etc)들을 등록하지 않은 이유가 있으신가요?p.s 좋은 강의 감사드립니다.
-
미해결비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
중복 아이디 및 닉네임 검사
안녕하세요 강사님!강의 너무 잘 들었습니당ㅎㅎ우여곡절이 많아서 질문을 올릴까 말까 고민한 적도 많았지만 숱한 구글링 끝에 스스로 오류를 다 잡고 끝내서 더 뿌듯한 것 같아요.역시 개발을 하고자 했으면 구글링은 필수!! 하지만 강의 내에서 다루지 않았던 회원 가입시 중복 아이디 검사에서는 무너져내렸습니다.제가 이 기능을 구현하고자 생각했던 것은회원가입시 입력한 아이디가 DB내에 존재하면 isSuccess : false회원가입시 입력한 닉네임이 DB내에 존재하면 isSuccess : false입니다. 하지만 계속 중복 아이디, 중복 닉네임으로의 가입이 성공하더라고요..간단하다고 생각했는데 어떤 부분이 부족한 건지 잘 모르겠습니다. 살짝씩 수정은 있었지만 시도해본 노력의 전체적인 틀은 아래 첨부한 코드와 같습니다.(원본 코드는 아니고 구현하고자 하는 부분만 긁어왔습니다! 첨부한 컨트롤러 부분의 코드는 강사님이 최종 배포하셨던 indexController.js파일의 106번째 줄에 삽입했었습니다.😢) - 아 래 - // 컨트롤러 // DB 회원 검증(중복 아이디 확인) const {ccID} = req.body.userID; const [chkID] = await indexDao.checkID(connection, userID); if(chkID.includes(ccID)) { return res.send({ isSuccess : false, code : 400, // 요청 실패시 400번대 코드 message : "이미 존재하는 아이디입니다.", }); } // DB 회원 검증(중복 닉네임 확인) const {ccNn} = req.body.nickname; const [chkNick] = await indexDao.checkNick(connection, nickname); if(chkNick.includes({ccNn})) { return res.send({ isSuccess : false, code : 400, // 요청 실패시 400번대 코드 message : "이미 존재하는 닉네임입니다.", }); }// 다오 // DB 회원 검증(중복 아이디 확인) exports.checkID = async function (connection, userID) { const Query = `SELECT userID FROM Users WHERE userID = ? AND status = 'A';`; const Params = [userID]; const rows = await connection.query(Query, Params); return rows; }; // DB 회원 검증(중복 닉네임 확인) exports.checkNick = async function (connection, nickname) { const Query = `SELECT nickname FROM Users WHERE nickname = ? AND status = 'A';`; const Params = [nickname]; const rows = await connection.query(Query, Params); return rows; }; 답변에 미리 감사드립니다!😊
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
CSR이 Ajax라고 생각하면
결국 CSR이 Ajax라고 생각하면 되는 걸까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
the `strictQuery` option 에러나시는분들
mongoose 변수 생성후이렇게 적어주시고 밑에 커넥션 적어주시면 에러 사라지네용 ㅎㅎ..mongoose.set('strictQuery', true);
-
해결됨홍정모의 따라하며 배우는 C++
네임스페이스 유무의 차이가 궁금합니다!
위의 코드에서는 17이 나오는데MyNumber2라는 namespace를 없애면 main함수에서 using namespace MyNumber1;을 해도 stillOne이 중복된다고 뜹니다. 왜 이런 건지 알 수 있을까요? 혹시 둘 다 int로 매개변수가 같아서 그런 건가요?만약 그렇다면 왜 매개변수가 같으면 안 되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
유효성 검증 위치 관련 질문
안녕하세요. 로드맵 수강하고 토이 프로젝트 진행 중인데 궁금한 점이 계속 나오네요..일반적으로 사용하는 표현 - 비즈니스 - 도메인 계층 구조에서 비즈니스 정책을 검증하는 위치와 관련해서 질문 드립니다.예를 들어 사용자용 게시글 삭제 API는 현재 요청 사용자가 게시글의 작성자가 맞는지 검사합니다. 이 검증 작업을 서비스 계층에서 처리했습니다.public class PostService { private final PostRepository postRepository; // 게시글 삭제 기능 public void deletePost(Long postId, Long currentMemberId) { // 엔티티 조회 후 게시글 작성자가 현재 요청 사용자( currentMemberId )와 일치하는지 검사 Post post = postRepository.findById(postId); if (!post.getWriter().getId().equals(currentMemberId)) { // 작성자가 아니면 예외 발생 } post.delete(); } }이 메서드를 사용자 API 컨트롤러에서는 잘 사용했는데, 관리자 API는 게시글 작성자 검증이 필요 없다는게 문제였습니다. 사용자 및 관리자용 API 컨트롤러에서 호출하는 것은 결국 '게시글 삭제'라는 동일한 기능이므로 하나의 서비스 클래스에서 제공하는 게 맞다 판단하여 deletePost() 메서드에서 수행하던 유효성 검증 로직을 사용자 API 컨트롤러로 이관했습니다.public class PostController { private final PostService postService; // 실제 코드는 아니며 설명용 코드입니다. // 예를 들어 currentMemberId의 경우 실제론 @AuthenticationPrincipal 등을 통해 얻습니다. @DeleteMapping("/{postId}") public void delete(Long currentMemberId, @PathVariable Long postId) { Post post = postService.findPost(postId); if (!post.getWriter().getId().equals(currentMemberId)) { // 작성자가 아니면 예외 발생 } postService.deletePost(postId); } }이렇게 구성하니 PostService를 사용자 API 컨트롤러에서도, 관리자 API 컨트롤러에서도 사용 가능했지만.. 표현 계층에서 비즈니스 정책을 검증하니 구조가 이상한 것 같아서 질문 드립니다.'게시글을 삭제하려는 사용자가 게시글의 작성자인가?'를 확인하는 작업은 비즈니스 정책에 의한 작업이라 생각합니다. 그러므로 서비스 계층에서 검사하는 게 맞다 생각되는데, 관리자 API에서 사용하기 불편하더라구요. 이런 경우 구조를 어떻게 가져가시나요?PostService는 비즈니스 로직만 처리하고, PostUserService 같은 래퍼 서비스를 만들어 검증 부분을 처리할까 했는데, 썩.. 맘에 들진 않았습니다.예시처럼 정책 검증을 컨트롤러에서 수행한다 가정하면, 제 코드의 경우 PostService.findPost() 메서드에 @Transactional(readOnly=true)를 적용한 상태라 deletePost() 메서드에서 SELECT 쿼리를 또 실행합니다.@Transactional(readOnly=true)은 정말 필요한 곳에만 선택적으로 적용하시나요? 아니면 읽기 전용 메서드는 별도로 구분하시나요?'서비스는 최대한 비즈니스 로직만 수행하고, 정책 유효성 검증은 다른 위치에서 진행하는 것이 좋다'라는 분들도 있던데, 보통 어떤 식으로 처리하시나요?
-
미해결15일간의 빅데이터 파일럿 프로젝트
Subject 2 테이블
이렇게 작업은 오류가 없이 완료가 되었는데 Subject1을 할 때는 테이블에 데이터가 잘 담겼는데 Subject2 workflow는 테이블에 데이터가 담기지가 않네요..ㅠㅠ 뭐가 문제인거죠? 워크 플로우랑 테이블 지우고 다시 해보기를 4번 정도 더 해봤는데도 계속 결과가 같네요...
-
해결됨비전공자를 위한 개발자 취업 올인원 가이드 [통합편]
비전공자 입문자 공부 방향성 피드백 부탁드려요!
안녕하세요! 한정수 개발자님!해당 강의를 통해 많은 도움을 받고 추가적으로 궁금한 점이 있어서 질문을 드리게 되었습니다!!저는 비전공자로서 지금 막 개발자가 되기로 마음 먹은 입문자입니다.1년 안에 좋은 기업의 백엔드 개발자로 입사하겠다는 목표를 가지고 있고 그 목표를 향해서 열심히 달려갈 준비도 되어있습니다. 그런데 공부 방향성이 맞는지 잘 모르겠어서 피드백을 부탁 드리고 싶습니다!1>공부 계획 순서자바의 정석(서적+유튜브 인강)자바를 바탕으로 자료구조와 알고리즘 공부 + 스프링 공부(인프런 인강)CS지식(컴퓨터구조, 운영체제, 데이터베이스,네트워크)일단 독학으로 위의 과정을 한 바퀴 돌린 후 기본 지식을 쌓고 스터디를 통해 심화적인 학습을 할 예정입니다.위의 공부 계획 순서에 있어서 수정했으면 하는 부분이 있으면 피드백 부탁드려요!또한 자료구조와 알고리즘 공부로 엔지니어 대한민국 유튜브 강의를 추천해주셨는데 강의 말고 같이 공부하기 좋은 책 추천 부탁드립니다! 2>코딩테스트를 볼 때 아무리 백엔드라도 자바보다 파이썬이 유리하다는 이야기가 있던데 이 부분에 대해서 어떻게 생각하시나요? (자바를 잘 다룰 줄 아는 분들도 코테만큼은 파이썬으로 봐서 대기업에 합격했다는 후기가 있더라고요)파이썬도 같이 공부를 하는 게 좋을까요? 3>아무래도 비전공자라 주변에 개발자가 없으니 프로젝트 경험을 어떻게 쌓아야 할지 막막합니다. 이 부분은 따로 스터디를 통해서 커버가 되는 부분인지 아니면 학원을 다녀야 하는 부분인지 궁금합니다.
-
미해결실전 프로젝트로 배우는 타입스크립트
추후 강의에 관한 질문
안녕하세요.현재 인프런 강의 만드신거 대부분 다 잘 들었는데요.추후에 혹시 vue3 or Nodejs 관련 강의 나올 예정이 있을까요?나온다면 언제쯤 나올까요?
-
미해결홍정모의 따라하며 배우는 C++
8.15 코드 중 using 질문 있습니다!
전 강의에서 배웠던 using 들은using namespace std; 이거나using std::cout 였는데8.15 class Timer에서using clock_t = std :: chrono :: high_resolution_clock;에 나오는 using은 어떤 역할인가요?int, string 같은 타입 대신 써주는..? 모르겠네용..
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿이 컨트롤러 전반적인 역할이라고 보면 되나요 ??
컨트롤러역할 == 서블릿이담당 인가요 ??컨트롤러 자체를 서블릿이라고 봐도 될까용 이 둘 사이의 관계가 궁금합니다
-
미해결타입스크립트 입문 - 기초부터 실전까지
tsconfig.json 에러
안녕하세요 선생님tsconfig.json을 수동으로 생성해보고tsc --init 으로 설치해봤는데자꾸 하단의 에러가 뜹니다 왜그럴까요 ㅠㅠ?찾아보니 target의 문제 같은데 es6일 땐 에러가 안뜨고es5 이하부턴 저렇게 에러가 뜹니다 ㅠ 구글링을 해도 알 수가 없어서 문의 드립니다 ㅠㅠ 죄송해요,,
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
request-body-json-v4 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]HttpEntity는 HTTP 메시지를 편하게 조회할 수 있게 해준다고 알고 있습니다.httpEntity.getBody()바디 내용을 조회한 다음 HttpMessageConverter가 HelloData의 객체로 변경해줬다고 생각하는게 제대로 이해한게 맞나여?
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
php container 설정에 질문있습니다.
[PHP-FPM 지원을 위한 Proxy 서버 구축하기][5:37]php 컨테이너 depends_on에 nginx가 있어야 하는 다른 이유가 있는지 궁금합니다. docker logs webserver를 하면 아래와 같은 오류가 발생하네요. 실행하는데에는 문제 없더라구요.php 컨테이너 depends_on 옵션을 지우고,nginx 컨테이너에서 php를 depends_on 하는게 맞다고 생각합니다. 위와 같은 오류는 사라졌네요강의 완강했습니다. 좋은 강의 감사합니다.
-
미해결배달앱 클론코딩 [with React Native]
redux state에 push
리액트에 state값을 변경할때 직접 수정하면 감지하지 못한다고 알고 있었는데 (ex. state.count = 10) push 같은 행위는 상관 없는 걸까요? 아니면 애초에 잘못된 정보 였을까요?
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
[15장] read cycle
- 강의 내용외의 개인 질문은 받지 않아요 (개별 과제, 고민 상담 등..)- 저 포함, 다른 수강생 분들이 함께보는 공간입니다. 보기좋게 남겨주시면 좋은 QnA 문화가 될 것 같아요. (글쓰기는 현업에서 중요한 능력입니다!)- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.1cycle delay가 왜 미반영 되는지 모르겠어서 질문드려요.감사합니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
매개변수 인식문제
[제로초 강좌 질문 필독 사항입니다]질문에는 여러분에게 도움이 되는 질문과 도움이 되지 않는 질문이 있습니다.도움이 되는 질문을 하는 방법을 알려드립니다.https://www.youtube.com/watch?v=PUKOWrOuC0c0. 숫자 0부터 시작한 이유는 1보다 더 중요한 것이기 때문입니다. 에러가 났을 때 해결을 하는 게 중요한 게 아닙니다. 왜 여러분은 해결을 못 하고 저는 해결을 하는지, 어디서 힌트를 얻은 것이고 어떻게 해결한 건지 그걸 알아가셔야 합니다. 그렇지 못한 질문은 무의미한 질문입니다.1. 에러 메시지를 올리기 전에 반드시 스스로 번역을 해야 합니다. 번역기 요즘 잘 되어 있습니다. 에러 메시지가 에러 해결 단서의 90%를 차지합니다. 한글로 번역만 해도 대부분 풀립니다. 그냥 에러메시지를 올리고(심지어 안 올리는 분도 있습니다. 저는 독심술사가 아닙니다) 해결해달라고 하시면 아무런 도움이 안 됩니다.2. 에러 메시지를 잘라서 올리지 않아야 합니다. 입문자일수록 에러메시지에서 어떤 부분이 가장 중요한 부분인지 모르실 겁니다. 그러니 통째로 올리셔야 합니다.3. 코드도 같이 올려주세요. 다만 코드 전체를 다 올리거나, 깃헙 주소만 띡 던지지는 마세요. 여러분이 "가장" 의심스럽다고 생각하는 코드를 올려주세요.4. 이 강좌를 바탕으로 여러분이 응용을 해보다가 막히는 부분, 여러 개의 선택지 중에서 조언이 필요한 부분, 제 경험이 궁금한 부분에 대한 질문은 대환영입니다. 다만 여러분의 회사 일은 질문하지 마세요.5. 강좌 하나 끝날 때마다 남의 질문들을 읽어보세요. 여러분이 곧 만나게 될 에러들입니다.6. 위에 적은 내용을 명심하지 않으시면 백날 강좌를 봐도(제 강좌가 아니더라도) 실력이 늘지 않고 그냥 코딩쇼 관람 및 한컴타자연습을 한 셈이 될 겁니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Querydsl 프로젝트의 IntelliJ IDEA 빌드 필요성
안녕하세요. 강의 항상 잘 듣고 있습니다. 강사님이 항상 빌드 도구를 Gradle에서 IntelliJ IDEA로 변경하는 것이 좋다고 말씀하신 점은 알고 있어이번 기회에 찾아보니 증분 빌드를 사용해서 변경되는 부분에 대해서만 빌드를 진행하여 빠르다고 하는 것을 알게 되었습니다. Querydsl 설정에서 Gradle로 빌드시 의존성만 추가하면 쉽게 사용 가능하지만 IntelliJ IDEA로 빌드시 build 폴더 하위에 생성되는 것이 아니기에 아래와 같은 3가지 추가 설정이 필요한데요.clean 명령어 작업 추가clean { delete file('src/main/generated') }.gitignore 추가/src/main/generated/main 실행 또는 프로젝트 빌드Build > Build Project강의 내용을 좀 벗어나는 질문인 것 같기는 하지만 무조건적으로 사용할 필요가 있나?라는 의문이 들었습니다. 이전에 실전! Querydsl 강의에서는 com.ewerk.gradle.plugins.querydsl 플러그인을 사용하였는데 src/main/generated 하위가 아니라 똑같이 build 하위에 생성되어서 이런 고민을 못해본 것 같습니다! 감사합니다.