Application - gksrlfw/study GitHub Wiki

Application

Authentication

μΏ ν‚€

μ„œλ²„λŠ” μΏ ν‚€λ₯Ό μ΄μš©ν•΄μ„œ μœ μ €μ˜ λΈŒλΌμš°μ €μ— 데이터λ₯Ό 넣을 수 μžˆμŠ΅λ‹ˆλ‹€. μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ μ„œλ²„μ—μ„œλŠ” μš”μ²­μ— λŒ€ν•œ 데이터와 ν•¨κ»˜ λΈŒλΌμš°μ €κ°€ μ €μž₯ν–ˆμœΌλ©΄ ν•˜λŠ” 데이터λ₯Ό 쿠킀에 λ„£μ–΄μ„œ μ‘λ‹΅ν•©λ‹ˆλ‹€. λΈŒλΌμš°μ €μ— μ €μž₯된 μΏ ν‚€λŠ” μœ μ €κ°€ μ›Ήμ‚¬μ΄νŠΈμ— λ°©λ¬Έν•  λ•Œ λ§ˆλ‹€ μš”μ²­κ³Ό ν•¨κ»˜ λ³΄λ‚΄μ§€κ²Œ λ˜μ–΄ 인증, λ‹€κ΅­μ–΄ λ“± μ—¬λŸ¬ κΈ°λŠ₯을 μ œκ³΅ν•  수 있게 λ©λ‹ˆλ‹€.

μ„Έμ…˜

HTTP μš”μ²­μ€ stateless 둜 λͺ¨λ“  μš”μ²­μ€ λ…λ¦½μ μž…λ‹ˆλ‹€. μ›Ήμ„œλΉ„μŠ€κ°€ λ³΅μž‘ν•œ μš”κ΅¬μ‚¬ν•­μ„ λ°›κ²Œ λ˜λ©΄μ„œ μƒνƒœλ₯Ό μ €μž₯ν•  수 μžˆλŠ” κΈ°λŠ₯이 μš”κ΅¬λ˜μ—ˆκ³  μ—¬κΈ°μ„œ μ„Έμ…˜μ΄ μ‚¬μš©λ©λ‹ˆλ‹€. μœ μ €κ°€ λ‘œκ·ΈμΈν•˜λ©΄ μ„œλ²„λŠ” μ„Έμ…˜ DB 에 μœ μ € 정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μ„Έμ…˜ ID λŠ” μΏ ν‚€λ₯Ό 톡해 λΈŒλΌμš°μ €μ— μ €μž₯되고, μ›Ήμ‚¬μ΄νŠΈμ—μ„œ μš”μ²­μ„ λ³΄λ‚Όλ•Œλ§ˆλ‹€ ν•¨κ»˜ λ³΄λ‚΄μ§€κ²Œ 되고, μ„œλ²„λŠ” μ„Έμ…˜ ID λ₯Ό 톡해 μ„Έμ…˜ DB 에 μœ μ €κ°€ μžˆλ‹€λ©΄ μ›ν•˜λŠ” μš”μ²­μ— λŒ€ν•œ 응닡을 ν•΄μ€λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ“  μœ μ € μ •λ³΄λŠ” μ„œλ²„μ— 있게되고, μœ μ €λŠ” 였직 μ„Έμ…˜ ID 만 κ°–μŠ΅λ‹ˆλ‹€.

즉, μ„œλ²„λŠ” λͺ¨λ“  μš”μ²­μ— λŒ€ν•΄ 쿠킀에 μžˆλŠ” μ„Έμ…˜ ID λ₯Ό 확인해야 ν•˜κ³ , μ΄λŠ” μ„œλΉ„μŠ€κ°€ 컀질수둝 DB 에 κ±Έλ¦¬λŠ” λΆ€ν•˜κ°€ μ¦κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€. 이λ₯Ό ν•΄μ†Œν•˜κΈ° μœ„ν•΄ μ„Έμ…˜ DB λŠ” redis 같은 인 λ©”λͺ¨λ¦¬ db λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€. (확인 ν•„μš”.)

토큰

