인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

wjdwoals042님의 프로필 이미지

작성한 질문수

코드로 배우는 React with 스프링부트 API서버

조회기능 구현

안녕하세요 조회기능 구현에서 에러가 발생했습니다

작성

·

66

0

vscode를 통해 npm start를 한 후, todo/read/숫자를 입력하니까 404에러가 발생했습니다. 그런데 vscode에서 컨트롤S를 눌렀더니 화면이 떴는데 익스플로러 상에서 새로고침을 하니까 다시 404에러가 발생하는데 이유를 모르겠습니다. 이미지를 첨부할 테니 혹시 더 필요하신 게 있으시면 답변해 주시면 감사드리겠습니다.

1.jpg.webp

2.jpg.webp

답변 2

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

에러 메시지를 보면 Axios를 이용해서 서버가 호출될 때 문제가 있는 것 같습니다.

GET방식이므로 브라우저에서는 8080 등으로 동작하는 API 서버의 동작을 먼저 확인하신 후에

다시 실행해 보시는게 좋을 듯 합니다.

wjdwoals042님의 프로필 이미지
wjdwoals042
질문자

API 서버 동작을 확인하는 데에 todoApi.js를 확인해 봤는데 어디가 문제인지 모르겠네요

내용은 다음과 같습니다

 

import axios from 'axios';
export const API_SERVER_HOST = 'http://localhost:8080'

const prefix = '${API_SERVER_HOST}/api/todo'

export const getOne = async (tno) => {
    const res = await axios.get('${prefix}/${tno}')

    return res.data
}

export const getList = async (pageParam) => {
    const {page,size} = pageParam

    const res = await axios.get('${prefix}/list', {params:{page,size}})

    return res.data

}
Link님의 프로필 이미지

const res = await axios.get('${prefix}/list', {params:{page,size}})

이 부분을 
const res = await axios.get(`${prefix}/list`, {params: {page:page,size:size }})

따옴표가 아니라 백틱으로 감싸야 합니다.
다른 곳도 수정할 부분이 보이실 겁니다.
강의자료에 첨부된 소스파일과 비교해서 보셔도 될 거 같네요.
wjdwoals042님의 프로필 이미지
wjdwoals042
질문자

감사합니다. 그런데 이번에는 별개 에러가 나왔는데요 네트워크 에러라고 나오길래 조사해 보니까 이는 크롬에서의 문제인 거라 상관 없을 거 같다는데 맞을까요

3.png.webp

?

wjdwoals042님의 프로필 이미지
wjdwoals042
질문자

다시 실행해 봤는데 네트워크 통신을 보면 referer쪽이 8080이 아닌 3000으로 동작되는 게 문제인가요?

CORS 문제인 게 아닐까 해도 어떻게 대응해야 할지 모르겠습니다

답변 부탁드립니다 관리자 도구 네트워크 탭 쪽 내용을 아래에 첨부하겠습니다

4.png.webp

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

리액트에서 8080으로 동작하는 api서버를 호출하는 부분이 문제로 보입니다

우선은 브라우저에서 호출 주소가 정상적인지 확인해 보세요

 

이후에 CORS 문제가 발생하면 다시 알려주세요

Link님의 프로필 이미지

React 는 npm start 하면 http://localhost:3000 번으로 동작됩니다.

Spring Boot 는 컴파일로 구동시키면 http://localhost:8080 으로 동작됩니다.

axios 로 Spring Boot 의 경로를 호출합니다.

일단 Spring Boot 가 동작중인지 확인이 되어야 합니다.

 

저의 application.yml 파일

spring:
  application:
    name: mallapi
  datasource:
    url: jdbc:mariadb://localhost:3306/malldb
    username: codefox
    password: Codefullfox!!
    driver-class-name: org.mariadb.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        show_sql: true
        dialect: org.hibernate.dialect.MariaDBDialect
        use_sql_comments: true
  servlet:
    multipart:
      max-request-size: 30MB
      max-file-size: 10MB
org:
  zerock:
    upload:
      path: upload
server:
  port: 8080
  ssl:
    enabled: false
    key-store: classpath:keystore.p12
    key-store-password: changeit
    key-store-type: PKCS12
    key-alias: tomcat

ssl 설정은 클라우드 서버에서 https://www.abc.com 으로 접속할 때 SSL 인증서가 설치되어 있을 때의 경우이며 , 강의에서는 노트북/데스크탑 PC에서 컴파일 하는 것이므로 enabled: false 로 해야 정상동작

SSL 인증서 설정 적용하는 건 https://link2me.tistory.com/2463 를 참조

 

CORS 문제를 해결하기 위한 코드
강의 파일에서는 CustomServletConfig.java 파일을 참고하세요.

package org.zerock.mallapi.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.zerock.mallapi.controller.formatter.LocalDateFormatter;

@Configuration
public class CorsMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new LocalDateFormatter());
    }

    public void addCorsMappings(CorsRegistry corsRegistry) {
        corsRegistry.addMapping("/**")
                .allowedOrigins("http://localhost:3000", "https://spb.abc.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(300)
                .allowedHeaders("Authorization", "Content-Type","Cache-Control");
    }
}

 

ch6 강의 듣고 있는 중이라 제가 답변드릴 수 있는 건 여기까지 입니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. wjdwoals042님.

지금 설명해 주신 상황에서 발생한 404 오류는 보통 서버가 해당 경로에 대해 알지 못할 때 발생합니다. 주어진 이미지를 보면, 브라우저에서 URL을 직접 입력했을 때 404 오류가 발생하고, 페이지를 편집 후 다시 저장했을 때 화면이 나타나는 것으로 보입니다.

404 오류가 발생하는 몇 가지 일반적인 이유와 해결 방법을 안내드리겠습니다:

  1. React Router 설정 문제:

    • React Router를 사용 중이실 경우, 브라우저 URL에 직접 접근하는 방식은 제대로 작동하지 않을 수 있습니다. 특히 프로젝트가 SPA(Single Page Application)일 경우 새로 고침을 하면 서버 쪽에서는 해당 URL을 직접 처리하지 않기 때문입니다.
    • 서버 측에서 모든 요청을 index.html로 리다이렉트하여 React Router가 클라이언트에서 경로를 처리하도록 설정해야 합니다. 이를 위해서는 서버 설정 파일(Nginx, Apache, 기타 서버)를 수정하여 모든 비정적 경로에 대해 index.html을 제공하도록 해야 합니다.
  2. 개발 서버에서의 CORS 또는 연결 문제:

    • 개발 서버 환경에서 특정 요청이 제대로 설정되지 않았을 수 있습니다. 예를 들어, REST API 서버와의 연결이 문제일 수 있습니다. 브라우저의 다양한 해석 차이로 인해 발생할 수 있는 문제입니다. 개발 환경(브라우저 개발자 도구의 Network 탭에서 이벤트 모니터링)을 통해 확인이 필요합니다.
  3. 백엔드 API 엔드포인트 문제 확인:

    • 백엔드에서 제공해야 할 API 경로가 제대로 설정되었는지 확인하세요. 예를 들어 /todo/read/:id의 형태로 엔드포인트가 설계되었다면, 그에 맞게 데이터를 반환할 수 있도록 백엔드 설정을 확인하시기 바랍니다.

추가적인 문제 해결을 위해, 다음 링크의 기존 질문 및 답변을 참고하시면 도움이 될 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wjdwoals042님의 프로필 이미지
wjdwoals042
질문자

아무래도 React Router 설정의 문제인 거 같은데 어떻게 대응해야 할지 모르겠네요ㅠㅠ