반응형

1. Google Cloud에서 OAuth 설정

=> https://console.cloud.google.com/

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

API 및 서비스 - [OAuth 동의화면] -> [사용자 인증정보] 이렇게 작성하면 됨

-> 사용자 인증정보 작성 후 마지막에 나온 키와 시크릿 키를 복사해서 .env파일에 넣기

 

2. .env 파일 생성 및 main.ts 파일 수정

.env

- 키와 시크릿 키 복사해서 넣기

main.ts

.env의 환경설정을 이용할 수 있게 루트 파일에 코드 작성

 

3. Entity 수정

User.entity.ts

- googleId를 받을 수 있는 Column 생성

- authMethod : 회원가입 할 때 작동 방식에 따라 일반 회원가입할 때 local 값을 google 로그인이면 google 값을 받음

 

4.googleStrategy 생성

 

 

google.strategy.ts

- 유저가 이미 있으면 그 유저로 로그인

- 유저가 없으면 DB에 저장 후에 로그인

 

5. controller 수정

auth.controller.ts

- /auth/google 로 요청을 보내면 흔히 아는 로그인 페이지가 뜸.

- 다시 데이터를 받고 로직 처리 후에 로그인 성공

 

6. Module 수정

auth.module.ts

- provides에 GoogleStrategy 추가

반응형
반응형

1. Module

auth.module.ts

- JWT : JSON 형식의 자가 포함된 토큰, 클레임 세트를 포함하며 서명으로 확인할 수 있음

- JwtModule : NestJS에서 제공하는 모듈, JWT 기반 인증 기능을 쉽게 구현 가능

- passport : 인증 미들웨어 프레임워크, 다양한 인증 전략

- PassportModule : NestJs에서 제공하는 모듈, Passport를 사용한 인증 기능 구현할수 있게 해줌

- signOptions : JWT를 서명할 때 사용할 옵션을 지정하는 객체, 예 : 유효기간을 설정 가능

 

2 JWT 파일 생성

jwt.strategy.ts

- JwtStrategy : Passport를 사용하여 JWT 인증 전략을 정의하는 클래스

- PassportStrategy : Passport 전략을 NestJS와 통합하는데 사용되는 기본 클래스

- Strategy : passport-jwt 라이브러리의 JWT 인증 전략을 나타냄

- InjectRepository : TypeORM 레포지토리를 주입하는 데 사용

- super() : 자식 클래스에서 부모 클래스의 생성자를 호출하는 데 사용됨

- jwtFromRequest : 요청에서 JWT를 추출하는 방법을 지정하는 옵션

- ignoreExpiration : JWT의 만료 시간을 무시할지 여부를 지정하는 옵션

- secretOrKey : JWT를 검증할 때 사용할 비밀 키 또는 공개 키

- fromAuthHeaderAsBearerToken() : Authorization 헤더에서 Bearer형식의 토큰을 추출하는 함수

- payload : JWT의 페이로드 부분, 일반적으로 사용자의 정보나 권한과 같은 데이터를 포함

- findOne() : TypeORM에서 단일 레코드를 찾는 메소드

- UnauthorizedException() : 권한이 없음을 나타내는 예외를 발생시킴

 

3 Service

auth.service.ts
auth.service.ts

- where : {} 뜻 : findOne 메소드에서 사용되는 객체, 데이터를 찾을 때 사용할 조건을 지정

- compare () : bcrypt 라이브러리에서 사용하는 메소드, 암호화된 비밀번호와 평문을 비교함

- sign() : JwtService의 메소드, 주어진 payload로 JWT를 서명

 

4 Login DTO

loginUser.dto.ts



5 Controller

 

user.controller.ts

- @Body() lgoinUserDto : LoginUserDto 의 뜻 :HTTP 요청 본문에서 LoginUserDto 타입의 객체를 추출하는 데 사용되는 데코레이션

반응형
반응형

Postman 공식 홈페이지에서 다운 후 앱 실행

 

 

파일 - New 누르면

 

일반적인 Rest의 경우에는 HTTP 클릭

GraphQL쓰면 옆에 것 클릭

 

Headers 탭에서 Key에 content-type value에 apllication/json

 

