목차
728x90
반응형
1. 서버 기능
- DB 연결하여 로그인, 회원가입, 즐겨찾기 등의 기능 구현
- Naver News API를 연결하여 News 기능 구현
2. DB 연결 및 관련 기능 구현
2-1. crimeDB 불러오기
- MySQL 에서 생성한 crimeDB를 연결시켜 모듈화함
const mysql = require('mysql');
const db = mysql.createConnection({
host: 'localhost',
user: ' ',
password: ' ',
database: 'crimedb'
});
module.exports = db;
2-2. 연결한 db.js를 서버에 연결
const db = require('./public/js/db');
2-3. 회원가입 기능 구현
- 아이디와 비밀번호를 입력받고 아이디의 중복을 확인한 후 사용자 정보를 저장
// 회원가입 처리
app.post('/signup', (req, res) => {
const username = req.body.username;
const password = req.body.password;
// 비밀번호 해시
const hashedPassword = bcrypt.hashSync(password, 10);
// 사용자명 중복 확인
const checkUserQuery = 'SELECT * FROM users WHERE username = ?';
if (result.length > 0) {
res.json({ success: false, message: '이미 존재하는 아이디입니다. 다른 아이디를 입력해주세요.' });
} else {
// 사용자 정보 저장
const insertQuery = 'INSERT INTO crimedb.users (username, password) VALUES (?, ?)';
db.query(insertQuery, [username, hashedPassword], (err, result) => {
if (err) {
res.json({ success: false, message: 'Database insertion error' });
return;
}
res.json({ success: true, message: '회원가입에 성공했습니다.' });
});
}
});
});
2-4. 로그인, 로그아웃 기능 구현
- 입력한 아이디와 비밀번호가 가입된 회원정보와 일치한지 확인 후 로그인 가능
- 로그아웃 버튼 클릭 시 로그아웃 가능
- 로그인 상태를 확인하는 미들웨어와 상태를 반환하는 엔트포인트 설정
// 로그인 처리
app.post('/login', (req, res) => {
const username = req.body.username;
const password = req.body.password;
const checkUserQuery = 'SELECT * FROM users WHERE username = ?';
db.query(checkUserQuery, [username], (err, result) => {
if (err) {
res.json({ success: false, message: 'Database query error' });
return;
}
if (result.length > 0) {
const user = result[0];
if (bcrypt.compareSync(password, user.password)) {
req.session.user = { id: user.user_id, username: user.username }; // 세션에 사용자 정보 저장
res.json({ success: true, message: '로그인에 성공했습니다!' });
} else {
res.json({ success: false, message: '아이디 혹은 비밀번호가 틀렸습니다.' });
}
} else {
res.json({ success: false, message: '아이디 혹은 비밀번호가 틀렸습니다.' });
}
});
});
// 로그아웃 처리
app.post('/logout', (req, res) => {
req.session.destroy(err => {
if (err) {
res.json({ success: false, message: 'Logout failed.' });
} else {
res.json({ success: true, message: '로그아웃에 성공했습니다.' });
}
});
});
2-5. 즐겨찾기 기능 구현
- user_id와 district를 입력받아 쿼리에 저장
- delete 쿼리를 이용해 즐겨찾기 삭제
- select 쿼리를 이용해 즐겨찾기 목록 확인
// 즐겨찾기 추가
app.post('/favorites', (req, res) => {
const userId = req.session.user.id;
const { district } = req.body;
const insertQuery = 'INSERT INTO favorites (user_id, district) VALUES (?, ?)';
// 즐겨찾기 삭제
app.delete('/favorites', (req, res) => {
const userId = req.session.user.id;
const { district } = req.body;
const deleteQuery = 'DELETE FROM favorites WHERE user_id = ? AND district = ?';
// 즐겨찾기 목록 불러오기
app.get('/favorites', (req, res) => {
const userId = req.session.user.id;
const selectQuery = 'SELECT district FROM favorites WHERE user_id = ?';
3. Naver News API 연결
- 키워드 설정
- API 요청 및 응답 전송
app.get('/api/news', async (req, res) => {
try {
const query = encodeURIComponent('범죄'); // 원하는 검색어로 변경
const apiUrl = `https://openapi.naver.com/v1/search/news.json?query=${query}&display=5`;
// 네이버 API에 요청
const response = await axios.get(apiUrl, {
headers: {
'X-Naver-Client-Id': '클라이언트 아이디',
'X-Naver-Client-Secret': '클라이언트 시크릿',
},
});
// API 응답 전송
res.json(response.data.items); // items만 전송
} catch (error) {
console.error('Error fetching news:', error.message);
res.status(500).json({ error: 'Internal Server Error' });
}
});
*위 작성된 코드는 실제 실행 코드에서 일부를 발췌한 것 입니다.
728x90
반응형
'Project > 서울시 범죄 발생률 예측 서비스' 카테고리의 다른 글
[Project] 서울시 범죄 발생률 예측 서비스 - DB (2) | 2024.08.06 |
---|---|
[Project] 서울시 범죄 발생률 예측 서비스 - Model 1 (0) | 2024.06.09 |
[Project] 서울시 범죄 발생률 예측 서비스 - Front 1 (0) | 2024.06.09 |
[Project] 서울시 범죄 발생률 예측 서비스 - 프로젝트 계획 (0) | 2024.06.09 |