Sequelize로 사용자의 모델을 작성할 때 해당 사용자가 작성한 post, followings, 그리고 followers 등 다양한 데이터와의 관계를 만들어야 한다. 그리고 이렇게 만들어진 관계형 데이터의 경우 이전 포스팅에서 얻은 user의 데이터만을 return해서는 front에서 접근할 수 없다. 따라서 해당 데이터도 함께 return 함으로써 fornt에서 해당 데이터를 사용할 수 있다. 먼저 sequelize에서 생성한 user의 관련된 데이터를 살펴보자.
여기서 User는 sequelize로 define한 model이다.
상위 코드와 같이 associate method를 이용하여 다른 model과 연동할 수 있다. 이렇게 연동된 놈들을 포함한 데이터를 front에 넘겨야 해당 데이터를 사용할 수 있다. 백엔드 서버에서는 passport에서 로그인으로부터 받은 id를 사용하여 해당 사용자의 데이터를 읽고, 그 다음 해당 사용자와 이렇게 연동되어 있는 데이터에도 접근할 수 있다. 코드는 아래와 같다.
login 라우터에 위와 같은 코드가 작성되어 있는데, include 객체를 사용하여 배열을 만들고 그 배열 안에 우리가 로그인한 사용자와 관련하여 필요한 데이터를 이렇게 변수에 저장한 후 보내야 한다. 그러면 이렇게 리턴된 데이터는 사가에게 전달되게 되고 사가는 LOGIN_SUCCESS 액션 호출과 함께 해당 데이터를 보내야 한다.그러나 여기서 문제가 만약 해당 라우터에 접속하게 되면 로그인되지 않은 상태에서 로그아웃에 라우터에 접근할 수 있는 문제가 발생할 수도 있다. 또는 나중에 게시글 작성을 위한 라우터를 작성할 때에도 로그인이 되지 않음에도 불구하고 해당 라우터 URL에 접속함으로써 해당 작업을 수행할 수 있다는 점이다. 이러한 문제점을 방지하기 위하여 미들웨어를 이용하여 각 라우터를 제어할 수 있다. 이 미들웨어에서 각 작업에 대한 로그인 여부 조건을 부여함으로써 동작에 제한을 줄 수 있다는 점이다. 아래 코드를 한번 확인해보자.
이전 포스팅에서 login 라우터를 보게 되고 중간에 is Logged In, is Not Logged In이라는 부분이 있는데 이 부분이 해당 라우터에 조건을 부여하는 부분이다. Passport에서 is Authenticated 메서드를 제공하며, 우리는 해당 메서드를 사용하여 지금 현재 login되어 있는지 확인할 수 있다. (next()에 어떤 파라미터를 보내면 다음 미들웨어를 동작시킨다.)