31. Naming Rule , 코드 퀄리티, Faker API

JSLEE·2024년 6월 5일

snake_case / camelCase

DB의 테이블컬럼을 관리할 때, Javascript 코드를 관리할 때,
변수명을 지정하는 방법은 각각의 상황에서 일관되게 유지시켜주는 편이 좋다.

보통, DB에서 테이블의 이름이나, 컬럼의 이름을 지정할 때에는 snake_case 를 사용한다.
코드를 작성하면서 변수의 이름을 작성할 때에는 camelCase를 사용한다.

위 규칙을 일관되게 유지한다면, 현재 내가 사용하는 변수 값이 데이터베이스에서 가져온 것인지, 아니면 코드 내에서 내가 새롭게 만들어서 사용한 변수인지 확실히 구분이 가능할 것 같다.

따라서, mysql2conn.query(sql, (err,results)) 을 수행하고 난 뒤의 객체의 key값들의 이름을 바꾸어보자.

예를 들어, 다음과 같은 SQL이 있다고 해보자.

sql = "SELECT * FROM books"

그리고, 다음과 같은 DB가 있다고 해보자.

// books는 테이블 명
books = [
			{ 
              book_id = 1 , 
              price = 30000,
              author = "kim"
			}, 
  			{ 
              book_id = 2 , 
              price = 50000,
              author = "park"
			}
		]

이 상황에서 우리가 데이터를 받아와서 그대로 respond 한다면 프론트엔드에서는 book_id 라는 snake_case로 값을 전달받게 된다.

따라서, 백엔드는 이 변수명을 camelCase로 일관되게 해주면 좋다.

첫번째 방법으로는, SQL에서 AS를 이용하는 것이다.

sql = "SELECT book_id AS bookId, price, author FROM books"

이 방법은, 모든 컬럼의 이름들을 명시해줘야 한다는 단점이 있다.

두번째 방법으로는, javascript의 map 메소드를 이용해서 key값을 추가해주는 것이다.
conn.query의 return값은 항상 배열이기 때문에 map 메소드를 사용할 수 있다.

conn.query(sql,(err,results)=>{
	results.map(elem => {
    	elem.bookId = elem.book_id;
      	delete elem.book_id;
    })
})

이 방법에서는 기존 키 이름인 book_id를 삭제하는 것을 잊지 말도록 하자.


코드 퀄리티 높이기

BookShop 프로젝트를 수행하면서, 유저API, 장바구니API, 주문API, 도서 조회API , 좋아요 API 등을 모두 구현하였다. 이제 프론트엔드와 연결지어 마무리 지으면 되기 때문에 백엔드의 업무는 모두 끝났다고 생각할 수 있다.

