charcter-set을 utf8로 변경 했는데 insert문을 실행하면 ?? 이렇게 물음표가 들어갔다.

이는 character set을 변경하지 전에 데이터베이스를 생성했었기 때문에 해당 데이터베이스의 character set은 변경되지 않아서 그런것입니다.

사실 이 부분에서 몇몇분은 데이터 덤프 빼놓고 다시 하시는 분들도 계시더라고요.

그리고 저는 mysql workbench에서 변경을 했는데도 계속 ?? 물음표가 들어갔습니다. 

DB와 모든 테이블에 대해서 character-set을 바꿔줘야 합니다. 조금 많이 번거롭습니다. 그래서 테이블이 많으면 그냥 다시 만드나 봅니다.

밑에 두개를 실행해 줍니다.

ALTER DATABASE [DB명] DEFAULT CHARACTER SET UTF8

ALTER TABLE [TABLE명] CONVERT TO CHARACTER SET UTF8;

해줬더니 잘 들어가네요 

비주얼 스튜디오 코드를 다운 받으면 한글패치가 되지 않은 영문판이 실행됩니다.

당황하지않고 code 에디터 안에 마켓플레이스에서 Korean Language Pack for Visual Studio Code를 설치해주면 됩니다.

영문판이니 install 누르시고 code를 껏다 키면 한글판 패치가 되어있을겁니다.

 

개발하면서 로그인을 구현하다보니 인증코드를 인증하려면 잠시 인증코드를 보관해야할 일이 생겼습니다. 그래서 잠깐 테스트 용도로 memory-cache로 코드를 짰는데 저는 Node.js 개발자가 아니다 보니깐 확인해보니 캐시에 저장하고 다른 함수에서 불러왔더니 cache가 사라져있더라고요. 정말 난감했었는데 어차피 Redis로 해야되니 Redis로 연동해보려고 합니다. Redis는 공식적으론 windows를 지원하지 않습니다만 MS Open Tech에서 개발 및 유지보수를 진행하고 있습니다. 참고로 64bit만 지원합니다.

먼저 Node.js 기본 모듈이니 express가 아니니 새로 package를 받아줘야합니다.

npm install redis

이렇게만하면 Node.js에서는 사용이 가능합니다. Redis도 DB이기 때문에 mysql이랑 연결코드가 비슷합니다.

const redis = require("redis");
const client = redis.createClient(6379, "127.0.0.1");

createClient 괄호 안은 port , host 순입니다. 나머지는 더 자세하게 알지 못하기 때문에 패스...

아무튼 이렇게 하면 redis에 접속하여 redis의 내장함수를 사용할 수 있습니다. 

예를들어 

      client.get(phone, function (err, value) {
        console.log(value);
      });

이런식으로 해당 phone이 키값이 되고 그에 대응하는 value 가 나와서 value 변수에 담깁니다.

여기까지가 node에서 redis를 사용하는 방법입니다. 

 

 

초보 입장으로 Api 사용하는 게 어렵습니다. 저는 Node.js 개발자가 아니라서 조금 어려웠습니다.

보통 회원가입이나 인증할때 많이 쓰는데요. 다른 방법도 많지만 가장 기본적인 SMS를 통한 인증을 포스팅하려고 합니다.

추후에 카카오톡이나 FCM으로 구현한 것을 포스트 하겠습니다.

우선 네이버 클라우드 플랫폼을 가입합니다. 

www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

회원가입을 한 후 콘솔 눌러서 들어옵니다.

그 후 콘솔에서 Products & Service 에서  Simple & Easy Notification Service 를 찾아줍니다.

컨트롤 + F 해서 찾으면 빠르겠죠?

우선 프로젝트부터 생성 합니다. PUSH , SMS Biz Message 3개가 있는데 오늘은 SMS만 사용할 겁니다.

생성을 하면 밑에 이미지처럼 나옵니다. 그러면 구석에 서비스 ID를 클릭해서 OPEN API Key ID를 복사해둡니다.

 

다음은 인증키를 준비해야합니다.

www.ncloud.com/mypage/manage/authkey

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

위에 링크를 들어가서 PW를 입력하면 밑에 인증키가 없이 나옵니다. 생성하시면 인증키가 만들어지는데

Access Key ID, Secret Key 복사 해둡니다.

이제부턴 API를 참조하면서 해야합니다.

apidocs.ncloud.com/ko/ai-application-service/sens/sms_v2/

 

SMS API v2 가이드 - API 참조서

기본 정보 API URL https://sens.apigw.ntruss.com/sms/v2 항목 Mandatory 설명 Content-Type Mandatory 요청 Body Content Type을 application/json으로 지정 (POST) x-ncp-apigw-timestamp Mandatory 1970년 1월 1일 00:00:00 협정 세계시(UTC)부��

apidocs.ncloud.com

우선 서버단에서 만들어줘야하니깐 헤더는 우선 이렇습니다.

request 보낼때 같이 보낼 body 부분 입니다.

사실 복잡한 것 같지만 실제 코드로 보면 간단합니다.

네이버는 시그니처키를 만들어줘서 보내야합니다. 사실 저는 아직 여기까지 이해하지 않았기 때문에 그냥 시키는대로 만들었습니다. HmacSHA256으로 암호화한 후 Base64로 인코딩합니다.

