Project/서울시 범죄 발생률 예측 서비스

[Project] 서울시 범죄 발생률 예측 서비스 - Server

gangee 2024. 6. 9. 22:08

목차

    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
    반응형