하지만, 전체적인 코드를 다시 되돌아보면서 다음과 같은 사항들을 고려해야 한다.

  1. 중복되는 코드 -> 모듈화
    예를 들어, 사용자에게 로그인을 시킨 후에 로그인 세션이 유지되어 있는지 JWT를 체크하는 코드는 유저 API , 장바구니 API, 주문 API 등에 모두 들어간다. 따라서, JWT를 확인하는 코드는 모듈화하여 명확하고, 유지보수가 용이하도록 관리할 수 있다.

  2. 패키지 구조
    다음과 같이 패키지의 구조를 생성하여, 각 기능들에 대해서 분리하여 준다.

    1. Router : HTTP method 요청에 따라 PATH를 지정해준다.
    2. Controller : 각 엔드 포인트에서 어떤 기능을 수행해야 하는지 지정한다.
    3. Service : 기능을 수행한다.
      ex) 예를 들어, Login API에서 Hashing과 토큰 생성 등에 대해 구현한다.
    4. Model : 데이터베이스에 접근하기 위한 코드들을 관리한다.
      ex) 사용한 쿼리들을 모아놓는다. 예를 들어, Login API 에서는 user테이블의 데이터를 조회하는 쿼리문conn.query() 에 대한 내용을 관리한다.
  3. 예외처리 - try/catch
    전체 코드를 검토하면서, 오류가 발생할 만한 곳은 없는 지 체크하며 예외처리를 해준다.

  4. 유효성 검사 추가
    int값이 들어와야하는 자리에 string이 들어온다거나, 예상치 못한 undefined 값이 들어오는 것을 방지하기 위해, request의 값들을 유효성 검사를 실시한다.

  5. 토큰을 두개 발급
    1. Access Token : 사용자로부터 인증을 확인하기 위해 사용하는 토큰이다.
    2. Refresh Token : Access Token의 유효기간이 끝나갈 때, 로그인 연장을 위한 토큰이다.
    ex) 로그인 시, Access token(30m)과 Refresh Token(24h)을 발급.
    Access token이 만료 되기 직전에, Refresh token이 유효하다면 연장 여부를 사용자에게 물어봄.

  6. 랜덤 데이터 (외부)API 활용하여 테스트
    faker나, mockaroo 등의 랜덤 데이터 값을 생성해주는 API들을 이용하여, 내가 작성했던 API들을 테스트해본다.

  1. 프론트엔드 협업 중, 발생하거나 발생할 이슈 해결

  2. Naming Rule을 통일시키고, http status code는 적절한지 등을 고려

  3. nodemon 모듈 :
    이건 프로젝트를 완료하고 나서 필요한 것은 아니지만, 프로젝트를 수행할 때 유용한 모듈이다.
    우리가 코드를 변경하고 나면 매번 서버를 재시작해줬어야 했는데, 이 모듈을 사용하면 코드의 변경 사항을 감지하여 자동으로 재시작해준다.


Faker 모듈

Faker 모듈은 위의 6번 내용처럼 랜덤 데이터 값을 생성하도록 해준다.
이를 활용하여, 우리의 데이터 형식에 맞는 테스트용 데이터를 생성할 수 있다.

faker - npm
faker documents

faker documents를 확인하면 알겠지만, 가짜 이메일, 가짜 전화번호, 가짜 이름, 가짜 음악장르 등 엄청나게 다양한 API를 제공한다.

따라서, Faker 모듈을 이용해 내가 필요한 가짜 데이터 형식으로 데이터를 생성해보겠다.
먼저 Faker 모듈을 설치한다.

npm i @faker-js/faker

그리고 faker의 공식 npm 페이지의 사용 방법을 참고해보자.

const { faker } = require('@faker-js/faker');

const createRandomUser = function (){
  return {
    userId: faker.string.uuid(),
    username: faker.internet.userName(),
    email: faker.internet.email({lastName }),
    avatar: faker.image.avatar(),
    password: faker.internet.password(),
    birthdate: faker.date.birthdate(),
    registeredAt: faker.date.past(),
  };
}

let users = []
users = (faker.helpers.multiple(createRandomUser, {count: 5,}))
console.log(users)

위의 코드를 실행시키면, 총 5명의 user에 대한 객체가 생성된다.

이를 활용해서 백엔드로 request 를 받았을 때,
email, password, fullName, contact 값을 가진 user 객체를 돌려주도록 API를 구현해보았다.

const createRandomUser = function (){
  return {
    email: faker.internet.email({}),
    password: faker.internet.password(),
    username: faker.person.fullName(),
    contact : faker.phone.number()
  };
}


app.get("/fake/users" , (req, res)=> {
  let cnt = parseInt(req.query.count)
  if (cnt > 0){
    let users = faker.helpers.multiple(createRandomUser,{count : cnt})
    return res.status(StatusCodes.OK).json(users);

  } else {
    let users = createRandomUser()
    return res.status(StatusCodes.OK).json(users);
  }
})

위 코드는 /fake/users 에 GET request를 보내면 한명의 객체를 보내고,

/fake/users?count={num} 으로 GET request를 보내면 해당 숫자만큼의 객체가 담긴 배열을 보내준다.

이렇게 내가 테스트할 때 필요로 하는 가짜 데이터를 생성하는 API를 만들어보았다.

profile
공부한 내용들을 정리하기 위해 사용하는 블로그입니다.

0개의 댓글