웹 사이트를 사용하다보면 회원가입을 해야 서비스를 이용할 수 있는 경우들이 있습니다.

예를 들어 넷플릭스나 티빙 등의 *OTT(Over The Top)를 이용하는 경우 회원가입을 해야 영상 목록을 확인할 수 있고 또한 회원가입 후 멤버십 가입을 해야 영상 시청을 할 수 있는 경우가 대다수입니다.

* OTT(Over The Top)는 인터넷을 통해 볼 수 있는 TV 서비스를 일컫는다.

 

웹 사이트에 회원가입을 하는 경우 자신의 정보를 입력해야 회원가입을 진행할 수 있습니다.

예시 OTT 회원가입 창

회원가입 후 서비스를 이용할 수 있지만 사용자 입장에서 회원가입은 번거로운 작업일 수도 있습니다.

만약 이미 회원가입 된 사이트의 정보를 이용하여 따로 입력폼을 작성하지 않고 회원가입이 된다면 매우 편리하게 이용할 수 있을 것입니다. 

 

실제로 제가 사용하는 아래 예시 사이트에선 다양한 로그인 방법을 제공하고 있습니다.

다양한 로그인 방법

저는 이미 네이버에 회원가입이 되어 있고 "네이버로 시작하기" 버튼을 통해 네이버 정보 제공에 동의 시 따로 회원가입 폼을 작성하지 않더라도 서비스를 이용할 수 있습니다.

 

아래 내용부터는 다양한 개발환경 중 Vue.js에서 기본적인 방법으로 네이버 로그인 구현에 대해 작성하고자 합니다.

 


- 목차 -

가. NAVER Developers 세팅

나. Vue에서 로그인 코드 세팅

다. 참고자료


가. NAVER Developers 세팅

1. NAVER Developers 접속 후 우측 상단 로그인 버튼을 클릭, 로그인까지 진행합니다.

https://developers.naver.com/products/login/api/api.md

NAVER Developers 초기 접속 화면

 

2-1. 네이버 Application을 처음 이용하는 경우 약관동의, 계정 정보 등록, 애플리케이션 등록까지 진행해야 합니다.

① 상단 메뉴 중 Application을 클릭합니다.

② 이용약관을 확인 후 동의합니다.

③ 확인버튼을 누릅니다. 

2-2. 계정 정보 등록

① 휴대폰 인증을 진행합니다.

② 체크박스를 클릭합니다.

③ 위 진행 시 버튼이 활성화되고 확인을 클릭합니다.

계정 정보 등록

2-3. 애플리케이션 등록

① 자신의 애플리케이션 이름을 작성합니다. (저는 테스트로 진행하므로 임의로 작성했습니다)

② 사용 API, "선택하세요." 를 클릭하여 네이버 로그인을 클릭합니다.

애플리케이션 등록

③ 네이버 로그인을 클릭하면 제공 정보를 선택할 수 있습니다. 사용자에게 필수로 받을 정보라면 필수쪽 체크박스에 체크하고 선택적으로 받을 정보라면 추가쪽의 체크박스를 체크합니다.

 

네이버로그인 필수, 선택 정보

* 아래 이미지에서 필수에 체크된 항목은 필수 제공 항목으로 되며 추가에 체크된 항목은 추가 제공 항목에 추가됩니다.

네이버 필수 제공항목, 추가 제공 항목 예시

 

④ "환경 추가" 를 누른 뒤 "PC 웹"을 클릭합니다.

⑤ 서비스 URL을 입력합니다. (아래 이미지에서는 vue 로컬 주소를 입력했습니다)

⑥ Vue 라우터 path가 추가된 URL을 입력합니다.

⑦ "등록하기"를 클릭하면 NAVER Developers의 네이버 로그인 세팅이 완료됩니다.

환경 추가

2-4 멤버관리에 주소 추가

① 위 과정을 거치면 아래 화면이 나옵니다. 메뉴 중 멤버관리를 클릭합니다.

② 테스트할 아이디를 등록합니다. (관리자 ID 등록 시 테스트 ID에 따로 등록하지 않아도 관리자 ID로 테스트가 가능합니다)

나. Vue에서 로그인 코드 세팅

1. 터미널에서 vue 프로젝트를 생성합니다.

2. 네이버 로그인 화면 파일을 생성합니다.

3. /router/index.js, path에 /login/naver 로 라우터를 작성합니다.

// /router/index.js, 라우터 작성
{
    path: '/login/naver',
    name: 'naverLoginView',
    component: () =>
      import(
        /* webpackChunkName: "login", webpackPrefetch:true */ '../views/0_login/naverLoginView.vue'
      )
  }

4. /public/index.html, head태그 안에 script (sdk 주소가 추가된) 태그를 아래와 같이 추가합니다.

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <title>
    <%= htmlWebpackPlugin.options.title %>
  </title>
  <script src="https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.2.js"></script> // sdk 코드 추가
