📜 목차

알고리즘

실패율

실습 : 소셜 로그인 로직 구현

네이버 로그인 연동

카카오 로그인 연동

소셜 로그인으로 로그인 API 통합

알고리즘

📌 lastIndexOf()

arr = [ 1, 2, 3, 4, 2 ]

arr.indexOf(2)   // 1 , 숫자 '2'를 찾아줘
arr.indexOf(2,3) // 4, 숫자 '2'를 3번째 인덱스부터 찾아줘~ 

arr.lastIndexOf(2) // 4, 뒤에서부터 숫자 '2'의 인덱스 값을 찾아줘
arr.lastIndexOf(2,3) // 1, 3번째 인덱스부터 숫자 '2'의 인덱스 값을 찾아줘

arr = [1, 2, 2, 2, 3, 3, 4, 4]

arr.indexOf(2)     // 1
arr.lastIndexOf(2) // 3
arr.slice(1,4)     // [2,2,2]

arr.slice(
	arr.indexOf(3),
	arr.lastIndexOf(3)+1
) // [3,3]

String.prototype.lastIndexOf() - JavaScript | MDN


💭 실패율

// 실패율을 구하는 코드를 완성하라.
// 실패율은 다음과 같이 정의한다.
// 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
//전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 
// stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 
// 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

function solution(N, stages) {
    // 모든 스테이지의 번호를 오름차순으로 정렬
    stages.sort( ( a,b )=> a-b )
    
    const infos = []
    for (let i = 1; i <= N; i++){
        infos.push({
            stage: i,       // 현재 스테이지의 번호
            users : 0,      // 클리어하지 못한(플레이 중인) 유저의 수
            fail: 0         // 스테이지의 실패율을 저장
        })
    }
    //console.log(infos)
    let allUsers = stages.length; // 모든 유저의 수(초기값)
    for (let i = 0; i <stages.length ; i++){
        if( infos[ stages[i]-1 ]   ){
            infos[ stages[i]-1].users++
            // console.log(infos,stages[i])
            
            // 현재 스테이지의 번호와 다음 스테이지의 번호가 동일하지 않다면
            // === 현재 스테이지의 유저의 합산이 완료되는 시점
            
            if( stages[i] !== stages[i+1] ){
                const fail = infos[ stages[i] -1 ].users / allUsers
                allUsers -= infos [ stages[i] -1].users
                
                infos[ stages[i]-1 ].fail = fail
            }
        }
    }
    return infos.sort((a,b) =>{
        return b.fail -a.fail
    }).map(el=> el.stage)
}

// map()을 이용한 풀이

function solution(N, stages) {
    stages.sort( ( a,b ) => a-b )
    
    let allUsers = stages.length
    const answer = new Array(N).fill(1).map((num,i) =>{
        const stage = num + i
        const arr = stages.slice(
            stages.indexOf( stage ),
            stages.lastIndexOf(stage)+1
        )
        const fail = arr.length / allUsers
        allUsers -=arr.length
        
        return {stage, fail}
    }).sort((a,b) => {
        return b.fail - a.fail
    }).map(el => el.stage)
    return answer
}


실습 : 소셜 로그인 로직 구현


네이버 로그인 연동

// src/commons/auth/jwt-social-naver.strategy.ts

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport'
**import { Strategy } from "passport-naver-v2"**

@Injectable()
export class **JwtNaverStrategy** extends PassportStrategy( Strategy, '**naver**') {
    // 네이버에서 인증 및 검증이 모두 되기 때문에 클라이언트 아이디 입력하기
    constructor(){
        super ({
            **clientID: '-',
            clientSecret: '-', 
            callbackURL: '<http://localhost:3000/login/naver>',**
        })
    }

    // 2. 검증 완료 시 validate 실행, accessToken/refreshToken/profile 받아온다~
    validate( accessToken: string, refreshToken: string, profile: any ){

        return {
            email_user: profile.email,
            password: "qwer1234",
            nickname_user: profile.nickname,
            birth_user: "2020-03-15",
        }
    }
}
// src/apis/auth/auth.controller.ts

...
// 로그인 사이트 (/login/naver)
    **@Get('/login/naver')
    @UseGuards(AuthGuard('naver'))**
    async loginNaver(
        @Req() req: Request & IOAuthUser,
        @Res() res: Response,
    ) {
        let user = await this.userService.findOne({
							email_user : req.user.email_user
				})
        if(!user){
            user = await this.userService.create({
                email_user: req.user.email_user,
                hashedPassword: req.user.password,
                nickname_user: req.user.nickname_user,
                birth_user: req.user.birth_user,
            }) 
        }
        this.authService.setRefreshToken({ user, res })
        res.redirect(
            "<http://localhost:5500/homework/main-project/frontend/login/index.html>"
        )
    }
...

카카오 로그인 연동