묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
edit 부분에 질문이 있습니다.
edit 부분에 질문이 있습니다. 이렇게 수정버튼을 누르면 제목과 내용은 로딩이 되는데 이미지 부분만이 로딩이 안되어서 질문을 드립니다. post js var express = require("express"); var router = express.Router(); const multer = require("multer"); const { Post } = require("../Model/Post.js"); const { Counter } = require("../Model/Counter.js"); const { User } = require("../Model/User.js"); const setUpload = require("../Util/upload.js"); router.post("/submit", (req, res) => { let temp = { title: req.body.title, content: req.body.content, image: req.body.image, }; Counter.findOne({ name: "counter" }) .exec() .then((counter) => { temp.postNum = counter.postNum; User.findOne({ uid: req.body.uid }) .exec() .then((userInfo) => { temp.author = userInfo._id; const CommunityPost = new Post(temp); CommunityPost.save().then((doc) => { Counter.updateOne( { name: "counter" }, { $inc: { postNum: 1 } } ).then(() => { res.status(200).json({ success: true }); }); }); }); }) .catch((err) => { res.status(400).json({ success: false }); }); }); router.post("/list", (req, res) => { let sort = {}; if (req.body.sort === "최신순") { sort.createdAt = -1; } else { //인기순 sort.repleNum = -1; } Post.find({ $or: [ { title: { $regex: req.body.searchTerm } }, { content: { $regex: req.body.searchTerm } }, ], }) .populate("author") .sort(sort) .skip(req.body.skip) // 0, 5 .limit(5) //한번에 찾을 doc 숫자 .exec() .then((doc) => { res.status(200).json({ success: true, postList: doc }); }) .catch((err) => { res.status(400).json({ success: false }); }); }); router.post("/detail", (req, res) => { Post.findOne({ postNum: Number(req.body.postNum) }) .populate("author") .exec() .then((doc) => { res.status(200).json({ success: true, post: doc }); }) .catch((err) => { res.status(400).json({ success: false }); }); }); router.post("/edit", (req, res) => { let temp = { title: req.body.title, content: req.body.content, image: req.body.image, }; Post.updateOne({ postNum: Number(req.body.postNum) }, { $set: temp }) .exec() .then(() => { res.status(200).json({ success: true }); }) .catch((err) => { res.status(400).json({ success: false }); }); }); router.post("/delete", (req, res) => { Post.deleteOne({ postNum: Number(req.body.postNum) }) .exec() .then(() => { res.status(200).json({ success: true }); }) .catch((err) => { res.status(400).json({ success: false }); }); }); /* const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, "image/"); }, filename: function (req, file, cb) { cb(null, `${Date.now()}_${file.originalname}`); }, }); const upload = multer({ storage: storage }).single("file"); router.post("/image/upload", (req, res) => { upload(req, res, (err) => { if (err) { res.status(400).json({ success: false }); } else { res.status(200).json({ success: true, filePath: res.req.file.path }); } }); }); */ router.post( "/image/upload", setUpload("react-community/post"), (req, res, next) => { res.status(200).json({ success: true, filePath: res.req.file.location }); } ); module.exports = router; edit js import React, { useState, useEffect } from "react"; import { useParams } from "react-router-dom"; import axios from "axios"; import ImageUpload from "./ImageUpload.js"; import { useNavigate } from "react-router-dom"; // import { UploadButtonDiv, UploadDiv, UploadForm, } from "../../Style/UploadCSS.js"; function Edit() { let navigate = useNavigate(); let params = useParams(); const [PostInfo, setPostInfo] = useState([]); const [Flag, setFlag] = useState(false); const [Title, setTitle] = useState(""); const [Content, setContent] = useState(""); const [Image, setImage] = useState(""); useEffect(() => { setTitle(PostInfo.title); setContent(PostInfo.content); setImage(PostInfo.image); console.log(PostInfo.image); }, [PostInfo]); useEffect(() => { let body = { postNum: params.postNum, }; axios .post("/api/post/detail", body) .then((response) => { if (response.data.success) { setPostInfo(response.data.post); setFlag(true); } }) .catch((err) => { console.log(err); }); }, []); const onSubmit = (e) => { e.preventDefault(); if (Title === "" || Content === "") { return alert("모든 항목을 채워 주십쇼"); } let body = { title: Title, content: Content, image: Image, postNum: params.postNum, }; axios .post("/api/post/edit", body) .then((response) => { if (response.data.success) { alert("글 수정이 완료되었습니다."); navigate(`/post/${params.postNum}`); } else { alert("글 수정에 실패하였습니다."); } }) .catch((err) => { console.log(err); }); }; return ( <UploadDiv> {Flag && ( <UploadForm> <label htmlFor="label">제목</label> <input id="title" type="text" value={Title} onChange={(e) => { setTitle(e.currentTarget.value); }} /> <ImageUpload setImage={setImage} /> <label htmlFor="content">내용</label> <textarea id="content" value={Content} onChange={(e) => { setContent(e.currentTarget.value); }} /> <UploadButtonDiv> <button className="cancel" onClick={(e) => { e.preventDefault(); navigate(-1); }} > 취소 </button> <button onClick={(e) => { onSubmit(e); }} > 제출 </button> </UploadButtonDiv> </UploadForm> )} </UploadDiv> ); } export default Edit; detail js import React, { useState, useEffect } from "react"; import { Link } from "react-router-dom"; import { useParams, useNavigate } from "react-router-dom"; import axios from "axios"; import Spinner from "react-bootstrap/Spinner"; import { PostDiv, Post, BtnDiv, SpinnerDiv, } from "../../Style/PostDetailCSS.js"; function Detail() { let navigate = useNavigate(); let params = useParams(); const [PostInfo, setPostInfo] = useState([]); const [Flag, setFlag] = useState(false); useEffect(() => { let body = { postNum: params.postNum, }; axios .post("/api/post/detail", body) .then((response) => { console.log(response); if (response.data.success) { setPostInfo(response.data.post); setFlag(true); } }) .catch((err) => { console.log(err); }); }, []); useEffect(() => { console.log(PostInfo); }, [PostInfo]); const DeleteHandler = () => { if (window.confirm("정말로 삭제를 하시겠습니까?")) { let body = { postNum: params.postNum, }; axios .post("/api/post/delete", body) .then((response) => { if (response.data.success) { alert("게시글이 삭제 되었습니다."); navigate("/"); } }) .catch((err) => { alert("게시글이 삭제에 실패하였습니다."); }); } }; return ( <PostDiv> {Flag ? ( <> <Post> <h1>{PostInfo.title}</h1> {PostInfo.image ? ( <img src={`http://localhost:5000/${PostInfo.image}`} alt="" style={{ width: "100%", height: "auto" }} /> ) : null} <p>{PostInfo.content}</p> </Post> <BtnDiv> <Link to={`/edit/${PostInfo.postNum}`}> <button className="edit">수정</button> </Link> <button className="delete" onClick={() => DeleteHandler()}> 삭제 </button> </BtnDiv> </> ) : ( <SpinnerDiv> <Spinner animation="border" role="status"> <span className="visually-hidden">Loading...</span> </Spinner> </SpinnerDiv> )} </PostDiv> ); } export default Detail; imageupload import React from "react"; import { Form } from "react-bootstrap"; import axios from "axios"; function ImageUpload(props) { const FileUpload = (e) => { var formData = new FormData(); formData.append("file", e.target.files[0]); axios.post("/api/post/image/upload", formData).then((response) => { props.setImage(response.data.filePath); }); }; return ( <div> <Form.Control type="file" className="shadow-none" accept="image/*" onChange={(e) => FileUpload(e)} /> </div> ); } export default ImageUpload; upload js import React, { useState, useEffect } from "react"; import ImageUpload from "./ImageUpload.js"; import { UploadButtonDiv, UploadDiv, UploadForm, } from "../../Style/UploadCSS.js"; import axios from "axios"; import { useNavigate } from "react-router-dom"; function Upload(props) { const [Title, setTitle] = useState(""); const [Content, setContent] = useState(""); const [Image, setImage] = useState(""); let navigate = useNavigate(); const onSubmit = (e) => { e.preventDefault(); if (Title === "" || Content === "") { return alert("모든 항목을 채워 주십쇼"); } let body = { title: Title, content: Content, image: Image, }; axios .post("api/post/submit", body) .then((response) => { console.log(response); if (response.data.success) { alert("글 작성이 완료되었습니다."); navigate("/"); } else { alert("글 작성에 실패하였습니다."); } }) .catch((err) => { console.log(err); }); }; return ( <UploadDiv> <UploadForm> <label htmlFor="label">제목</label> <input id="title" type="text" value={Title} onChange={(e) => { setTitle(e.currentTarget.value); }} /> <ImageUpload setImage={setImage} /> <label htmlFor="content">내용</label> <textarea id="content" value={Content} onChange={(e) => { setContent(e.currentTarget.value); }} /> <UploadButtonDiv> <button button onClick={(e) => { onSubmit(e); }} > 제출 </button> </UploadButtonDiv> </UploadForm> </UploadDiv> ); } export default Upload;
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
전체 주석 처리하는 법
안녕하세요.교수님 강의하실때 블럭을 지정하고 한번에 주석처리를 하시던데 어떻게 하는건지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
RoutLocatortBuilder
안녕하세요 RouteLocateBuilder에 빨간 줄이 뜨는데무시하고 해도 되는건가요?
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
source command 자동실행 문제
안녕하세요. 오랜 재시도 끝에 마지막 단계에 도달했습니다.bashrc 를 vi로 열어 source ./tools/Xilinx/Vivado/2020.2/settings64.sh의 script를 적용시켰습니다.하지만 재부팅 후 vivado &를 입력할 경우 command not found가 반복되고 있는데경로는 정확하게 지정했다고 생각하는데 어떤 부분이 문제인지 모르겠습니다.수동으로 source를 입력한 후 vivado 실행은 되는 상태입니다.
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
Encoding::CompatibilityError 해결 방법
C:/HashiCorp/Vagrant/embedded/gems/2.3.4/gems/childprocess-4.1.0/lib/childprocess/windows/process_builder.rb:48:in `join': incompatible character encodings: CP949 and UTF-8 (Encoding::CompatibilityError)Windows 사용자 계정이 한글이라 발생하는 오류 같습니다.환경 변수를 조금 건드려봤는데 안됩니다..어떻게 해결하면 될까요?https://leaderksb.tistory.com/29해결하였습니다~
-
해결됨파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
0:56 include import하기
0:56 부분에서 강의를 보면 import를 어디서 할거냐 할 때 3개나 뜨는데제 컴퓨터에서는 From xml.etree.ElementInclude import include선지가 이거 하나밖에 안떠요...그냥 파일 맨 위에 from 장고.urls import include쓸까요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
<header> tag에서의 styling
안녕하세요, banner를 만드는 강의에서<header> tag를 사용하는데요,className="banner"로 Banner.css에서 정의한 styling을 가져오는 것은 이해했는데,style{{backgroundImage...}} 이부분이 별도로 필요한 이유가 어떤 걸까요?className과 style 항목이 모두 styling을 할 수 있는 거 같은데 역할이 어떻게 구분되는지 궁급합니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Hello 서블릿 실행 안됨
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예 [질문 내용]Hello 서블릿 강의 4분쯤에 실행하는 것이 되지 않습니다. /hello 주소도 안됩니다
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
Error: ENOENT: no such file or directory, 가뜹니다
http://localhost:5000 으로 접속하면Error: ENOENT: no such file or directory, stat가 뜹니다 왜이럴까요 .. 빌드도 하고 경로도 영상따라 바꿨는데 말이죠 .. esktop\react-comuni\server\client\build\index.html이경로에 파일이 없다는 뜻같은데server\client 에서 server를 빼야 되는데 뭐라고 적어야 할까요
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
301 상태코드 질문드립니다.
강의 6분5초의 강의자료에 대해 구글링 및 강의를 들으며 정리해 봤는데,이 예제는 이벤트신청폼(GET/ event)과 이벤트신청(POST/ event)의 URI를 동일하게하고 이벤트신청폼을 Get/ event 를 통해 들어와있는 상태에서 URI가 변경되었고 이 때 POST/ event 를 한다는 가정하에 보는것이다.POST /event 를 하게되면 /event 가 /new-event 로 변경 되었기때문에 301상태코드를 보내고, 변경된 URI에 대해 리다이렉트 되어 GET/ new-event 를해서 이벤트신청폼을 조회하고, 다시 POST/ new-event 해서 이벤트를 신청해야한다.이렇게 이해해도될까요 ?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 시청 순서 질문 드립니다!
안녕하세요. 고생 많으십니다!현재 저는 스프링 기초 지식이 어느 정도 있는 상태입니다.헌데, 학원 커리큘럼상 servlet / jsp를 활용하여 먼저 세미 프로젝트를 진행한 다음, 스프링 교육을 통해 파이널 프로젝트를 진행합니다.그렇기 때문에 servlet / jsp 관련하여 학습이 필요한 상황인데, 스프링 핵심 원리 - 기본편 강의를 완강하지 않고, 스프링 MVC 1편에 jsp / servlet 항목을 먼저 수강해도 큰 지장이 없을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Spring 과 Spring boot 의 차이점이 궁금 합니다,
아래 로드맵과 같이 스프링으로 시작하여, 최종적으로는 스프링 부트 강의가 마무리를 하고 있습니다.명확한 스프링과 스프링 부트의 차이가 있는지 아니면, 같다고 봐야 할지 궁금합니다. 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 스프링 핵심 원리 - 기본편모든 개발자를 위한 HTTP 웹 기본 지식스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술스프링 MVC 2편 - 백엔드 웹 개발 활용 기술스프링 DB 1편 - 데이터 접근 핵심 원리스프링 DB 2편 - 데이터 접근 활용 기술스프링 핵심 원리 - 고급편실전! 스프링 부트 출시 예정
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
2-9. 격자판 최대합
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main{ public int solution(int n, int[][] arr) { int answer = Integer.MIN_VALUE; // 최대값을 찾아야 하므로 MIN_VALUE; 사용 int sum1; // 행의 합 int sum2; // 열의 합 for (int i = 0; i < n; i++) { sum1 = sum2 = 0; // 0행 0열 부터 구하기 위해 초기화 for (int j = 0; j < n; j++) { sum1 += arr[i][j]; sum2 += arr[j][i]; } // 행과 열의 최댓값 answer = Math.max(answer, sum1); // 각 행과 각 열의 계산 후 answer = Math.max(answer, sum2); // 더 큰 값이 answer로 들어감 } sum1 = sum2 = 0; for (int i = 0; i < n; i++) { sum1 += arr[i][i]; sum2 += arr[i][n - i - 1]; } answer = Math.max(answer, sum1); answer = Math.max(answer, sum2); return answer; } public static void main(String[] args) throws NumberFormatException, IOException { MainT = new Main(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringTokenizer st; int[][] arr = new int[n][n]; for (int i = 0; i < n; i++) { st = new StringTokenizer(br.readLine(), " "); for (int j = 0; j < n; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } System.out.println(T.solution(n, arr)); } }안녕하세요 선생님 2.9에서 Main 메소드 부분에서 저는 BufferedReader를 사용했는데요 선생님께선 이중 for문을 사용하여 그 안에 scanner Int 를 사용하셨는데for(int i = 0; i < n; i++) { for(int j = 0; j <n; j++){ arr[i][j] = kb.nextInt(); } }이 것과 bufferedReader의 차이점은 nextInt()는 입력 즉시 배열의 인덱스에 넣어주는 것이고BufferedReader는 StringTokenizer를 사용했기 때문에 한 번에 입력 받고 한 번에 넣어주기 때문에 서로의 반복문 사용법이 다르다고 이해했는데 제가 이해한게 맞을까요? 이상한 질문드려 죄송해요 ㅠㅠ
-
미해결
django 온라인 배포
django를 독학하여 온라인에 배포하고자 시도하는 중입니다.vercel과 netlify 등의 무료 툴을 사용해서 배포를 하고 있는데로컬 서버에서는 django의 템플릿 문법이 잘 작동하지만 deploy하여실제 사용 시 {% %} 등의 텍스트로 그대로 출력되어 템플릿 언어로 인식이 되지 않습니다. 현재 데이터베이스는 mysql을 사용하여 aws rds에 배포해두었고 홈페이지를 vercel나 netlify에 배포해두었습니다. 해당 툴에 배포 시 html 파일만 작용해서 템플릿 언어로 인식이 안되는거 같은데 혹시 어떻게 해야 템플릿 언어로 인식을 할까요? 감사합니다.
-
미해결초보를 위한 쿠버네티스 안내서
강사님 터미널 설정 따라하고 싶습니다.
강사님 블로그 글이 있어서 자답합니다.ㅎㅎ
-
미해결실전! 스프링 데이터 JPA
Page 관련 질문
영한님, 안녕하세요. 열심히 강의 듣고있는 한 학생입니다!JPA에서 페이징처리를 할 때 Controller에서 Page 자체를 반환타입으로 두어도 되는지, 이를 커스터마이징한 특정 Response를 사용하는 것이 좋은지 고민이 되어 글 남기게 되었습니다. 혹시 둘 중에서 안티 패턴이 있는지, 혹은 실무에서 더 권장하는 방법이 있을지 조언 해주시면 감사하겠습니다!(기존 Page에서 제공하는 것처럼 0부터 시작하는 것을 전제로 했을 때입니다.)
-
미해결팀 개발을 위한 Git, GitHub 입문
안녕하세요? 수업 자료를 못받았는데요.
강의를 재미있게 잘 듣고 있습니다.수업자료를 받고 싶은데요. 이메일 sm1315@naver.com으로 보내주세요.
-
미해결ARM Cortex-M 프로세서 프로그래밍
벡터테이블 주소 질문드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요.s536_thumb 모드와 폴트사례 1강의 질문드립니다.영상 1분 43~ 45초 사이에 메모리 덤프에서플래시 주소를 0X08000000로 검색한 이유가 궁금합니다.이전 강의 메모리맵 설명에서 VECTOR TABLE은 0X0000(Initial SP value) ~ 0X03FC(IRQ239)까지라고 알고 있었는데 어떤 기법이 적용되서 플래시 상의 벡터테이블 주소가 0x0000에서 0x08000000으로 바뀐건가요?? 항상 좋은 답변 감사드립니다!
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
젠킨스 아이템 생성
안녕하세요 플러그인을 모두 설치했습니다.그러나 제 젠킨스에서는 아래와 같은 maven project 항목 자체가 없습니다. ㅠㅠ어떻게 하면 좋을 까요 플러그인 설치 항목에서 검사를 해도 나오지를 않네요
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
제 젠킨스에서는 Maven project 항목 자체가 없습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.