</head>

5. 아래 주소의 SDK 다운로드로 접속하면 javascript용 네이버 로그인 라이브러리의 샘플이 존재하지만 Vue를 이용하므로 아래 6번의 코드를 작성합니다.

https://developers.naver.com/docs/login/sdks/sdks.md

 

6. 네이버 로그인 View.vue 파일 template에 전체 코드를 아래와 같이 추가합니다.

- clientId 와 callbackUrl은 naver Developers의 application 메뉴에서 client Id 확인이 가능하며 콜백  URL은 설정 시 작성했던 주소를 입력합니다

(콜백 URL 예시 : http://localhost:8080/login/naver, 콜백 URL을 기억하지 못 한다면 NAVER Developers의 Application메뉴에서 확인이 가능합니다.)

// NaverLoginView.vue
<template>
  <div>
    <div id="naverIdLogin">
      <a id="naverIdLogin_loginButton" href="#" role="button"
        ><img src="https://static.nid.naver.com/oauth/big_g.PNG" width="320"
      /></a>
    </div>
    <button @click="naverLogout($event)">로그아웃</button>
  </div>
</template>
<script>
export default {
  /* eslint-disable */
  components: {},
  data() {
    return {
      nickName: '',
      naverLogin: null
    }
  },
  setup() {},
  created() {},

  mounted() {
    this.naverLogin = new window.naver.LoginWithNaverId({
      clientId: 'client Id', // client id 작성
      callbackUrl: 'http://localhost:8080/login/naver', // call back url 작성
      isPopup: true,
      loginButton: { color: 'green', type: 3, height: 60 }
    })
    /* 네아로 로그인 정보를 초기화하기 위하여 init을 호출 */
    this.naverLogin.init()

    /* 현재 로그인 상태를 확인 */
    this.naverLogin.getLoginStatus((status) => {
      if (status) {
        console.log(this.naverLogin.user.getNickName()) // 제공 정보 중 닉네임에 대한 정보 출력
        this.nickName = this.naverLogin.user.getNickName()
      }
    })
  },
  unmounted() {},
  methods: {
    naverLogout(event) {
      event.preventDefault()
      this.naverLogin.logout()
    }
  }
}
</script>

* [eslint] 오류 발생 시 mounted()안에 /* eslint-disable */을 작성하여 eslint규칙을 무시할 수 있습니다.

Eslint 오류

 

7. 정상적으로 작성되었다면 아래 네이버 로그인 버튼이 나오고 클릭 시 네이버 로그인 팝업이 등장합니다.

네이버 아이디로 로그인 버튼

8. 동의항목을 클릭하고 "동의하기"버튼을 누르면 콘솔창에 닉네임이 출력됩니다. (정상 로그인)

// mounted() 코드 일부분
console.log(this.naverLogin.user.getNickName()) // 닉네임 출력

 

9. 화면상의 로그아웃 버튼을 누르고 새로고침 시 콘솔창에 닉네임이 출력이 안 된다면 정상적으로 로그아웃된 상태가 됩니다.

 

 

10. NickName을 제외한 다른 값을 받고 싶다면 아래 주소로 접속합니다. (네이버 로그인 개발 가이드)

https://developers.naver.com/docs/login/devguide/devguide.md#3-4-5-%EC%A0%91%EA%B7%BC-%ED%86%A0%ED%81%B0%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%ED%95%84-api-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B8%B0

 

네이버 로그인 개발가이드 - LOGIN

네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디

developers.naver.com

* 출력결과 필드 항목에 response/nickname 이라면 user.getNickName() 의 형식으로 하여 값들을 받아올 수 있습니다.

console.log(this.naverLogin.user.getNickName()) // 닉네임
console.log(this.naverLogin.user.getId()) // Id
console.log(this.naverLogin.user.getName()) // 이름
console.log(this.naverLogin.user.getEmail()) // 이메일
console.log(this.naverLogin.user.getGender()) // 성별
console.log(this.naverLogin.user.getAge()) // 나이
console.log(this.naverLogin.user.getBirthday()) // 생일 (년도 제외)

 


위와 같이 서비스를 운영할 때 자체 회원가입도 필요하지만 네이버와 구글과 같은 이미 많은 사용자가 있는 플랫폼의 로그인 기능들을 포함한다면 사용자에게 더 좋은 선택지를 제공할 수 있으며 간편하게 회원가입을 진행할 수 있게 됩니다.

 

해당 글은 vue.js 환경에서 로그인 구현에 대해 알아보았습니다.

https://developers.naver.com/docs/login/devguide/devguide.md#%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B0%9C%EB%B0%9C%EA%B0%80%EC%9D%B4%EB%93%9C

 

네이버 로그인 개발가이드 - LOGIN

네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디

developers.naver.com

네이버 로그인에 더 필요한 정보가 있다면 위의 링크(네이버 로그인 개발가이드)를 확인하시면 됩니다.

 

저의 글을 읽어주셔서 감사합니다.


다. 참고자료

1. https://www.youtube.com/c/개발자의품격 - 부트캠프,  Vue.js 네이버 로그인

2. https://developers.naver.com/products/login/api/api.md - NAVER Developers, 네이버 로그인

3. https://developers.naver.com/docs/login/overview/overview.md - NAVER Developers, 네이버 로그인, 개요

4. https://terms.naver.com/entry.naver?docId=3579352&cid=59088&categoryId=59096 - NAVER 지식백과, OTT

먼저 vue.js란 자바스크립트 프레임워크로 SPA(Single Page Application)을 구현하는데 최적화되어 있습니다.

SPA의 장점으로 단일 페이지로 구성되어 있기 때문에 페이지 내에 메뉴를 클릭하여 이동하더라도 새로고침이 진행되지 않아 사용자에게 좋은 이용 경험을 제공해줄 수 있습니다.

즉, 하나의 페이지에서 메뉴 이동시 전체 페이지가 변경되는 것이 아니라 변경이 필요한 부분만 교체됩니다.

 

SPA의 장점도 존재하지만 처음 페이지를 접속할 때 다른 페이지들의 소스들도 한 번에 로드되기 때문에

처음 페이지 접속 시 느리다는 단점도 존재합니다.

 

vue의 라우터 방식을 통해 javaScript파일들을 미리 캐시에 담아 최적화된 웹 페이지를 제공한다면 위의 단점을 보완할 수 있게 됩니다.

 

SPA의 단점을 보완할 수 있는 vue 라우터 방식에 대해서 알아봅시다.


- 목차 -

가. 라우터 기본 구조

나. 라우터 방식 3가지

 1. app.js 파일에 포함되는 방식

 2. app.js가 아닌 별도의 js파일로 분리되는 방식

 3. webpackPrefetch:true가 포함된 방식

다. 참고자료

 


가. 라우터 기본 구조

vue를 vscode 터미널로 초기 설치 시 아래 이미지와 같은 폴더 구조로 되어있습니다.

이 중 src폴더 - router폴더 안 index.js를 클릭하셔서 확인하시면 됩니다.

vue 폴더 구조

 

index.js 파일의 routes 배열 코드는 아래와 같습니다.

// index.js 코드의 일부
import HomeView from '../views/HomeView.vue' // HomeView
const routes = [
  {
    path: '/', // URL 경로
    name: 'home', // 유일한 값
    component: HomeView // 실제 컴포넌트 경로
  }
]

1. path

App.vue의 <router-link to="경로">에서의 경로를 의미합니다. 실제로 url 경로를 입력하면 해당 페이지로 이동합니다.

만약 path : "/about" 이고 <router-link to="/about"></router-link>이라면

Home에서 주소창에 "/about" 경로를 입력하게 되면 about페이지로 이동하게 됩니다.

* router-link는 컴파일 시 a 태그로 변환됩니다. to 경로는 href 속성으로 변환됩니다.

about 페이지 주소

 

2. name

페이지가 작성되고 메뉴가 추가되는데, name은 브라우저의 독립적인 url로 접근 가능한 모든 페이지를 의미합니다. 계속 메뉴가 추가되더라도 동일한 이름이 있으면 안 되며 유일한 값만 가져야 합니다.

 

3. component

path로 이동했을 때 연결할 페이지 컴포넌트(확장자 : .vue)에 대한 정보를 입력합니다.

위의 코드에서 컴포넌트 경로가 '../views/HomeView.vue' 으로 되어 있으므로

Home 메뉴로 이동하면 해당 경로의 vue컴포넌트가 로드됩니다.


나. 라우터 방식 3가지

라우터 방식에는 3가지 방식이 있습니다.

라우터 방식에 따라 적절하게 사용된다면 전체 앱의 사용 속도를 최적화할 수 있게 됩니다.

 

1. app.js 파일에 포함되는 방식

// index.js 파일
import HomeView from '../views/HomeView.vue'
const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  }
]

