묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
RUN 과 ENTRYPOINT 의 차이점이 궁금합니다!
안녕하십니까 강사님!좋은 강의 감사합니다!ENTRYPOINT와 RUN 모두 내부 콘솔에서 명령을 주는 옵션인데 어떨때는 RUN을 쓰고 어떨때는 ENTRYPOINT를 사용하는지 궁금합니다!감사합니다!
-
미해결스프링 시큐리티 OAuth2
Spring Boot 를 이용해 JWT + Social 로그인 처리 질문 있습니다.
안녕하세요. 우선 좋은 강의 제공 해주셔서 감사드립니다 :) 이번에 회사에서 신규 프로젝트로Client Server (Vue, React, Android, IOS)Back Server (Spring Boot)해당 언어로 구성하기로 결정 되었습니다. 신규 프로젝트에 있어서 가장 중요한 부분이 인증 및 인가 시스템인데요.여기서 우리는 JWT + Spring Security 를 사용하기로 결정되었고특히 Social Login 경우 Grant Type 을 "Authorization Code Grant Type" 을 이용하기로 했습니다.아무래도 Authorization Code Grant Type 이 가장 안전하기 때문 입니다. 앞써 말씀드렸지만 Client Server 를 vue, react, Android, ois 를 이용 계획이고Authorization Code Grant Type 을 동시에 이용하면서 인증 처리 할 예정인데요. 인증이 성공적으로 완료된다면 자체적으로 JWT 토큰을 생성해서 Access Token 을 만들고 Client 서버 에게 반환 해서 반환 받은 Client 서버들을 Resouce Server 에서 자원을 요청 하는 시스템입니다. 우선 이미지를 보면서 시나리오를 설명 드리도록 하겠습니다. 일반 로그인A 사용자가 아이디 하고 패스워드를 입력 후 Authorization Server(Spring Boot) 로 전송한다. 인증 처리가 완료 되면 A 사용자 그러니깐 Client 서버에게 자체적으로 JWT Token 을 만들어서 Access Token을 전송한다. Client Server 는 자체적으로 만든 JWT Token (Access Token) 을 쿠키에 저장 하고 Resource Server 에 요청 한다. Social 로그인Client 서버 접속한 사용자는 KaKao 소셜 로그인 버튼을 클릭한다. (요청 파라미터는 카카오로 부터 제공 받은 client_id, redirect_uri + response_type 을 'code' 로 지정한다.) KaKao Authorization Server 는 요청 받은 파라미터로 Client 식별하고 사용자에게 kakao 로그인 페이지를 보여드린다. 생략 되었지만 인가 처리되었다면 임시 코드값을 지정한 redirect uri 통해 client server 로 전송한다. 임시 코드를 받은 Client Server 는 자체적으로 구축한 Authorization Server(Spring Boot) 로 전송한다. 임시 코드를 전송 받은 데이터와 client_id, client_secret, response_type 함께 KaKao Authorization Server 로 요청한다 (Access Token 받기 위해) 인증이 완료되면 KaKao Authorization Server 는 Authorization Server(Spring Boot) 로 인가처리가 완료되었음을 의미하는 Access Token 만들어 전송한다. Access Token 을 발급 받은 Authorization Server(Spring Boot) 서버는 해당 Access Token 을 이용해서 인증 처리하기 위해 KaKao Authorization Server 로 요청한다. 인증 처리 완료되었다면 해당 접속자의 유저 정보를 전송 한다. 해당 유저 정보를 이용해서 회원 가입 프로세스 처리 동시에 자체적으로 JWT Token (Resource Server 접근 하기 위한) 을 생성해서 Client Server에 반환 한다. Client Server 는 자체적으로 만든 JWT Token (Access Token) 을 쿠키에 저장 하고 Resource Server 에 요청 한다. 선생님 강의에서는 Client Server 경우 Spring Boot Security 을 이용했던거와 달리클라이언트 서버 경우 Vue, React, Android, IOS 사용 할려고 합니다.그리고 Grant Type 을 "Authorization Code Grant Type" 사용 하기 때문에 일반 로그인 경우는 문제가 없는데Social 로그인 경우 프로세스를 어떻게 하면 잘 구성 될지 제 나름대로 고민을 해보았습니다. Implicit Grant Type 경우를 사용하면 쉽게 처리 할 수 있을것 같은데Grant Type 을 "Authorization Code Grant Type" 사용 할려다 보니 많이 복잡해지고 이렇게 작동이 될지 의문도 들고 이런 저런 생각이 드네요. 또한 Client Server 경우 절대로 client_secret 을 노출 해서는 안되다는 점 제한으로 이러저런 구성하는데 힘이 좀 들었습니다한번 선생님에게 제가 구상한 프로세스를 피드백 받고 싶어 이렇게 질문 드립니다. 항상 소중한 강의 제공해주셔서 감사드리고 답변 부탁드립니다. 감사합니다 :)
-
미해결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으로 바뀐건가요?? 항상 좋은 답변 감사드립니다!