μ„Έμ…˜κ³Ό 인증 과정은 λΉ„μŠ·ν•©λ‹ˆλ‹€. ν˜„μž¬ μƒκ°ν•˜κ³  μžˆλŠ” 인증과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 졜초 둜그인 μ‹œμ— access token, refresh token 이 λ°œκΈ‰λ©λ‹ˆλ‹€.

  2. access token 은 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ, refresh token 은 별도 μ €μž₯μ†Œμ— μ €μž₯λ©λ‹ˆλ‹€.

    (Todo. ν† ν°μ˜ νƒˆμ·¨κ°€λŠ₯μ„± λ•Œλ¬Έμ— access token 의 λ§Œλ£ŒκΈ°ν•œμ„ 짧게 κ°–κ³  refresh token 을 μ΄μš©ν•˜λŠ” κ²ƒμœΌλ‘œ μ•Œκ³ μžˆμŠ΅λ‹ˆλ‹€. refresh token 도 ν•¨κ»˜ ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ³΄λ‚΄λŠ” μ˜ˆμ‹œλ„ λ³΄μ•˜λŠ”λ° λͺ…ν™•ν•œ μ΄μœ κ°€ μžˆλŠ” ν–‰μœ„μΈμ§€ 확인해야 ν•©λ‹ˆλ‹€. BP κ°€ ν•„μš”ν•©λ‹ˆλ‹€...)

  3. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 둜그인이 ν•„μš”ν•œ κΈ°λŠ₯을 μš”μ²­ν•˜λŠ” 경우 access token 을 λ³΄λƒ…λ‹ˆλ‹€.

  4. access token 이 μœ νš¨ν•˜κ³  κΈ°ν•œμ΄ λ§Œλ£Œλ˜μ—ˆμ„ κ²½μš°μ—λ§Œ refresh token 을 ν™•μΈν•©λ‹ˆλ‹€. 만일 refresh token 이 μ‚­μ œλ˜μ—ˆκ±°λ‚˜ λ§Œλ£Œλ˜μ—ˆλ‹€λ©΄ λ‘œκ·Έμ•„μ›ƒ μ‹œν‚΅λ‹ˆλ‹€. μ•„λ‹Œ κ²½μš°μ—λŠ” access token 을 μž¬λ°œκΈ‰ ν•΄μ€λ‹ˆλ‹€.

  5. refresh token 의 μœ νš¨κΈ°ν•œμ„ ν™•μΈν•œ ν›„, 일정 κΈ°κ°„ 이내이면 μž¬λ°œκΈ‰ν•©λ‹ˆλ‹€.

    (Todo. κ³„μ†ν•΄μ„œ λ‘œκ·ΈμΈμ„ μ΄μ–΄λ‚˜κ°€λ €λ©΄ refresh token 도 μž¬λ°œκΈ‰μ΄ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ–΄λŠ μ‹œκΈ°μ―€μ— refresh token 을 μž¬λ°œκΈ‰ ν•΄μ•Όν•˜λŠ”μ§€... BP κ°€ ν•„μš”ν•©λ‹ˆλ‹€...)

refresh token 의 λ§Œλ£ŒκΈ°ν•œμ΄ μ§€λ‚ λ•ŒκΉŒμ§€ 둜그인 μš”μ²­μ΄ λ“€μ–΄μ˜€μ§€ μ•Šμ•˜λ‹€λ©΄ 은 λ§Œλ£ŒκΈ°ν•œμ΄ μ§€λ‚˜λ©΄ (그리고 λ‘œκ·Έμ•„μ›ƒ μ‹œμ—λ„ μ‚­μ œλ¨) μ‚­μ œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. redis 같은 ttl 이 μžˆλŠ” DB 에 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. access token 이 λ§Œλ£Œλ˜μ—ˆμ„ λ•ŒλŠ” refresh token 을 μ°ΎκΈ° μœ„ν•΄μ„œ db λ₯Ό ν™•μΈν•΄μ•Όν•˜μ§€λ§Œ, λ§€ μš”μ²­ μ‹œμ— DB 에 μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” μ„Έμ…˜ λ°©μ‹λ³΄λ‹€λŠ” μ ‘κ·Ό νšŸμˆ˜κ°€ μ€„μ–΄λ“­λ‹ˆλ‹€.

date & time

νƒ€μž„μ‘΄(timezone) μ΄λž€?

νƒ€μž„μ‘΄μ€ λ™μΌν•œ 둜컬 μ‹œκ°„μ„ λ”°λ₯΄λŠ” 지역을 μ˜λ―Έν•˜λ©°, ν•΄λ‹Ή ꡭ가에 μ˜ν•΄ λ²•μ μœΌλ‘œ μ§€μ •λ©λ‹ˆλ‹€.