1. 회원가입 테스트

2. 로그인 테스트

반응형
반응형

auth.controller.ts

1.Controller : 클라이언트의 요청을 받아 회원가입을 수행함

- constructor() : 클래스의 객체를 생성하고 초기화
- private : 클래스 내부에서만 접근 가능한 멤버를 선언하는 접근 지정자
- @Post : HTTP POST 요청을 처리하는 엔드포인트를 정의
- @Body() : HTTP 요청 본문의 데이터를 가져옴
- this : 클래스 내부에서 현재 인스턴스를 참조하는데 사용됨. 클래스의 속성이나 메서드에 접근할때 사용
 

 

auth.service.ts

2.Service : 회원가입 로직을 처리하며, 데이터베이스 연동을 수행함
- @Injectable() : 클래스를 프로바이더로 표시하고 의존성 주입을 가능하게 함.
- @InjectRepository() : 특정 엔터티의 레포지토리를 인스턴스화하고 해당 레포지토리를 주입하는데 사용
- bcrypt 라이브러리 : 비밀번호 해싱을 위한 라이브러리 , 패스워드 보안 강화
- typeorm :서버에서 사용되는 orm 라이브러리, 데이터베이스 작업을 단순화하고, 매핑을 관리함
- Repository : Typeorm의 핵심 개념, 특정 엔터티와 관련된 작업을 수행하는데 사용되는 객체
- userRepository: Repository<User>의 뜻 : User 엔터티와 관련된 작업을 수행할 수 있는 레포지토리의 인스턴스를 선언
- : Promise<User> 뜻 : User 객체를 담은 프로미스를 반환, 비동기 작업이므로 결과를 기다린 후 반환
- await bcrypt.genSalt() 뜻 : 비밀번호 해싱에 사용될 salt를 비동기적으로 생성
- await bcrypt.hash() 뜻 : 주어진 비밀번호를 해시화

auth.module.ts

3.Module : 인증과 관련된 부분을 정의, 서비스와 컨트롤러를 정의함.

- TypeOrmModule : TypeORM을 NestJS와 통합하는데 사용되는 모듈, 데이터베이스 연결과 언터티 관리를 위해 사용됨.
- forFeature() : 특정 모듈 내에서 특정 엔터티를 사용할 수 있게 등록함. 특정 레포지토리와 함께 사용되어 해당 모듈의 컨트롤러와 프로바이더에 주입될 수 있게 함.

app.module.ts

4. app.module : 루트 모듈로 데이터베이스 연결을 담당

- type : 데이터베이스 종류

- 나머지는 본인의 설정대로

- imports에 Auth 모듈추가

반응형
반응형

 

User.entity.ts

1. Entity 정의

  1. Entity : 도메인 모델링에서 사용되는 개념으로 비즈니스 객체나 데이터베이스의 테이블과 1:1로 매핑되는 개체를 의미함.
  2. 데코레이터 : 특정 클래스,메서드,속성 또는 파라미터에 메타데이터를 추가하거나 특정 로직을 주입하는데 사용됨, 코드의 재사용성과 관리가 용이해짐

- @PrimaryGeneratedColumn() : 해당 열이 기본 키(primary key)이며, 자동으로 증가하는 값임을 나타내는 값, 고유하게 식별하는데 사용함

- {unique:true} : 이 열의 값이 데이터베이스 내에서 유일해야함 (겹치면 안됨)

 

createUser.dto.ts

2. DTO 정의

- @IsEmail() : 해당 프로퍼티 값이 유효한 이메일 형식인지 확인(@)

- readonly : 해당 프로퍼티가 생성 후에 변경되지 않아야 함을 명시함. 불필요한 변경으로 인한 버그를 예방하고, 코드의 안정성을 높힘.

- @IsString() : 해당 프로퍼티 값이 유효한 문자열인지 확인

반응형
반응형

요점

  1. 슬라이싱을 위한 시작 인덱스 식별: 문자열에서 마지막 n 문자가 필요하므로 슬라이스 작업의 시작 인덱스는 문자열에서 n을 뺀 길이입니다.
  2. 문자열 슬라이스: 문자열에서 slice() 메서드를 사용하여 계산된 시작 인덱스부터 시작하여 문자열 끝까지 하위 문자열을 가져올 수 있습니다.

 

