일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GRANT VIEW
- cursor문
- exception
- 객체 비교
- 자바
- 참조형변수
- EnhancedFor
- 컬렉션 타입
- oracle
- NestedFor
- 어윈 사용법
- 자동차수리시스템
- 컬렉션프레임워크
- 오라클
- Java
- 한국건설관리시스템
- 예외처리
- 정수형타입
- 생성자오버로드
- 집합_SET
- 추상메서드
- 사용자예외클래스생성
- 메소드오버로딩
- abstract
- 대덕인재개발원
- 예외미루기
- 다형성
- 제네릭
- 환경설정
- 인터페이스
- Today
- Total
목록React_백엔드 프로그래밍 (25)
거니의 velog
5. posts API에 회원 인증 시스템 도입하기 * 이번에는 기존에 구현했던 posts API에 회원 인증 시스템을 도입해 보겠다. 새 포스트는 이제 로그인해야만 작성할 수 있고, 삭제와 수정은 작성자만 할 수 있도록 구현할 것이다. * 각각의 함수를 직접 수정해서 이 기능을 구현해도 되지만, 여기서는 미들웨어를 만들어서 관리해 보겠다. 또한, 각 포스트를 어떤 사용자가 작성했는지 알아야 하기 때문에 기존의 Post 스키마를 수정해 주어야 한다. (1) 스키마 수정하기 * 스키마에 사용자 정보를 넣어 주자. 보통 MariaDB, PostgreSQL 같은 관계형 데이터베이스에서는 데이터의 id만 관계 있는 데이터에 넣어 주는 반면, MongoDB에서는 필요한 데이터를 통째로 집어 넣는다. * 여기서는 ..
4. 토큰 발급 및 검증하기* 이제 클라이언트에서 사용자 로그인 정보를 지니고 있을 수 있도록 서버에서 토큰을 발급해 줄 것이다. JWT 토큰을 만들기 위해서는 jsonwebtoken이라는 모듈을 설치해야 한다.$ yarn add jsonwebtoken(1) 비밀키 설정하기* .env 파일을 열어서 JWT 토큰을 만들 때 사용할 비밀키를 만든다. 이 비밀키는 문자열로 아무거나 입력하면 된다. macOS/리눅스를 사용한다면 터미널에 다음 명령어를 입력해 보자.$ openssl rand -hex 64 6a8ec46e26672fce8051e796ece61d610d719c5eaaa45e46d6dd72110de6a466d96610be17598034583b23f9779b2bf4ebe43e6e508dbb81db5e5..
3. 회원 인증 API 만들기 * 이제 회원 인증 API를 만들어 보겠다. 먼저 새로운 라우트를 정의한다. api 디렉토리에 auth 디렉터리를 생성하고 그 안에 auth.ctrl.js를 작성하자. export const register = async (ctx) => { // 회원가입 }; export const login = async (ctx) => { // 로그인 }; export const check = async (ctx) => { // 로그인 상태 확인 }; export const logout = async (ctx) => { // 로그아웃 }; * 이번 라우트에서는 총 네 개의 API를 만들 것이다. 이렇게 함수의 틀만 잡아주고, auth 디렉터리에 index.js 파일을 만들어서 auth ..
2. User 스키마/모델 만들기 * User 스키마와 모델을 작성하여 사용자의 정보를 MongoDB에 담고 조회해 보자. 앞으로 만들 사용자 스키마에는 사용자 계정명과 비밀번호가 필요하다. * 비밀번호를 데이터베이스에 저장할 때 플레인(아무런 가공도 하지 않은) 텍스트로 저장하면 보안상 매우 위험하다. 따라서 단방향 해싱 함수를 지원해주는 bcrypt 라는 라이브러리를 사용하여 비밀번호를 안전하게 저장할 것이다. * 우선 models 디렉터리에 user.js 파일을 생성하자. 그리고 다음 스키마를 작성해 보자. import mongoose, { Schema } from 'mongoose'; const UserSchema = new Schema({ username: String, hashedPasswor..
1. JWT의 이해 * 이 장에서는 우리가 만든 서버에 회원 인증 시스템을 구현해 볼 것이다. 이 시스템을 구현하기 위해 JWT라는 기술을 사용한다. JWT는 JSON Web Token의 약자로, 데이터가 JSON으로 이루어져 있는 토큰을 의미한다. 두 개체가 서로 안전하게 정보를 주고 받을 수 있도록 웹 표준으로 정의된 기술 중 하나이다. (1) 세션 기반 인증과 토큰 기반 인증의 차이 * 사용자의 로그인 상태를 서버에서 처리하는 데 사용할 수 있는 대표적인 두 가지 인증 방식이 있다. 하나는 세션을 기반으로 인증하는 것이고, 다른 하나는 토큰을 기반으로 인증하는 것이다. 두 방식이 어떻게 다른지 한번 알아보자. [1] 세션 기반 인증 시스템 * 세션을 기반으로 인증 시스템을 만든다는 것은 어떤 의미일..
(4) 페이지 기능 구현 * 페이지 기능을 구현할 준비가 어느 정도 끝났다. 페이지 기능을 구현하려면 앞 절에서 배운 limit 함수를 사용해야 하고, 추가로 skip 함수도 사용해야 한다. * skip이란 표현에는 '넘긴다'라는 의미가 있다. skip 함수에 파라미터로 10을 넣어 주면, 처음 열 개를 제외하고 그 다음 데이터를 불러온다. 20을 넣어 준다면? 처음 20개를 제외하고 그다음 데이터 열 개를 불러온다. * 대충 감이 잡혔을 것이다. skip 함수의 파라미터에는 (page - 1) * 10을 넣어 주면 된다.1페이지는 처음 열 개를 불러오고, 2페이지에는 그다음 열 개를 불러오게 된다. page 값은 query에서 받아 오도록 설정한다. 이 값이 없으면 page 값을 1로 간주하여 첫 페이..
10. 페이지네이션 구현 * 블로그에서 포스트 목록을 볼 때 한 페이지에 보이는 포스트의 갯수는 10~20개 정도가 적당하다. 지금 만든 list API는 현재 작성된 모든 포스트를 불러오는데, 포스트 갯수가 몇 백 개라면 로딩 속도가 느려질 것이다. 또 포스트 목록을 볼 때 포스트 전체 내용을 보여 줄 필요는 없고, 처음 200자(글자) 정도만 보여 주면 적당하다. 불필요하게 모든 내용을 보여 주면 역시 로딩 속도가 지연되고, 트래픽이 낭비될 것이다. * 따라서 list API에 페이지네이션(pagination) 기능을 한 번 구현해 보겠다. (1) 가짜 데이터 생성하기 * 페이지네이션 기능을 구현하려면 우선 데이터가 충분히 있어야 한다. 수작업을 직접 등록을 해도 좋지만, 좀 더 편하게 데이터를 채우..
8. 데이터 삭제와 수정 (1) 데이터 삭제 * 이번에는 데이터를 삭제해 보겠다. 데이터를 삭제할 때는 여러 종류의 함수를 사용할 수 있다. (1) remove() : 특정 조건을 만족하는 데이터를 모두 지운다. (2) findByIdAndRemove() : id를 찾아서 지운다. (3) findOneAndRemove() : 특정 조건을 만족하는 데이터 하나를 찾아서 제거한다. * 우리는 위 함수 중 findByIdAndRemove() 를 사용하여 데이터를 제거해 볼 것이다. [src/api/posts/posts.ctrl.js] /* DELETE /api/posts/:id */ export const remove = async (ctx) => { const { id } = ctx.params; try {..
7. 데이터 생성과 조회 * 우리는 지난 시간 REST API를 학습하면서 임시적으로 자바스크립트 배열을 사용하여 기능을 구현했다. 자바스크립트 배열 데이터는 시스템 메모리 쪽에 위치하기 때문에 서버를 재시작하면 초기화된다. 이번에는 배열 대신에 MongoDB에 데이터를 등록하여 데이터를 보존해 보겠다. (1) 데이터 생성 * 기존에 작성했던 로직을 모두 새로 작성할 것이므로 posts.ctrl.js에서 기존 코드를 모두 지우고 다음 코드를 입력하자. import Post from '../../models/post'; export const write = (ctx) => {}; export const list = (ctx) => {}; export const read = (ctx) => {}; expor..
5. 데이터베이스의 스키마와 모델 * mongoose에는 스키마(schema)와 모델(model)이라는 개념이 있는데, 이 둘은 혼동하기 쉽다. 스키마는 컬렉션에 들어가는 문서 내부의 각 필드가 어떤 형식으로 되어 있는지 정의하는 객체이다. 이와 달리 모델은 스키마를 사용하여 만드는 인스턴스로, 데이터베이스에서 실제 작업을 처리할 수 있는 함수들을 지니고 있는 객체이다. (1) 스키마 생성 * 모델을 만들려면 사전에 스키마를 만들어 주어야 한다. 우리는 블로그 포스트에 대한 스키마를 준비할 텐데, 어떤 데이터가 필요할 지 한번 생각해 보자. (1) 제목 (2) 내용 (3) 태그 (4) 작성일 * 포스트 하나에 이렇게 총 네 가지 정보가 필요하다. 각 정보에 대한 필드 이름과 데이터 타입을 설정하여 스키마..