apidocs.ncloud.com/ko/common/ncpapi/

 

NAVER CLOUD PLATFORM API - API 참조서

개요 네이버 클라우드 플랫폼에서 제공하는 인프라/솔루션 상품을 이용할 수 있도록 지원하는 응용 프로그램 인터페이스(Application Programming Interface, API) 제공하고 있습니다. 본 페이지에서는 NAVE

apidocs.ncloud.com

 

준비는 끝났습니다. 코드만 작성하면 됩니다. 그렇기 때문에 header와 body만 잘 적어주면 됩니다.

시그니처 생성 방법을 모르시겠으면 제 코드 참고하시면 좋겠네요.

var CryptoJS = require("crypto-js");
var SHA256 = require("crypto-js/sha256");
var Base64 = require("crypto-js/enc-base64");

function send_message(phone) {
  var user_phone_number = phone;
  var user_auth_number = Math.random().toString(36).slice(2);
  var resultCode = 404;

  const date = Date.now().toString();
  const uri = "service ID 채워넣으세요~";
  const secretKey = "secret key ID 채워넣으세요~";
  const accessKey = "access key ID 채워넣으세요~";
  const method = "POST";
  const space = " ";
  const newLine = "\n";
  const url = `https://sens.apigw.ntruss.com/sms/v2/services/${uri}/messages`;
  const url2 = `/sms/v2/services/${uri}/messages`;

  const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey);

  hmac.update(method);
  hmac.update(space);
  hmac.update(url2);
  hmac.update(newLine);
  hmac.update(date);
  hmac.update(newLine);
  hmac.update(accessKey);

  const hash = hmac.finalize();
  const signature = hash.toString(CryptoJS.enc.Base64);

  request(
    {
      method: method,
      json: true,
      uri: url,
      headers: {
        "Contenc-type": "application/json; charset=utf-8",
        "x-ncp-iam-access-key": accessKey,
        "x-ncp-apigw-timestamp": date,
        "x-ncp-apigw-signature-v2": signature,
      },
      body: {
        type: "SMS",
        countryCode: "82",
        from: "발신번호 입력하세요~~",
        content: `인증번호 ${user_auth_number} 입니다.`,
        messages: [
          {
            to: `${user_phone_number}`,
          },
        ],
      },
    },
    function (err, res, html) {
      if (err) console.log(err);
      else {
        resultCode = 200;
        console.log(html);
      }
    }
  );
  return resultCode;
}

풀 코드입니다. 제가 자바스크립트 개발자가 아니라서 조금 불편했습니다. 이거를 안드로이드 어플과 연동하여서 사용하면 될 것 같습니다. 

모듈은 npm install로 설치해 주셔야 합니다.

Ubuntu Server 20.04 LTS IP 고정 할당 입니다.

대부분 DHCP 만 썼었는데 서버인 만큼 IP 고정 할당을 해보려고 합니다.

우선 root 계정으로 하거나 아니면 vi 할때 sudo 추가 하셔야 됩니다.(root 권한으로 안하면 변경이 안됩니다.)

vi /etc/netplan/00-installer-config.yaml

※ 마지막 파일은 다를수도 있습니다. cd로 가서 ls 해보는걸 추천.

vi로 들어가면 밑에 사진 처럼 나옵니다.

그러면 dhcp4를 지워지고 밑에 정보를 추가해주시면 됩니다.

addresses와 gateway4는 자신의 환경에 맞춰서 변경 해주세요

network:
  ethernets:
    ens160:
      addresses:
      - 192.168.1.60/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
        - 8.8.8.8
        search:
        - 8.8.4.4
  version: 2

그리고 변경하고 나와서

netplan apply 명령어 실행하시면 됩니다.

nodemon은 디렉토리의 파일 변경이 감지되면 노드 애플리케이션을 자동으로 다시 시작하여 node.js 기반 애플리케이션을 개발하는 데 도움이되는 도구입니다.

그렇기 때문에 소스를 변경하면 다시 끄고 시작하지 않아도 됩니다. 

npm install -g nodemon

https://www.npmjs.com/package/nodemon

 

nodemon

Simple monitor script for use during development of a node.js app.

www.npmjs.com

 

TextInputEditText hint

TextInputEditText 클릭하면 힌트가 위로 올라가면서 작아집니다.

우선 이 색상을 선택하려면 TextInputLayout 태그에서 app:hintTextColor 속성을 선택해주면 됩니다.

app:hintTextColor="@color/color_4b6d9d" 이런식으로 속성을 정의 해주시면 됩니다.

 

TextInputEditText 커서 

우선 조금 특이한점은 color로 설정하는 것이 아닌 drawable로 설정해야 합니다. 

즉 xml 파일입니다. 그리 어려운건 아닙니다. 밑에 처럼 xml 파일 만들고 코딩하면 됩니다. 색상도 color로 속성으로 지정하면 됩니다.

TextInputEditText 안에 android:textCursorDrawable="@drawable/cursor_color" 이런식으로 속성을 정의 해주시면 됩니다. 

 

TextInputEditText 밑줄

밑줄은 TextInputEditText 태그에서 android:backgroundTint="@color/color_4b6d9d" 속성을 정의해주시면 됩니다.

 

 

정리하자면 밑에 그림을 참고하시면 됩니다.

 

 

+ Recent posts