inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

Spring Boot 를 이용해 JWT + Social 로그인 처리 질문 있습니다.

미해결

스프링 시큐리티 OAuth2

안녕하세요. 우선 좋은 강의 제공 해주셔서 감사드립니다 :) 이번에 회사에서 신규 프로젝트로 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 을 노출 해서는 안되다는 점 제한으로 이러저런 구성하는데 힘이 좀 들었습니다 한번 선생님에게 제가 구상한 프로세스를 피드백 받고 싶어 이렇게 질문 드립니다. 항상 소중한 강의 제공해주셔서 감사드리고 답변 부탁드립니다. 감사합니다 :)

  • spring-boot
  • oauth
  • spring
  • java
리나 댓글 1 좋아요 0 조회수 1896

edit 부분에 질문이 있습니다.

미해결

MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React

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;

  • firebase
  • react
  • nodejs
  • mongodb
  • express
binily 댓글 1 좋아요 1 조회수 401

전체 주석 처리하는 법

미해결

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

안녕하세요. 교수님 강의하실때 블럭을 지정하고 한번에 주석처리를 하시던데 어떻게 하는건지 궁금합니다.

  • C#
이린개발자 댓글 1 좋아요 1 조회수 394

RoutLocatortBuilder

미해결

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

안녕하세요 RouteLocateBuilder에 빨간 줄이 뜨는데 무시하고 해도 되는건가요?

  • Kafka
  • msa
  • architecture
  • spring-boot
  • spring-cloud
  • JPA
fbfbf1 댓글 5 좋아요 2 조회수 1024

source command 자동실행 문제

미해결

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

안녕하세요. 오랜 재시도 끝에 마지막 단계에 도달했습니다. bashrc 를 vi로 열어 source ./tools/Xilinx/Vivado/2020.2/settings64.sh의 script를 적용시켰습니다. 하지만 재부팅 후 vivado &를 입력할 경우 command not found가 반복되고 있는데 경로는 정확하게 지정했다고 생각하는데 어떤 부분이 문제인지 모르겠습니다. 수동으로 source를 입력한 후 vivado 실행은 되는 상태입니다.

  • fpga
  • 임베디드
  • verilog-hdl
ss3499 댓글 1 좋아요 1 조회수 833

Encoding::CompatibilityError 해결 방법

미해결

쉽게 시작하는 쿠버네티스(v1.35)

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 해결하였습니다~

  • compatibilityerror
  • docker
  • kubernetes
김수빈 댓글 1 좋아요 1 조회수 1367

0:56 include import하기

해결됨

파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편

0:56 부분에서 강의를 보면 import를 어디서 할거냐 할 때 3개나 뜨는데 제 컴퓨터에서는 From xml.etree.ElementInclude import include 선지가 이거 하나밖에 안떠요... 그냥 파일 맨 위에 from 장고.urls import include쓸까요?

  • django-channels
  • python
  • django
박찬진 댓글 1 좋아요 0 조회수 277

<header> tag에서의 styling

미해결

따라하며 배우는 리액트 A-Z[19버전 반영]

안녕하세요, banner를 만드는 강의에서 <header> tag를 사용하는데요, className="banner"로 Banner.css에서 정의한 styling을 가져오는 것은 이해했는데, style{{backgroundImage...}} 이부분이 별도로 필요한 이유가 어떤 걸까요? className과 style 항목이 모두 styling을 할 수 있는 거 같은데 역할이 어떻게 구분되는지 궁급합니다

  • tdd
  • react
  • redux
  • typescript
  • Next.js
kwangjin12 댓글 1 좋아요 0 조회수 345

Hello 서블릿 실행 안됨

미해결

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] Hello 서블릿 강의 4분쯤에 실행하는 것이 되지 않습니다. /hello 주소도 안됩니다

  • spring
  • MVC
MJkim 댓글 1 좋아요 0 조회수 482

Error: ENOENT: no such file or directory, 가뜹니다

미해결

MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React

http://localhost:5000 으로 접속하면 Error: ENOENT: no such file or directory, stat 가 뜹니다 왜이럴까요 .. 빌드도 하고 경로도 영상따라 바꿨는데 말이죠 .. esktop\react-comuni\server\client\build\index.html 이경로에 파일이 없다는 뜻같은데 server\client 에서 server를 빼야 되는데 뭐라고 적어야 할까요

  • react
  • mongodb
  • nodejs
  • express
  • firebase
레드 댓글 1 좋아요 1 조회수 1522

301 상태코드 질문드립니다.

미해결

모든 개발자를 위한 HTTP 웹 기본 지식

강의 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 해서 이벤트를 신청해야한다. 이렇게 이해해도될까요 ?

  • http
  • spring
  • network
오리쉐리 댓글 1 좋아요 0 조회수 663

