리액트로 구성된 친구와 스프링으로 구성된 친구를 연결해 보려한다.각각의 단계들과 예재들을 이용해서 알아보자.
먼저, 스프링 부트 서버가 제공하는 API의 엔드포인트와 요청/응답 형식을 확인한다. 이는 리액트 앱에서 정확한 요청을 보내고, 응답을 올바르게 처리하는 데 필수적이다.
// 예시: 스프링 부트 컨트롤러의 API 엔드포인트
@RestController
@RequestMapping("/api")
public class ExampleController {
@GetMapping("/data")
public ResponseEntity<ExampleData> getData() {
// 데이터 처리 로직
return ResponseEntity.ok(new ExampleData(...));
}
}
리액트 프로젝트에서는 axios나 fetch API를 이용해 HTTP 요청을 보낸다. 이 예시에서는 axios를 사용한다.
리액트 컴포넌트에서 스프링 부트 서버의 API를 호출한다. 이 때, API 엔드포인트 URL, HTTP 메소드, 필요한 경우 요청 본문(body)을 정확히 지정해야 한다.
import axios from 'axios';
class ExampleComponent extends React.Component {
componentDidMount() {
this.fetchData();
}
fetchData = () => {
axios.get('http://localhost:8080/api/data')
.then(response => {
console.log('Data:', response.data);
// 응답 데이터 처리
})
.catch(error => {
console.error('Error fetching data:', error);
});
};
render() {
// 렌더링 로직
}
}
@CrossOrigin(origins = "http://localhost:3000") // 리액트 서버의 URL
@RestController
@RequestMapping("/api")
public class ExampleController {
// 컨트롤러 메소드
}
리액트에서는 서버로부터 받은 데이터를 상태(state)로 관리하고, 이를 통해 UI를 업데이트한다. useState와 useEffect 훅을 사용하여 비동기적으로 데이터를 로드하고 UI를 갱신할 수 있다.
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function ExampleComponent() {
const [data, setData] = useState(null);
useEffect(() => {
axios.get('http://localhost:8080/api/data')
.then(response => {
setData(response.data);
})
.catch(error => {
console.error('Error fetching data:', error);
});
}, []);
return (
<div>
{data ? <div>{data.someField}</div> : <p>Loading...</p>}
</div>
);
}
API 호출 과정에서 발생할 수 있는 에러를 처리하고, 데이터 로딩 중 상태를 사용자에게 표시하는 것이 중요하다. 에러 발생 시 적절한 메시지를 표시하고, 로딩 중 상태는 UI에 로딩 인디케이터나 메시지를 통해 표시한다.
여기까지가 이루어지면 연결이 가능해진다! 그런데 CROS
는 뭘까?
CORS(Cross-Origin Resource Sharing)는 웹 페이지가 다른 도메인의 리소스에 접근할 수 있도록 허용하는 메커니즘이다. 기본적으로 웹 브라우저는 같은 출처 정책(Same-Origin Policy)을 따르기 때문에, 리액트 앱(예: localhost:3000에서 실행 중)이 스프링 부트 서버(예: localhost:8080에서 실행 중)의 리소스에 접근하려 할 때 CORS 정책 위반 문제가 발생할 수 있다!
스프링 부트에서 CORS를 설정하는 방법에는 여러 가지가 있다. 간단한 방법으로는 컨트롤러 또는 메소드 수준에서 @CrossOrigin 어노테이션을 사용하는 것이다.
@CrossOrigin 어노테이션은 특정 컨트롤러 또는 핸들러 메소드에 대해 CORS 정책을 설정할 수 있다.
@CrossOrigin(origins = "http://localhost:3000")
@RestController
public class MyController {
@GetMapping("/example")
public String example() {
return "CORS enabled response";
}
}
여기서 origins 속성은 리액트 앱이 실행 중인 주소를 지정한다. 모든 출처를 허용하려면 origins = "*"를 사용할 수 있지만, 보안상의 이유로 이는 권장되지 않는다.
전체 애플리케이션에 걸쳐 CORS를 설정하려면 WebMvcConfigurer 인터페이스를 구현하는 클래스를 만들고, addCorsMappings 메소드를 오버라이드한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
이 설정은 /api/** 경로로 시작하는 모든 요청에 대해 CORS를 활성화한다.
리액트 애플리케이션에서는 일반적으로 CORS 설정을 할 필요가 없다. CORS는 서버 측에서 구현되며, 클라이언트 측에서의 변경 사항은 필요하지 않다. 그러나 API 요청을 보낼 때 출처 정보가 포함되도록 해야 한다.
CORS 설정은 웹 애플리케이션의 보안과 직접적인 관련이 있기 때문에, 상황에 맞게 적절히 구성하는 것이 중요하다.