kakao로그인은 솔직히 어렵지않다고 생각했다 왜냐면 백엔드 없이 리액트로도 충분히 혼자해봤었기 때문이다. 하지만 그런 간단한 로그인 절차만 거치는 과정이 아닌 카카오에서 제공해주는 사용자의 정보들을 넘겨받고 넘겨받는 과정이 상당히 복잡해서 많이 놀랐다(이거만 삽질을 3일...)
우선 카카오 로그인을 구현할때 백엔드 개발자분들이 그냥 버튼만 클릭하면 백에서 redirect url을 설정하여서 로그인이 되면 사용자의 정보들을 다 알아서 받아오고 redirect url로 넘겨 그 정보들을 프론트에서 표기하는 방식으로 하려고했다.
근데 여기서의 실수는 백엔드의 local에서는 프론트의 local로 redirect를 할수없다는 점이였다. (물론 이것도 나중에 와서 안 사실인데 만약 프론트와 백엔드가 배포를 한 상태라면 백에서 redicert를 프론트쪽으로 쏴줄수있었겠다는 생각이 들었다...)
그래서 이 난감한 상황을 어떻게 할지 생각을하다가 카카오 공문을 보면서 다시금 구현해보기로 했다.
이렇게 그냥 하기로했는데 문제는 카카오에서는 사용자의 전화번호를 전달해주지않는다.
우리의 서비스 특성상 사용자의 전화번호를 꼭 필요하기에 저렇게 일반적인 방법이 아닌 다른방법으로 바꿔서 소셜로그인을 진행하자고 생각했다.
소셜로그인을 진행하되, 수집항목을 추가하자 였다.
프론트에서 REST API를 통하여 사용자의 로그인을 유도하면 사용자는 카카오 로그인을 진행하게 되며, 이때 사용자는 우리가 설정한 redirect url로 넘어가게된다 이때의 인가코드를 프론트에서 처리하여 백으로 보내준다.
그후 백에서 인가코드를 받으면 응답으로 전화번호와 비밀번호를 준다. 만약 가입한 사용자가 처음 이용자라면 다른 redirect url로 넘어가 사용자에게 전화번호를 수집한다 그 후 프론트에서 로그인에 필요한 전화번호와 비밀번호를 백으로 보내어 로그인 처리를 하게 만들었다.
다만 여기에서의 에러는 또 발생한다
아까의 mixed content에러에서는 원래 백엔드 배포주소인 http와 통신테스트를 위해 로컬로 통신을 하면 같은 http니까 응답이 제대로 왔었다 하지만 카카오에서는 http는 막아놔서 https로밖에 전송을 하지 못한다. 그래서 백엔드가 배포한 주소로 인가코드를 로컬이던 배포된주소로던 뭐로 보내서 응답을 받아내야하는데 계속 못받았다.
Ajax란 자바스크립트를 사용하여 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 웹페이지를 동적으로 갱신하는 프로그래밍 방식임.
ajax는 브라우저에서 제공하는 web api인 XMLHttpRequest 객체를 기반으로 동작한다. XMLHttpRequest는 http비동기 통신을 위한 메서드와 프로퍼티를 제공함.
예전에는 html태그로 시작해서 html태그로 끝나는 완전한 html을 서버로부터 전송받아 웹페이지 전체를 처음부터 다시 렌더링하는 방식으로 동작하였다. 따라서 화면이 전환되면 서버로부터 새로운 html을 전송받아 웹페이지 전체를 처음부터 다시 렌더링하였다.
근데 이러한 방식에는 문제점이 있다.
1. 이전 웹페이지와 차이가 없어서 변경할 필요가 없는 부분까지 포함된 완전한 html을 서버로부터 매번 다시 전송받기 때문에 불필요한 데이터 통신 발생
2. 변경할 필요없는 부분까지 처음부터 다시 렌더링되는데 이로인하여서 화면 전환이 일어나면 화면이 순간적으로 깜빡이는 현상이 발생
3. 클라이언트와 서버와의 통신이 동기 방식으로 동작하기 때문에 서버로부터 응답이 있을때까지는 다음 처리는 블로킹됨.
근데 이러한 문제점 속에서 ajax의 등장으로 인하여 서버로부터 웹페이지의 변경에 필요한 데이터만 비동기 방식으로 전송받아서 웹페이지를 변경할 필요가 없는 부분은 다시 렌더링하지 않고, 변경할 필요가 있는 부분만 한정적으로 렌더링 하는 방식으로 바뀜 -> 퍼포먼스가 자연스러워짐.
장점으로는
1. 변경할 부분을 갱신하는데 필요한 데이터만 서버로부터 전송받기 때문에 불필요한 데이터 통신 발생x
2. 변경할 필요가 없는 부분은 다시 렌더링하지 않는다. 따라서 화면이 순간적으로 깜빡이지않음.
3. 클라이언트와 서버와의 통신이 비동기 방식으로 동작하기 때문에 서버에게 요청을 보낸 이후 블로킹 발생x
JSON은 클라이언트와 서버간의 HTTP통신을 위한 텍스트 데이터 포멧임. 자바스크립트에 종속되지않은 언어 독립형 데이터 포멧으로 대부분의 프로그래밍 언어에서 사용가능.
이러한 단순한 숫자가 더해지거나 빼지는 코드가 있다 이 코드를 돌리면 +버튼이나 -버튼을 누르면 에러가 발생하는데 이제 이 에러를 분석하자.
개발자도구의 console을 열어보면
Uncaught TypeError: Cannot set properties of null (setting 'innerHTML') at render (java.html:19:32) at $increase.onclick (java.html:25:13)
보면 에러가 발생하기는 했으나 html파일에 포함된 자바스크립트가 일부 실행된것은 확인했다.
에러 정보에보면 오른쪽에 에러발생위치를 나타내는 링크를 클릭해보면 자바스크립트 코드를 디버깅할수있는 source패널로 이동한다.
java.html:19
에러가 발생한 위치는
const render = function () { $counter.innerHTML = num; };
그리고 에러에 보면 Uncaught TypeError: Cannot set properties of null (setting 'innerHTML')라는 에러 정보가 표시되는데 이때 $counter변수의 값이 null인지 확인해보고 null이면 그 이유를 알아내서 에러가 발생한 원인을 제거해보자.
발생한 코드의 라인번호 클릭 후 다시 -버튼을 눌러보면 디버깅 모드로 들어가는데 이때 $counter에 커서를 두면 이것의 변수가 나오는데 이 값은 null 이였다.
하위 컴포넌트가 다이얼로그 하단에 렌더링되고, 실제 dialog컴포넌트를 사용하는 signupdialog컴포넌트를 살펴보면 Specialization을 위한 props인 title, message에 값을 넣어주고 있으며 사용자로 부터 닉네임을 입력받고 가입하도록 유도하기 위해 <input>과 버튼 태그가 들어있습니다 이 두개의 태그는 모두 props.children으로 전달되어 다이얼로그에 표시됩니다. 이러한 형태로 containment와 Specialization을 동시에 사용할 수 있습니다!!!!