묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨코드로 배우는 React 19 with 스프링부트 API서버
todo list 검색 기능 문의
todo list 에서 검색어를 입력하여 검색된 결과를 화면에 출력하려면 어떻게 구현해야 하는지요?예제에는 이런 것이 없는 거 같은데 제가 대충봐서 잘못 이해하고 있는 건가요?전체적인 흐름으로 설명해주시면 감사하겠습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
JWT와 @PreAuthorize 사용하기에서 권한오류
동영상 강의에 있는 내용대로 ProductController에서 @GetMapping("/list")에 @PreAuthorize("hasAnyRole('ROLE_USER','ROLE_ADMIN')")를 작성하고나서 postman에 login 후 accessToken을 가져와서 get방식으로 토큰을 넣어서 입력하면 status : 500, "error": Interner Server Error가 뜹니다.. @PreAuthorize부분을 주석처리하고 실행해보면 list값이 잘 나오네요.. 어디부분이 잘못 된걸까요?? 참고로 CustomSecurityConfig클래스에 @EnableMethodSecurity추가도 했습니다.@PreAuthorize("hasAnyRole('ROLE_USER','ROLE_ADMIN')") @GetMapping("/list") public PageResponseDTO<ProductDTO> list(PageRequestDTO pageRequestDTO){ return productService.getList(pageRequestDTO); } 여기가 ProductController 클래스 package org.zerock.apiserver.security.filter; import com.google.gson.Gson; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.log4j.Log4j2; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.OncePerRequestFilter; import org.zerock.apiserver.dto.MemberDTO; import org.zerock.apiserver.util.JWTUtil; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Map; @Log4j2 public class JWTCheckFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { //true == not check String path = request.getRequestURI(); log.info("------check uri---------"+path); if(path.startsWith("/api/member/")){ return true; } //false == check return false; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { log.info("----------------------"); log.info("----------------------"); log.info("----------------------"); String autoHeaderStr = request.getHeader("Authorization"); //bearer // 7개 후 JWT 문자열 try { String accessToken = autoHeaderStr.substring(7); Map<String, Object> claims = JWTUtil.validateToken(accessToken); log.info("JWT claims: " + claims); // filterChain.doFilter(request, response); String email = (String) claims.get("email"); String pw = (String) claims.get("pw"); String nickname = (String) claims.get("nickname"); Boolean social = (Boolean) claims.get("social"); List<String> roleNames = (List<String>) claims.get("roleNames"); MemberDTO memberDTO = new MemberDTO(email, pw, nickname, social.booleanValue(), roleNames); log.info("---------------------------------"); log.info(memberDTO); log.info(memberDTO.getAuthorities()); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(memberDTO, pw, memberDTO.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authenticationToken); filterChain.doFilter(request, response); }catch(Exception e){ log.error("JWT Check Error --------------------"); log.error(e.getMessage()); Gson gson = new Gson(); String msg = gson.toJson(Map.of("error", "ERROR_ACCESS_TOKEN")); response.setContentType("application/json"); PrintWriter printWriter = response.getWriter(); printWriter.println(msg); printWriter.close(); } //destination filterChain.doFilter(request, response); } } 여기가 JWTCheckFilter부분입니다.
-
해결됨코드로 배우는 React 19 with 스프링부트 API서버
access Token 만료 후 todo/list 접속시도 에러 처리
안녕하세요.access Token 정보 만료 후에 서버에서 보내는 메시지가 401 메시지로 옵니다.그래서인지 jwtUtil.js 파일에서 처리를 못하는 문제가 있는 것이 맞을까요?responseFail 을 아래와 같이 수정하는게 맞는지 무엇을 놓치고 있는 것인지 모르겠습니다.http://localhost:3000/todo/list 를 10분 이상 경과후 실행했을 때 에러 메시지를 출력했었습니다.import axios from "axios"; import {getCookie, setCookie} from "./cookieUtil"; import {API_SERVER_HOST} from "../api/hostApi"; const jwtAxios = axios.create() const refreshJWT = async (accessToken, refreshToken) => { const host = API_SERVER_HOST const header = {headers: {"Authorization": `Bearer ${accessToken}`}} const res = await axios.get(`${host}/api/member/refresh?refreshToken=${refreshToken}`, header) console.log("----------------------") console.log(res.data) return res.data } //before request const beforeReq = (config) => { console.log("before request.............") const memberInfo = getCookie("member") if (!memberInfo) { console.log("Member NOT FOUND") return Promise.reject( { response: { data: {error: "REQUIRE_LOGIN"} } } ) } const {accessToken} = memberInfo // Authorization 헤더 처리 config.headers.Authorization = `Bearer ${accessToken}` return config } //fail request const requestFail = (err) => { console.log("request error............") return Promise.reject(err) } //before return response const beforeRes = async (res) => { console.log("before return response...........") console.log(res) //'ERROR_ACCESS_TOKEN' const data = res.data if (data && data.error === 'ERROR_ACCESS_TOKEN') { const memberCookieValue = getCookie("member") const result = await refreshJWT(memberCookieValue.accessToken, memberCookieValue.refreshToken) console.log("refreshJWT RESULT", result) memberCookieValue.accessToken = result.accessToken memberCookieValue.refreshToken = result.refreshToken setCookie("member", JSON.stringify(memberCookieValue), 1) //원래의 호출 const originalRequest = res.config originalRequest.headers.Authorization = `Bearer ${result.accessToken}` return await axios(originalRequest) } return res } //fail response const responseFail = async (err) => { console.log("response fail error.............") console.log(err) const originalRequest = err.config; // 토큰 만료로 인한 401 응답이라면 → refresh 시도 if ( err.response && err.response.status === 401 && !originalRequest._retry // 무한 루프 방지 ) { originalRequest._retry = true; const memberCookieValue = getCookie("member"); try { const result = await refreshJWT( memberCookieValue.accessToken, memberCookieValue.refreshToken ); // 토큰 저장 memberCookieValue.accessToken = result.accessToken; memberCookieValue.refreshToken = result.refreshToken; setCookie("member", JSON.stringify(memberCookieValue), 1); // 원래 요청 재시도 originalRequest.headers.Authorization = `Bearer ${result.accessToken}`; return await axios(originalRequest); } catch (refreshError) { console.error("Refresh 실패, 로그아웃 처리 필요"); // 로그아웃 로직 연결 가능 localStorage.removeItem("token"); return Promise.reject(refreshError); } } return Promise.reject(err); } jwtAxios.interceptors.request.use(beforeReq, requestFail) jwtAxios.interceptors.response.use(beforeRes, responseFail) export default jwtAxios
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
"업로드 및 배포" 후 에러 메시지가 뜨지 않네요..
교재 561페이지를 따라가면서, 위의 메시지까지 받았습니다. 그리고 나서 10여분이 지났는 데도, 교재에서 얘기하는 것처럼 에러 메시지가 출력되지 않네요. 에러 메시지가 없어도 정상적으로 진행이 된 것인가요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
bootJar가 어디에 있지요?
교재 560페이지에서 "API 서버 프로젝트에서는 Gradle의 'bootJar'를 실행합니다'라고 되어 있는데, bootJar가 어디에 있지요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
해결은 못했습니다만...
거듭된 질문에 한결같이 답변을 해주셔서 감사합니다.교재 9장까지는 문제없이 잘 진행되어서, 10장 부터 새로 작성한, 엔티티, DTO, Repository 싹 다 지우니, 앞서 작성한 테스트는 그나마 제대로 실행이 되는군요. 다시 엔티티부터 하나씩 깔면서, 동시에 테스트를 다시 진행해봐야 겠습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
testInsertByProduct() 와 관련된 에노테이션은 교재하고 똑같이 했고, log.info만 남기고 나머지 코드는 다 지웠는데도, 여전히 Test Failed가 뜨고, testInsertProduct() 메소드로 진입조차 안되는 군요.
testInsertByProduct() 와 관련된 에노테이션은 교재하고 똑같이 했고, log.info만 남기고 나머지 코드는 다 지웠는데도, 여전히 Test Failed가 뜨고, testInsertProduct() 메소드로 진입조차 안되는 군요.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
CartRepositoryTests.java 에서 테스트 실행을 시켰더니 tests failed 가 뜹니다.
교재를 똑같이 따라왔는데, testInsertByProduct()에서 tests failed 메시지가 뜨는 군요.서버코드는 cookie_00@naver.com으로 첨부했습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
testInsertByProduct()에 아예 들어가지를 못하네요...
교재 9장까지 잘 따라왔습니다.10장 장바구니 api 만들기에 들어와서 CartRepository 만들고CartItemRepository를 만들고CartRepositoryTests를 만들었습니다.그리고, testInsertByProduct()를 테스트 하는데,Tests failed 가 나왔습니다.코드 몇 군데에서 로그를 확인해봤는데, configuration 부분은 잘 통과했는데, testInsertByProduct() 메소드로는 진입조차 못하고 있습니다.실습환경은 "인텔리제이" 입니다. 아래 캡쳐는, 에러가 시작되는 경계로 생각되는 부분입니다.질문 내용이, 답변 주시기에 좀 부족하다면, 더 필요한 코드 부분이나, 에러로그를 보충해서 다시 질문에 올리도록 하겠습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
목록(페이징)처리구현 - import package 문의
강의수강중에 Pageable import 관련하여아래와 같은 Pageable을 선택하니까오류가 나오더라구요...type unmatch 형태//import java.awt.print.Pageable; springboot를 사용할 때는아래와 같은 org.springframework의 형태가import 우선순위가 되는것이 맞는건가요?import org.springframework.data.domain.Pageable;
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
spread ... 사용하는 이유가 궁금합니다
안녕하세요?[조회 페이지 이동] 영상을 보고 있는데요.List, Read Component에서는 spread를 하지 않고 바로 set으로 값을 넣었는데Add Component에서는 왜 {...initState}, {...todo}를 하는지 궁금합니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
moveToList 질문 드립니다.
안녕하세요 선생님. 좋은 강의를 정말 잘 듣고 있습니다ㅎㅎ [네비게이션관련 커스텀 훅] 강의에서 궁금한게 생겼는데요~ 쿼리 스트링에 page와 size가 있는데, moveToList에 파라미터로 page와 size를 전달해서 처리해야 하는 이유가 무엇인지 알 수 있을까요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
tailwind 부분 도와주세요
어디를 수정해야 할까요? 지금 계속 다시 해보고 있는데 해결이 되지 않습니다ㅠ앞서 이렇게 했었는데 해결되지 않아 다시 해보고있습니다..! tailwind.config.js 의 content에이렇게 입력하는게 맞나요??index.css에 이렇게 오류가 떠서요 ㅠㅠ-> 우측하단 언어모드를 tailwindCSS로 바꾸면 밑줄은 사라지는데 npm start 실행시이렇게 뜹니다..!
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
tailwind.config.js 의 content
tailwind.config.js 의 content에이렇게 입력하는게 맞나요??index.css에 이렇게 오류가 떠서요 ㅠㅠ-> 우측하단 언어모드를 tailwindCSS로 바꾸면 밑줄은 사라지는데 npm start 실행시 이렇게 뜹니다..!
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
Tailwindcss 설정
npx tailwindcss init 작성시 'tailwind'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. 라고 뜹니다 코드를 다르게 작성해야하나요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
MariaDB 연동시 지속적인 에러
마지막 JDBC 데이터베이스 설정하는 부분까지 했는데도 계속 에러가 나서 찾아보니 mariaDB보다 MySQL이 더 호환이 잘된다고 나와서 MySQL로 변경하려 합니다.그런데 mariaDB와 MySQL 모두 계속 오류가나서 진행이 되지 않네요 ㅠ참고자료로 올려주신 pdf의 25페이지 코드 참고해서 해봐도 되지 않는데 살펴봐야 할 곳이 어디 있을까요?MySQL로 하는 방법도 알려주시면 감사하겠습니다!
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
이거 프로젝트 실행하는 방법을 알수 잇을까여?
spring 실행하는 방법과 이 프로젝트를 실행하는 방법이요
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
안녕하세요 조회기능 구현에서 에러가 발생했습니다
vscode를 통해 npm start를 한 후, todo/read/숫자를 입력하니까 404에러가 발생했습니다. 그런데 vscode에서 컨트롤S를 눌렀더니 화면이 떴는데 익스플로러 상에서 새로고침을 하니까 다시 404에러가 발생하는데 이유를 모르겠습니다. 이미지를 첨부할 테니 혹시 더 필요하신 게 있으시면 답변해 주시면 감사드리겠습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
조회기능 구현 강의에서 에러가 발생했습니다
ReadComponent.js 파일을 만들고 ReadPage의 리턴 내용에 ReadComponent의 tno 값을 추가한 후에 npm start를 실행했는데 아래와 같은 에러가 발생했습니다. [eslint] src\components\menus\todo\ReadComponent.jsLine 13:29: 'useState' is not defined no-undefLine 16:9: 'getOne' is not defined no-undefSearch for the keywords to learn more about each error. ReadComponent.js의 useState와 getOne 로직 부분이 잘못 된 거 같아서 강의 영상을 다시 봤는데 틀린 부분이 없어 보여 어떤 게 문젠지 질문을 드리고 싶습니다.참고용으로 ReadComponent.js의 내용을 추가해놓겠습니다. import React, { useEffect } from 'react'; const initState = { tno:0, title:'', writer:'', dueDate: '', complete: false } function ReadComponent({tno}) { const [todo, setTodo] = useState(initState) useEffect(() => { getOne(tno).then(data => { console.log(data) setTodo(data) }) }, [tno]); return ( <div> </div> ); } export default ReadComponent;덧붙여서 툴은 vscode를 쓰고 있습니다. 잘 부탁드리겠습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
tailwind CSS 적용에서 알수없는 오류
added 153 packages, and audited 154 packages in 2s 32 packages are looking for funding run `npm fund` for details found 0 vulnerabilities leeman01@idong-geon-ui-noteubug mall % npm list tailwindcss mall@0.0.0 /Users/leeman01/frontend2/mall └── (empty) leeman01@idong-geon-ui-noteubug mall % npm cache clean --force npm warn using --force Recommended protections disabled. leeman01@idong-geon-ui-noteubug mall % npm install -D tailwindcss postcss autoprefixer added 2 packages, and audited 156 packages in 772ms 32 packages are looking for funding run `npm fund` for details found 0 vulnerabilities leeman01@idong-geon-ui-noteubug mall % npm run dev > mall@0.0.0 dev > vite VITE v6.2.2 ready in 392 ms ➜ Local: http://localhost:5173/ ➜ Network: use --host to expose ➜ press h + enter to show help ^C leeman01@idong-geon-ui-noteubug mall % npm list tailwindcss mall@0.0.0 /Users/leeman01/frontend2/mall └── tailwindcss@4.0.14 leeman01@idong-geon-ui-noteubug mall % npx tailwindcss init -p npm error could not determine executable to run npm error A complete log of this run can be found in: /Users/leeman01/.npm/_logs/2025-03-18T07_59_35_501Z-debug-0.log leeman01@idong-geon-ui-noteubug mall % 이런 알수 없는 오류가 뜨는데 원인이 뭔지 궁금합니다