[리액트] 블로그 기본 페이지 및 상세 페이지 컴포넌트 구현하기
이번 글에서는 React와 react-router-dom을 사용하여 블로그의 기본 페이지와 상세 페이지를 구현하는 방법을 다루겠습니다. 이 과정에서 페이지 간의 라우팅을 설정하고, API 요청을 통해 데이터를 가져오는 방법을 배웁니다.
1. react-router-dom 설치
먼저, React 애플리케이션에서 라우팅을 관리하기 위해 react-router-dom을 설치합니다.
npm install react-router-dom
2. 기본 페이지 및 컴포넌트 생성
2.1. App.js 파일 수정
먼저, src/App.js 파일을 수정하여 라우팅을 설정합니다. 여기서는 BrowserRouter, Route, Switch 컴포넌트를 사용하여 각 경로에 따라 다른 컴포넌트를 렌더링하도록 합니다.
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './components/Home';
import PostDetail from './components/PostDetail';
function App() {
return (
<Router>
<div className="App">
<Switch>
<Route exact path="/" component={Home} />
<Route path="/post/:id" component={PostDetail} />
</Switch>
</div>
</Router>
);
}
export default App;
- BrowserRouter는 라우팅을 관리하는 상위 컴포넌트입니다.
- Switch는 여러 Route 중 하나만 렌더링하도록 합니다.
- Route는 특정 경로에 도달했을 때 렌더링할 컴포넌트를 지정합니다.
2.2. Home.js 파일 생성
다음으로, src/components/Home.js 파일을 생성하여 블로그의 기본 페이지를 구현합니다. 이 컴포넌트는 API 요청을 통해 포스트 목록을 가져와서 화면에 렌더링합니다.
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { Link } from 'react-router-dom';
const Home = () => {
const [posts, setPosts] = useState([]);
useEffect(() => {
axios.get('/api/posts/')
.then(res => {
setPosts(res.data);
})
.catch(err => {
console.error(err);
});
}, []);
return (
<div>
<h1>Blog Posts</h1>
<ul>
{posts.map(post => (
<li key={post.id}>
<Link to={`/post/${post.id}`}>{post.title}</Link>
</li>
))}
</ul>
</div>
);
};
export default Home;
- useState를 사용하여 상태를 관리합니다.
- useEffect를 사용하여 컴포넌트가 마운트될 때 한 번 API 요청을 보냅니다.
- axios를 사용하여 /api/posts/ 경로에서 포스트 목록을 가져옵니다.
- Link 컴포넌트를 사용하여 각 포스트 제목을 클릭하면 해당 포스트의 상세 페이지로 이동합니다.
2.3. PostDetail.js 파일 생성
마지막으로, src/components/PostDetail.js 파일을 생성하여 개별 포스트의 상세 내용을 보여주는 컴포넌트를 구현합니다.
import React, { useState, useEffect } from 'react';
import axios from 'axios';
const PostDetail = ({ match }) => {
const [post, setPost] = useState({});
useEffect(() => {
const { id } = match.params;
axios.get(`/api/posts/${id}/`)
.then(res => {
setPost(res.data);
})
.catch(err => {
console.error(err);
});
}, [match.params]);
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
};
export default PostDetail;
- match.params를 통해 URL에서 동적 파라미터(id)를 가져옵니다.
- 해당 id를 사용하여 API 요청을 보내고, 특정 포스트의 데이터를 가져옵니다.
- 가져온 데이터를 화면에 렌더링합니다.
결론
이 글에서는 React와 react-router-dom을 사용하여 블로그의 기본 페이지와 상세 페이지를 구현하는 방법을 살펴보았습니다. axios를 사용하여 API 요청을 보내고, useState와 useEffect를 통해 상태를 관리하며, Link와 Route를 사용하여 페이지 간의 네비게이션을 구현했습니다. 이 기본적인 구조를 바탕으로 더 다양한 기능을 추가하여 여러분만의 블로그를 만들어 보세요.