SQL문(SELECT, INSERT)과 예외처리

Seungeun·2024년 5월 23일

백엔드 기초

목록 보기
1/3

데이터가 없는데 SQL문을 사용할 때 고려해야 하는 것

문제 배경:

API를 설계하는 연습을 하는 도중 빈 값이거나 없는 값인데 그냥 빈 배열을 반환하면서 오류가 나지 않는 sql문들이 있어서 코드를 작성할 때 여러 문제가 발생했었다. 이를 정리해보려 한다.

탐구:

SELECT와 조회

  1. 개별 책 조회 API를 만들어서 GET을 보내줬는데 없는 아이디임에도 불구하고 Postman에 빈 배열과 함께 200 OK가 떴다.

    router.get('/books/:id', (req,res)=>{
     let {id} = req.params
     id = parseInt(id)
     let sql = `SELECT * FROM books WHERE id = ?`
     let values = id
    
     conn.query(sql,values, 
         function(err,results) {
         	res.json(results)
     })
    })
    >> results = []

이런 results를 가지고 코드를 짤 때 값이 비어있으므로 오류가 발생한다.
또한, conn.query의 콜백함수에 들어있는 err와는 상관이 없다!!
sql문이 오류인 것인가 vs 아닌가를 생각해봐야 하는 것.

따라서 SELECT 쿼리문은 이런 식으로 예외처리를 해주어야한다.
핵심은 if문의 조건이다. results[0]값이 있으면 ~ 없으면 ~

	const curBook = results[0];
        if(curBook){
            res.status(200).json(`관련내용`);
        } else {
            res.status(400).end();
        }
	
or 
		if(results.length){
			...동일
		}

INSERT와 등록

  1. 이와 반대로 책을 등록하는 POST API에서 사용하는 INSERT 경우에..

          app.post('/books/:id', (req,res)=>{  //채널 생성
    
              const {name, user_id} = req.body
              let sql = `INSERT INTO channels (name,user_id) VALUES (?,?)`
              let values = [name,user_id]
              conn.query(
                  sql, values,
                  function(err,results){
                      //sql의 에러: 없는 userId사용할때
                      if(err){
                          console.log(err)
                          return res.status(400).end()
                      }
                      res.status(201).json(results)
                  }
              )
    
    		```
    

user_id가 FK로 설정이 되어있기 때문에 없는 데이터베이스에 없는 user_id를 사용하면 insert에서 SQL문 오류가 난다. 따라서 이런 경우에는 conn.query 의 콜백함수의 err에서 검출이 된다.


cf. 추가로 UPDATE나 DELETE에서도 주의사항이 존재한다.
update하거나 delete를 요청했지만 변경된 데이터가 없을경우
results를 반환하지 않기 때문에 results.affectedRows를 사용할 수 있다.

정리

  1. SELECT 쿼리문은 WHERE 조건이 만족되지 않아도, 혹은 없는 데이터를 url에서 요청해도 빈 배열을 반환하기 때문에 코드 작성 시 유의해야한다.
  2. INSERT 쿼리문은 없는 아이디를 사용하면 sql문 자체에서 오류가 발생한다.
  3. 그러나 사실 SELECT냐 INSERT가 중요한 것이 아니라 sql문이 오류가 나는 것인지 아닌지가 중요한 것이다. sql문이 오류가 나면 query에서 err가 나오지만 빈 배열을 반환할 때는 오류가 없기 때문에 따로 관리해주어야 한다.
profile
Wonderland

0개의 댓글