1번 방식은 routes 배열 밖에 별도의 import 코드가 존재하며 routes 안 component에 import 명만 넣는 형태입니다.

 

웹 개발이 완료되고 vue 컴포넌트들이 컴파일되면 브라우저에서 이해할 수 있는 javaScript 코드들로 변환됩니다.

이때 라우터 1번 방식으로 작성된 파일들은 app.js 파일에 포함됩니다.

 

app.js는 첫 화면이 로드될 때 같이 실행되므로

사용자가 무조건 해당 페이지에 접속하는 경우 1번 방식을 사용하게 됩니다.

첫 화면 로드 시 app.js는 같이 로드

* chunk-vendors.js는 개발한 코드를 제외하고 참조하고 있는 외부 js라이브러리 스크립트 코드가 포함됩니다.

 

 

2. app.js가 아닌 별도의 js파일로 분리되는 방식

// index.js 파일
const routes = [
  {
    path: '/about',
    name: 'about',
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]

2번 방식은 routes의 component 함수 안에 import로 작성된 방식입니다.

 

/* webpackChunkName : "about" */

여기에 어떤 이름을 지정하는가에 따라 페이지에 접속했을 때 지정한 이름의 js파일로 로드됩니다. 위의 코드의 결과로는 아래와 같습니다.

about.js 로드

2번 방식은 about 페이지로 이동되는 순간에 서버로부터 about.js파일을 불러오게 됩니다.

app.js 파일과 분리되어 생성됩니다.

 

아래 3번 방식의 경우 방문할 페이지의 js소스를 미리 캐시에 담아 해당 페이지에 접속했을 때 캐시에 있는 js파일이 실행되면서 더 빠르게 화면이 로드됩니다.

 

반면 2번 방식은 이동할 페이지에 방문할 가능성이 낮거나 파일 용량이 가벼운 경우

첫 번째 페이지 접속 시 js파일을 캐시에 담아 첫 화면 로드 시간을 늘릴 이유가 없으므로 2번 방식을 사용할 수 있습니다.

 

 

3. webpackPrefetch:true가 포함된 방식

const routes = [
  {
    path: '/about',
    name: 'about',
    component: () =>
      import(
        /* webpackChunkName: "about", webpackPrefetch:true */ '../views/AboutView.vue'
      )
  }
]

3번 방식은 기존 2번 방식 webpackChunkName : "about" 오른쪽에 ,(콤마) webpackPrefetch:true가 추가된 방식입니다.

 

webpackPrefetch:true가 포함된 페이지에 접속 시 네트워크 탭에서 (prefetch cache)가 표시됩니다.

 

(prefetch cahce)

 

그리고 개발자 창 코드에서도 <head> 태그 안에 <link rel="prefetch" as="script" href="/js/about.js"> 코드를 확인할 수 있습니다.

 

link rel prefetch

link rel="prefetch"은 사용자가 요청할 가능성이 높은 페이지의 리소스를 미리 캐시에 담아 다음 요청이 빨리 이루어질 수 있도록 합니다.

 

따라서 3번 방식은 사용자가 방문할 가능성이 높거나 용량이 높은 페이지인 경우 소스들을 미리 캐시에 가져오고

해당 페이지 이동 시점에 캐시에 있는 소스를 가져와 빠르게 화면을 로드할 수 있도록 합니다.

 

* javascript는 파서 차단 리소스 입니다.

브라우저 렌더링이 진행될 때 javascript를 만나게 되면 html 페이지 파싱이 중단됩니다.

html 파싱이 중단되면 javascript 분석이 진행되는 동안 웹 화면이 빈 화면으로 유지됩니다.

이런 경우 사용자는 웹 사이트가 느리게 느껴질 수도 있습니다.

하지만 prefetch로 가져온 리소스는 캐시에 저장만 하고 스크립트를 해석하지 않기 때문에 브라우저 렌더링을 중단하지 않습니다.

따라서 서버에서 javascript 파일은 가져오지만 해석하지 않고 렌더링을 차단하지 않기 때문에 성능에 이점이 발생하게 됩니다.

 


 

라우터 방식 3가지를 정리하면

1. app.js 파일에 포함되는 방식은 사용자가 무조건 접속하게 되는 메뉴의 페이지인 경우 사용합니다.

2. app.js 파일이 아닌 별도의 js파일로 분리되는 2번 방식은 사용자가 방문할 가능성이 적거나 용량이 가벼운 경우 사용하게 됩니다.

3. webpackPrefetch:true로 미리 캐시에 담아두는 방식인 3번은 사용자가 방문할 가능성이 높거나 페이지 용량이 무거운 경우 미리 캐시에 담아 접속 시점에 페이지 로드를 빠르게 할 수 있도록 합니다.

 

위의 3가지 방식을 알맞게 사용하여 전체 페이지 설계를 진행하면 SPA 단점의 보완과 웹 페이지 로드 시간을 최적화할 수 있게 됩니다.

 


다. 참고자료

1. https://www.youtube.com/c/개발자의품격 - 부트캠프, Vue.js 라우터 이해하기

2. https://v3.router.vuejs.org/kr/guide/ - Vue Router, 시작하기

3. http://www.tcpschool.com/html-tag-attrs/link-rel - TCPSCHOOL, <link> 태그의 rel 속성

'언어 > Vue.js' 카테고리의 다른 글

[Vue.js] Vue.js에서 네이버 로그인 구현  (1) 2022.11.12

+ Recent posts