강의 시청 순서 질문 드립니다!

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요. 고생 많으십니다! 현재 저는 스프링 기초 지식이 어느 정도 있는 상태입니다. 헌데, 학원 커리큘럼상 servlet / jsp를 활용하여 먼저 세미 프로젝트를 진행한 다음, 스프링 교육을 통해 파이널 프로젝트를 진행합니다. 그렇기 때문에 servlet / jsp 관련하여 학습이 필요한 상황인데, 스프링 핵심 원리 - 기본편 강의를 완강하지 않고, 스프링 MVC 1편에 jsp / servlet 항목을 먼저 수강해도 큰 지장이 없을까요?

  • MVC
  • spring
  • spring-boot
  • java
댓글 1 좋아요 0 조회수 707

Spring 과 Spring boot 의 차이점이 궁금 합니다,

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

아래 로드맵과 같이 스프링으로 시작하여, 최종적으로는 스프링 부트 강의가 마무리를 하고 있습니다. 명확한 스프링과 스프링 부트의 차이가 있는지 아니면, 같다고 봐야 할지 궁금합니다. 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 스프링 핵심 원리 - 기본편 모든 개발자를 위한 HTTP 웹 기본 지식 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 스프링 DB 1편 - 데이터 접근 핵심 원리 스프링 DB 2편 - 데이터 접근 활용 기술 스프링 핵심 원리 - 고급편 실전! 스프링 부트 출시 예정

  • 스프링부트차이
  • MVC
  • 스프링차이
  • spring-boot
  • spring
  • java
댓글 1 좋아요 1 조회수 1022

2-9. 격자판 최대합

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

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를 사용했기 때문에 한 번에 입력 받고 한 번에 넣어주기 때문에 서로의 반복문 사용법이 다르다고 이해했는데 제가 이해한게 맞을까요? 이상한 질문드려 죄송해요 ㅠㅠ

  • java
  • 코테 준비 같이 해요!
감자도리 댓글 1 좋아요 0 조회수 218

django 온라인 배포

미해결

django를 독학하여 온라인에 배포하고자 시도하는 중입니다. vercel과 netlify 등의 무료 툴을 사용해서 배포를 하고 있는데 로컬 서버에서는 django의 템플릿 문법이 잘 작동하지만 deploy하여 실제 사용 시 {% %} 등의 텍스트로 그대로 출력되어 템플릿 언어로 인식이 되지 않습니다. 현재 데이터베이스는 mysql을 사용하여 aws rds에 배포해두었고 홈페이지를 vercel나 netlify에 배포해두었습니다. 해당 툴에 배포 시 html 파일만 작용해서 템플릿 언어로 인식이 안되는거 같은데 혹시 어떻게 해야 템플릿 언어로 인식을 할까요? 감사합니다.

박희재 댓글 0 좋아요 0 조회수 598

Page 관련 질문

미해결

실전! 스프링 데이터 JPA

영한님, 안녕하세요. 열심히 강의 듣고있는 한 학생입니다! JPA에서 페이징처리를 할 때 Controller에서 Page 자체를 반환타입으로 두어도 되는지, 이를 커스터마이징한 특정 Response를 사용하는 것이 좋은지 고민이 되어 글 남기게 되었습니다. 혹시 둘 중에서 안티 패턴이 있는지, 혹은 실무에서 더 권장하는 방법이 있을지 조언 해주시면 감사하겠습니다! (기존 Page에서 제공하는 것처럼 0부터 시작하는 것을 전제로 했을 때입니다.)

  • JPA
  • java
  • spring-boot
  • spring
jduck1024 댓글 1 좋아요 0 조회수 246

안녕하세요? 수업 자료를 못받았는데요.

미해결

팀 개발을 위한 Git, GitHub 입문

강의를 재미있게 잘 듣고 있습니다. 수업자료를 받고 싶은데요. 이메일 sm1315@naver.com으로 보내주세요.

  • git
  • github
  • 버전관리시스템
Sunmi Kang 댓글 1 좋아요 0 조회수 434

벡터테이블 주소 질문드립니다

미해결

ARM Cortex-M 프로세서 프로그래밍

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. s536_thumb 모드와 폴트사례 1강의 질문드립니다. 영상 1분 43~ 45초 사이에 메모리 덤프에서 플래시 주소를 0X08000000로 검색한 이유가 궁금합니다. 이전 강의 메모리맵 설명에서 VECTOR TABLE은 0X0000(Initial SP value) ~ 0X03FC(IRQ239)까지라고 알고 있었는데 어떤 기법이 적용되서 플래시 상의 벡터테이블 주소가 0x0000에서 0x08000000으로 바뀐건가요?? 항상 좋은 답변 감사드립니다!

  • arm-architecture
  • 임베디드
  • cortex
o00o 댓글 1 좋아요 1 조회수 342

젠킨스 아이템 생성

미해결

Jenkins를 이용한 CI/CD Pipeline 구축

안녕하세요 플러그인을 모두 설치했습니다. 그러나 제 젠킨스에서는 아래와 같은 maven project 항목 자체가 없습니다. ㅠㅠ 어떻게 하면 좋을 까요 플러그인 설치 항목에서 검사를 해도 나오지를 않네요

  • kubernetes
  • ansible
  • jenkins
  • cicd
  • sonarqube
김가을 댓글 2 좋아요 0 조회수 607

인기 태그

인프런 TOP Writers

주간 인기글