GMT λŠ” λŸ°λ€μ„ 기점, 웰링턴을 μ’…μ μœΌλ‘œν•˜λŠ” ꡭ제 ν‘œμ€€μ‹œμž…λ‹ˆλ‹€. UTC λŠ” GMT 라고도 뢈리며, 초의 μ†Œμˆ«μ  λ‹¨μœ„μ—μ„œλ§Œ 차이가 λ‚˜κΈ° λ•Œλ¬Έμ— μΌμƒμ—μ„œλŠ” 혼용, 기술적인 ν‘œκΈ°μ—μ„œλŠ” UTC κ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

λŒ€ν•œλ―Όκ΅­μ€ UTC+09:00 을 ν‘œμ€€μœΌλ‘œ ν•˜κ³ , KST 라고 λΆ€λ¦…λ‹ˆλ‹€.

νƒ€μž„μ‘΄ μ„€μ •

μ„œλ²„ κ°œλ°œμ„ ν•  λ•Œ, OS, application server, database μ„Έκ°€μ§€μ˜ νƒ€μž„μ‘΄μ„ λ™μΌν•˜κ²Œ μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€. 일반적으둜 μ„œλ²„μ™€ DB 의 νƒ€μž„μ‘΄μ€ OS 의 νƒ€μž„μ‘΄μ„ λ”°λΌκ°‘λ‹ˆλ‹€.

  1. OS νƒ€μž„μ‘΄ 확인 및 μ„€μ •
date
timedatectl set-timezone Asia/Seoul
timedatectl set-timezone Etc/UTC

2-1. mysql νƒ€μž„μ‘΄ 확인 및 μ„€μ • (쿼리 이용)

SELECT @@GLOBAL.time_zone, @@SESSION.time_zone, @@system_time_zone;

Set global time_zone='Asia/Seoul';
Set time_zone='Asia/Seoul';

Set global time_zone='UTC';
Set time_zone='UTC';
  • 기본적으둜 SYSTEM 이라 ν‘œκΈ°λ˜μ–΄ 있으며, μ΄λŠ” OS 섀정을 λ”°λ₯Έλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

2-2. mysql νƒ€μž„μ‘΄ 확인 및 μ„€μ • (config 파일 이용)

λ¨Όμ € my.cnf 파일 μœ„μΉ˜λ₯Ό ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€.

mysqld --verbose --help | grep -A 1 'Default options'

config λ₯Ό μΆ”κ°€ν•˜κ³  restart λ₯Ό ν•΄μ€˜μ•Όν•©λ‹ˆλ‹€.

[mysqld]
default-time-zone="+9:00"

  1. μ„œλ²„ νƒ€μž„μ‘΄ 확인 및 μ„ΈνŒ… (Nodejs)

기본적으둜 nodejs 의 Date() κ°μ²΄λŠ” OS 와 상관없이 UTC λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. dayjs λŠ” OS 의 νƒ€μž„μ‘΄μ„ λ”°λΌκ°‘λ‹ˆλ‹€.

dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.tz.setDefault('Asia/Seoul');
  1. mysql 라이브러리 νƒ€μž„μ‘΄ μ„ΈνŒ… (typeorm)

λΌμ΄λΈŒλŸ¬λ¦¬λ‹¨μ—μ„œλ„ νƒ€μž„μ‘΄μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (https://github.com/mysqljs/mysql)

timezone: The timezone configured on the MySQL server. This is used to type cast server date/time values to JavaScript Date object and vice versa. This can be 'local', 'Z', or an offset in the form +HH:MM or -HH:MM. (Default: 'local')

mysql 의 datetime 은 νƒ€μž„μ‘΄μ„ κ°–κ³ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ‹€μ œ mysql μ„œλ²„λŠ” UTC 둜 μ„€μ •λ˜μ–΄μžˆμ§€λ§Œ 라이브러리의 νƒ€μž„μ‘΄μ„ KST 둜 μ„€μ •ν•  경우 λ°μ΄ν„°λŠ” KST 둜 λ³€κ²½λ˜μ–΄ μ €μž₯λ˜λ―€λ‘œ μΌμΉ˜μ‹œμΌœμ€˜μ•Όν•©λ‹ˆλ‹€.

date & time ν‘œκΈ°

ISO 8601

λ‚ μ§œμ™€ μ‹œκ°„μ˜ ν‘œκΈ°μ— κ΄€ν•œ ꡭ제 ν‘œμ€€ κ·œκ²©μž…λ‹ˆλ‹€. UTC, timezone κ³Ό ν•¨κ»˜ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ μ‹œκ°„μ„ ν‘œν˜„ν•©λ‹ˆλ‹€.

ex) 2021-11-06T09:36:22+09:00 : UTC κΈ°μ€€μœΌλ‘œ 9μ‹œκ°„ 만큼 λΉ λ¦…λ‹ˆλ‹€.

