다음과 같은 상황을 고려해보자.
클라이언트측에서 로그인을 하기를 원한다.
클라이언트는 ID값과 Password 값을 body에 담아, POST 메소드로 request 할 것이다.
서버는, 이 ID값과 Password값을, 가지고 있는 데이터와 비교하여 옳은 정보일 때 클라이언트에게 로그인을 시켜주는 respond를 보낼것이다.
하지만, 해당 ID가 없는 아이디거나, 비밀번호가 틀리다면 로그인을 시키지 않도록 해야 한다. 즉, 데이터베이스를 순회하면서 입력받은 ID값과 일치하는 ID를 찾고, 해당 객체의 비밀번호 또한 일치 여부를 따져야한다.
코드로 보자면 다음과 같다.
app.post('/login' , (req,res)=>{
const { id , password } = req.body
user = {}
db.forEach(element => { // db를 순회하면서, 일치하는 아이디를 찾고 객체를 기억한다.
if (element.id = id) {
user = element
}
})
})
만약 db에 일치하는 ID가 없다면, user에는 아무것도 저장되지 않아 user={} 인 상태일 것이다.
이제 이 user 변수를 이용해서 아이디 보유 여부를 따질 수 있는데, 이전포스트에서도 언급한 주의해야할 사항이 있다.
Javascript에서는 { }, [ ], 등 값이 없어도,
Boolean({ }), Boolean([ ]) 는 "참"값을 가진다는 것이다.
그럼 객체가 비었고 안비었고는 어떻게 판별해야할까?
이 때 사용하는 다양한 방법 중 하나가 Object.keys()이다.
다른 방법들은 for문을 이용한 방법과, lodash 라이브러리를 사용하는 방법이 있지만, Object.keys()에 대해 알아보도록 하겠다.
Object.keys(객체명) 메소드는 해당 객체의 key 값들을 배열로 반환한다.
// ex
const obj1 = {}
const obj2 = {"key" : "value"}
const myStr = "key"
console.log(Object.keys(obj1)) // [] 반환
console.log(Object.keys(obj2)) // ["key"] 반환
console.log(Object.keys(myStr)) // ['k', 'e', 'y'] 반환
객체의 key들을 배열로 바꾸면, 배열에서 사용할 수 있는 property인 length를 사용할 수 있다.
즉, 빈 객체는 length가 0일것이고, 그렇지 않은 객체는 length가 0이 아닐 것이다.
이를 통해 우리는 빈 객체를 구별할 수 있게 된다.
typeof와 constructor 모두 해당 변수의 자료형을 알 수 있다.
몇가지 차이가 존재한다.
문자열로 변환한다.typeof(123) // "number"
typeof(true) // "boolean"
typeof({}) // "object"
typeof([]) // "object"
let num = new Number(123)
typeof(num) // "object"
typeof는 object객체 {} 와 array객체 [] 를 구분하지 못한다.
또한, 클래스를 통하여 인스턴스로 숫자값을 생성하게 되면 자료형을 object로 반환한다.
생성자로부터 만들어졌는지 반환한다.123.constructor // [Function: Number]
true.constructor // [Function: Boolean]
{}.constructor // [Function: Object]
[].constructor // [Function: Array]
let num = new Number(123)
num.constructor // [Function: Number]
숫자를 클래스형태로 지정해서 사용하는 경우는 드물기 때문에,
constructor는 object와 array를 구분할 수 있는 구체적인 데이터타입 확인 방법이라고 기억하면 될 듯 하다.
CRUD는 시스템을 구성하는 데에 반드시 필요한 요소들이다.
C : create - 생성
R : Read - 조회
U: Update - 수정
D : Delete - 삭제
예를 들어, 데이터베이스 관리에서는,
Create : CREATE
Read : SELECT
Update : UPDATE
Delete : DELETE
로 CRUD가 구현되어있고,
HTTP 메소드에서는
Create : POST
Read : GET
Update : PUT
Delete : DELETE
로 CRUD가 충족되어 있다.
따라서, 내가 어떤 웹사이트를 운영하기 위해서는 CRUD를 고려하며 API를 설계해야한다.
예를 들어, 네이버 웹사이트의 API를 생각해보자.
네이버는 회원들이 회원가입을 할 수 있도록 API를 만들어줘야 한다. (POST)
회원들이 올바른 ID값과 Password 값을 가지고 로그인하고자 할 때,
해당 데이터를 확인(POST)하고, 로그인이 된 화면(ex. 마이페이지) 을 출력(GET)해줘야한다.
회원이 닉네임을 변경하고 싶을 때는 해당 회원의 id값을 가진 상태에서, 변경하고자 하는 닉네임값을 받고 데이터베이스의 데이터를 수정해야한다. (PUT)
회원을 탈퇴하고자 할 때는, 해당 회원의 id값을 가지고 회원의 데이터를 삭제해야 한다. (DELETE)
백엔드측에서는 이렇게 API 를 어떻게 처리해야할지 생각해야하고,
프론트엔드측에서는 사용자들에게 어떠한 데이터를 받아야하고, 인터페이스는 어떠한 것들이 필요한지 백엔드와 소통하며 웹을 개발해야한다.
우리가 express를 통해서 API를 구현할 때,
URL은 같은데 HTTP 메소드만 다를 때가 있다.
ex) app.get('/user') app.post('/user')
이 때는 .route 메소드를 사용할 수 있다.
사용 방법은 다음과 같다.
app.route('/user')
.get((req,res) => { })
.post((req,res) => { })
이로써, 같은 URL에 대해서 명확하고 간편하게 다른 HTTP method들을 구현할 수 있다.