function solution(my_string, n) {
    // Identify the start index for slicing
    let startIndex = my_string.length - n;
    
    // Slicing the string from start index till the end
    let result = my_string.slice(startIndex);
    
    // return the result
    return result;
}

 

  • 1행: my_string과 n을 매개변수로 받는 함수 solution을 정의합니다.
  • 3행: my_string의 길이에서 n을 빼 슬라이싱 시작 인덱스를 계산합니다.
  • 6행: 계산된 시작 인덱스에서 끝까지 my_string을 슬라이스하여 result 변수에 할당합니다.
  • 9행: result를 반환합니다.

사용된 주요 JavaScript 메서드/함수:

  • length: String 개체의 이 속성은 문자열의 길이를 UTF-16 코드 단위로 나타냅니다.
  • slice(): 이 메서드는 문자열의 일부를 추출하여 원래 문자열을 수정하지 않고 새 문자열로 반환합니다
반응형
반응형

요점

  1. 마지막 두 요소 확인: 먼저 목록의 마지막 두 요소를 검색합니다. 이는 Javascript의 네거티브 인덱싱을 사용하여 쉽게 얻을 수 있습니다.
  2. 조건 연산: 그런 다음 이 두 요소를 비교합니다. 마지막 요소가 두 번째에서 마지막 요소보다 크면 마지막 요소에서 두 번째에서 마지막 요소를 빼고 결과를 목록에 추가합니다. 그렇지 않은 경우 마지막 요소를 두 배로 늘리고 해당 결과를 목록에 추가합니다.
  3. 목록 업데이트: 배열 끝에 새 항목을 추가하는 push 메서드를 사용하여 목록을 업데이트합니다.
function solution(num_list) {
    // retrieve the last two elements of the list
    let last = num_list[num_list.length - 1];
    let second_last = num_list[num_list.length - 2];

    // perform conditional operation and update the list
    if (last > second_last) {
        num_list.push(last - second_last);
    } else {
        num_list.push(last * 2);
    }

    // return the updated list
    return num_list;
}
  • 1행: num_list를 매개변수로 받는 solution 함수를 정의합니다.
  • Line 3 & 4: num_list에서 마지막 및 두 번째 마지막 요소를 추출합니다.
  • 7행 - 11행: 마지막 요소와 두 번째 마지막 요소를 비교하고 비교를 기반으로 마지막 요소에서 두 번째 마지막 요소를 빼거나 마지막 요소를 두 배로 늘립니다. 결과는 num_list로 푸시됩니다.
  • 14행: 업데이트된 num_list를 반환합니다.

사용된 주요 JavaScript 메서드/함수:

  • length: 배열의 이 속성은 해당 배열의 요소 수를 반환합니다.
  • push: 이 메서드는 배열 끝에 하나 이상의 요소를 추가하고 배열의 새 길이를 반환합니다.
반응형
반응형

요점 : 주어진 숫자의 패리티(홀수 또는 짝수 특성)를 기반으로 배열의 각 요소에 변환을 적용

 

function solution(arr, k) {
    // Check if k is odd or even
    if (k % 2 === 0) {
        // If k is even, add k to each element
        return arr.map(element => element + k);
    } else {
        // If k is odd, multiply each element by k
        return arr.map(element => element * k);
    }
}
  1. k먼저 짝수인지 홀수인지 판단해야 합니다 . 모듈로 연산자( %)를 사용하여 이를 수행할 수 있습니다. 0 과 k % 2같으면 k짝수입니다. 그렇지 않으면 k이상합니다.
  2.  짝수 이면 의 각 요소에 k추가합니다 . 배열의 각 요소에 함수를 적용하고 결과와 함께 새 배열을 반환하는 함수를 사용합니다 . 이 경우 함수는 각 요소에 추가합니다.k arr map k
  3.  홀수 이면 의 k각 요소에 를 곱합니다 . 다시, 우리는 기능을 사용합니다. 이번에는 함수가 각 요소에 를 곱합니다 .
반응형

+ Recent posts