ex) 2021-11-06T09:36:22z : UTC κΈ°μ€€μ‹œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

ex) 2021-11-06T09:36:22+00:00 : UTC κΈ°μ€€μ‹œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

Monkey patching

λͺ½ν‚€νŒ¨μΉ­μ€ λŸ°νƒ€μž„ μ€‘μ—μ„œ μ‹€ν–‰ 쀑인 μΈμŠ€ν„΄μŠ€μ—λ§Œ 영ν–₯을 μ€€ μ±„λ‘œ λͺ¨λ“ˆμ΄λ‚˜ 클래슀λ₯Ό λ³€κ²½ν•˜λŠ” 행동을 μ˜λ―Έν•©λ‹ˆλ‹€. μΌλ°˜μ μœΌλ‘œλŠ” μΆ”μ²œν•˜μ§€ μ•ŠλŠ” 방법이고, μ‹€μ œ 쒅속성 νŒ¨ν‚€μ§€μ— PR 을 λ³΄λ‚΄κ±°λ‚˜ 자체 λͺ¨λ“ˆμ„ λ§Œλ“€μ–΄μ„œ λͺ½ν‚€νŒ¨μΉ­μ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 주둜 ν”„λ‘œν† νƒ€μž…μ— νŠΉμ • λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  λ•Œ ν˜Ήμ€ polyfil ν•¨μˆ˜λ₯Ό 생성할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

Array.prototype.last = () => {
  return this[this.length - 1];
}

GIS

https://blog.hkwon.me/draw-korean-map-chart-with-geojson/

https://github.com/Seunghyum/SGIS-shpToGeojson

http://13.124.212.92/%ED%99%95%EB%B3%B4%ED%95%9C-shp%EC%9D%B4-%ED%95%9C%EA%B8%80%EC%9D%B4-%EA%B9%A8%EC%9E%90%EA%B1%B0%EB%82%98-%EC%A2%8C%ED%91%9C%EA%B3%84%EB%A5%BC-%EC%A7%80%EC%A0%95%ED%95%B4%EB%8B%AC%EB%9D%BC%EB%8A%94/

https://www.northrivergeographic.com/loading-data-into-postgis-using-ogr

곡곡데이터 λ‹€μš΄λ‘œλ“œ -> QGIS EUC-KR 인코딩, μ’Œν‘œκ³„ EPSG:5174 둜 λ³€κ²½ -> mysql or postgresql

ogr2ogr -f PostgreSQL -t_srs EPSG:4326 PG:"host=localhost user=seohangil dbname=example schemas=example" a2.shp -nln gis2 -skipfailures -lco precision=YES

μ’Œν‘œκ³„ κ²½μœ„λ„ λ³€κ²½

import proj4 from 'proj4';

const exec = (async () => {

  //http://openapi.nsdi.go.kr/nsdi/eios/OperationSumryDetail.do
  //http://www.gisdeveloper.co.kr/?p=8942
  // epsg:5174 EPSG:5174
  const a = '+proj=tmerc +lat_0=38 +lon_0=127.0028902777778 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs +towgs84=-115.80,474.99,674.11,1.16,-2.31,-1.63,6.43'
  const wgs84 = '+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees';

  const result = proj4(a, wgs84, [195544.585799999535084, 447909.182499999180436]);
  // 198024.045800000429153
  // const result = proj4(grs80UtmK, wgs84, [217926.864799999631941, 415204.857499999925494]);
  console.log('proj4 result =', result);
})();

μŠ¬λž™

https://api.slack.com/

Workspace 내에 μ—¬λŸ¬ 앱을 생성할 수 있고, 이 앱을 μ΄μš©ν•˜μ—¬ μŠ¬λž™μœΌλ‘œ λ©”μ„Έμ§€λ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.

web api 예제

import { WebAPICallResult, WebClient } from '@slack/web-api';
export class SlackService {
  private token = process.env.SLACK_WEB_API_TOKEN;
  private web: WebClient;

  constructor(private readonly logger: Logger) {
    this.web = new WebClient(this.token);
  }

  postMessage(text: SlackMessage, channel: SlackChannel | string, username: SlackUsername | string): Promise<WebAPICallResult> {
    return this.web.chat.postMessage({
      text: text.toString(),
      asUser: true,
      channel,
      username,
    });
  }
}

todo

changeName(name: string) {
  return UserCreate.builder().name(name).build();
}
```