Async Await을 이용하여 처리시 catch를 처리하지 않아 response 무한 대기 현상

개인적으로 Promise, callback 보다는 async await를 많이 이용한다.

const getSomething = asycn (req, res, next) => {

    const something = await callPromiseObject();

    res.json(something);
}

이와 같이 처리시 기본적으로는 큰 문제가 없지만, callPromiseObject() 를 실행하다 오류가 발생하면 response를 전송하지 못하여 무한 대기 하는 오류가 발생한다.

해결하는 방법은 몇가지가 있는데, 그중 하나는

const getSomething = asycn (req, res, next) => {
    try{
        const something = await callPromiseObject();

        res.json(something);
    }catch(e){
        next(e);
    }
}

이와 같이 try, catch를 이용하는 것이다. 개인적으로 동일한 코드가 계속 반복되어 좋아하는 스타일은 아니다.

또 다른 방법은 Promise를 이용하거나 callback을 이용하는 방식이다.

const asyncHandler = require('express-async-handler')

express.get('/', asyncHandler(async (req, res, next) => {
    const bar = await foo.findAll();
    res.send(bar)
}))

이런 방식으로 처리 하는 것인데, 미들웨어 코드를 보면 간단하다.

const asyncUtil = fn =>
function asyncUtilWrap(...args) {
  const fnReturn = fn(...args)
  const next = args[args.length-1]
  return Promise.resolve(fnReturn).catch(next)
}

module.exports = asyncUtil

개인적으로는 미들웨어를 사용하는 방식으로 좀더 쉬운듯 하여 찾아보니 다음과 같은 모듈도 있었다.

var express = require('express')
var wrap = require('async-middleware').wrap

var app = express()

app.use(wrap(function (req, res) {
  return Promise.reject(new Error('boom!'))
}))

참고자료

Posted by lahuman

댓글을 달아 주세요

서버시간을 KST로 변경하기

AWS의 ec2 서버를 생성하면 시간대가 UTC로 잡혀 있다.

이를 KST로 변경 하기 위해서는 다음 명령을 이용하면 된다.

ubuntu@ip-0-0-0-0:~/timezone$ date
Wed May 15 09:08:49 UTC 2019
ubuntu@ip-0-0-0-0:~/timezone$  cat /etc/localtime
TZif2UTCTZif2�UTC
UTC0
ubuntu@ip-0-0-0-0:~/timezone$ sudo rm /etc/localtime
ubuntu@ip-0-0-0-0:~/timezone$
ubuntu@ip-0-0-0-0:~/timezone$ sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
ubuntu@ip-0-0-0-0:~/timezone$
ubuntu@ip-0-0-0-0:~/timezone$ date
Wed May 15 18:09:45 KST 2019

타임존이 다를 경우 발생하는 가장 큰 문제는 다음과 같다.

  1. 배치 시간 문제
  2. 데이터 조회시 서버 시간 사용시 오류

서버 셋팅하고 나면 KST로 변경해야겠다.

Posted by lahuman

댓글을 달아 주세요

R에서 rJava 사용하기 위한 설치 진행

동시출현 단어에 대한 분석이 필요하여, 검색을 해보았다. R언에에서 간단하게 함수 호출로 처리가 가능하다는 것을 확인하였다.

R 설치 하기

How To Install R on Ubuntu 18.04 를 참조해서 R을 설치 했다 명령어를 따라만 해도 쉽게 설치가 된다.

# 서버 키값 추가
$> sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

# repository 추가
$> sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/'

$> sudo apt update

# R 설치
$> sudo apt install r-base

# R Command 접근
$> sudo -i R

필요 모듈 설치

네이버 블로그로 동시출현단어 분석 (co-occurence network anlysis)에서 힌트를 얻어서 R을 한번 진행하려고 하였는데, KoNLP 모듈의 설치에서 rJava를 설치하라는 문구를 만나며 맨붕에 빠지게 되었다.

JAVA 설치

처음 실패를 계기로 구글링을 하여 다음의 해결책을 찾게 되었다.
준비해야 할 것이 몇개 있는데 큰 예로 JDK 10, 11로는 실패 하였다.

그래서 JDK 8을 기반으로 진행하였다.
JDK8 설치는 How to Install Oracle Java JDK 8 / 10 in Ubuntu 18.04 를 참고하여 처리 하였다.

# repostiroy 추가 
$> sudo add-apt-repository ppa:webupd8team/java

# java8 설치
$> sudo apt-get install oracle-java8-installer

# java8을 기본으로 사용하도록 설정
$> sudo apt-get install oracle-java8-set-default

rJava 설치

설치를 하려고 하면 많은 오류를 확인 할수 있다.

Compiling rJava macOS, java8를 참고하여 설치를 하면된다.

#java config 재설정
$> sudo R CMD javareconf

# R Command 진입
$> sudo R
# rJava 설치 (특정 위치에서 - jdk8과 궁합이 맞는 패키지인듯)
R> install.packages("https://cran.r-project.org/src/contrib/Archive/rJava/rJava_0.9-9.tar.gz")

R에서 필요한 모듈 추가

이후 다른 패키지를 설치하기 위해서 다음 모듈을 설치해 두는 것이 좋다.

$> sudo apt-get install libcurl4-openssl-dev libssl-dev libxml2-dev

이후 필요한 패키지를 설치하면 문제 없이 설치 된다.

동시 출현 단어 분석 매트릭스

.R 스크립트를 인자와 함께 실행를 참고 하여 R 실행 파일을 만들고 실행을 하면 원하는 결과를 확인 가능하다.

#! /usr/bin/env Rscript

library(rvest)
library(KoNLP)
library(stringr)
library(tm)
library(qgraph)
library(dplyr)
library(networkD3)

useNIADic()

keyword <- "텍스트+분석"
url <- paste0("https://search.naver.com/search.naver?where=post&sm=tab_pge&query=", keyword, "&st=sim&date_option=0&date_from=&date_to=&dup_remove=1&post_blogurl=&post_blogurl_without=&srchby=all&nso=&ie=utf8&start=")
searching <- c()

for(page in seq(1, 100, by=10)) {
  page_url <- paste0(url, page)
  result <- read_html(page_url) %>%
    html_nodes(css='.sh_blog_passage') %>%
    html_text()
  # result <- iconv(result, "UTF-8", "CP949") # 윈도우의 경우, R 작업환경에 맞춰 CP949로 변경할 필요가 있습니다.
  searching <- c(searching, result)
  Sys.sleep(runif(1, 0, 1))
}

ko_words <- function(doc) {
  d <- as.character(doc)
  pos <- unlist(SimplePos22(d))

  extracted <- str_match(pos, '([가-힣]+)/[NP][A-Z]')

  keyword <- extracted[, 2]
  keyword[!is.na(keyword)]
}

texts <- searching %>%
  str_replace_all(pattern="\r", replacement="") %>%
  str_replace_all(pattern="\n", replacement=" ") %>%
  str_replace_all(pattern="[[:punct:]]", replacement=" ") %>%
  str_replace_all(pattern="[ㄱ-ㅎㅏ-ㅣ]+", replacement="") %>%
  str_replace_all(pattern="/", replacement=" ") %>%
  str_trim(side="both")

texts <- texts[texts != ""]

pos <- Map(ko_words, texts)


corpus <- Corpus(VectorSource(pos))
stopWord <- c("텍스트", "분석")
tdm <- TermDocumentMatrix(corpus, control=list(
  removePunctuation=TRUE, stopwords=stopWord,
  removeNumbers=TRUE, wordLengths=c(4, 10), weighting=weightBin))
tdm.matrix <- as.matrix(tdm)

word.count <- rowSums(tdm.matrix)
word.order <- order(word.count, decreasing=TRUE)
freq.words <- tdm.matrix[word.order[1:30], ]

co.matrix <- freq.words %*% t(freq.words)
print(co.matrix)

결과는 다음과 같이 표기 된다.

         Terms
Terms     데이터 c텍스트 분석하 통하 방법 마이닝 위하 기법 과정 가지 전처리
  데이터      26       4      5    5    6      1    3    3    3    2      3
  c텍스트      4      13      2    2    3      2    2    0    2    2      1
  분석하       5       2     11    2    3      1    2    1    0    1      0
  통하         5       2      2   11    2      1    1    2    0    0      0
  방법         6       3      3    2   10      1    0    2    1    1      1
  마이닝       1       2      1    1    1     10    1    1    1    0      0
  위하         3       2      2    1    0      1    9    1    1    0      1
  기법         3       0      1    2    2      1    1    7    0    0      1
  과정         3       2      0    0    1      1    1    0    7    0      3
  가지         2       2      1    0    1      0    0    0    0    6      0
  전처리       3       1      0    0    1      0    1    1    3    0      6
  활용         3       1      1    2    2      2    0    2    1    1      0
  대하         1       0      1    1    0      0    0    1    0    2      0
  아니         4       0      0    1    0      0    0    1    0    0      0
  요소         1       1      2    0    1      2    1    2    0    0      1
  내용         1       0      0    2    1      1    0    2    0    0      0
  수집         3       1      0    0    0      1    1    0    1    0      1
  의미         0       2      0    2    0      0    0    1    1    0      1
  철학         0       1      0    0    0      0    0    0    1    1      0
  텍스         1       2      0    0    1      0    0    0    1    1      1
  단어         0       0      0    0    0      1    0    0    0    0      1
  형태소       1       1      1    0    0      0    2    0    0    0      0
  형태         0       0      0    1    1      0    0    0    0    0      0
  단위         1       1      0    0    0      1    1    1    1    0      1
  연구         1       0      0    0    1      3    0    1    1    0      0
  결과         1       1      0    0    0      1    0    0    0    0      0
  사람         2       1      1    0    1      0    0    0    0    1      0
  주제         1       1      0    2    0      0    0    0    0    1      0
  작업         0       0      1    0    1      0    1    0    1    0      1
  c데이터      2       0      0    0    0      0    0    0    1    0      0
         Terms
Terms     활용 대하 아니 요소 내용 수집 의미 철학 텍스 단어 형태소 형태 단위
  데이터     3    1    4    1    1    3    0    0    1    0      1    0    1
  c텍스트    1    0    0    1    0    1    2    1    2    0      1    0    1
  분석하     1    1    0    2    0    0    0    0    0    0      1    0    0
  통하       2    1    1    0    2    0    2    0    0    0      0    1    0
  방법       2    0    0    1    1    0    0    0    1    0      0    1    0
  마이닝     2    0    0    2    1    1    0    0    0    1      0    0    1
  위하       0    0    0    1    0    1    0    0    0    0      2    0    1
  기법       2    1    1    2    2    0    1    0    0    0      0    0    1
  과정       1    0    0    0    0    1    1    1    1    0      0    0    1
  가지       1    2    0    0    0    0    0    1    1    0      0    0    0
  전처리     0    0    0    1    0    1    1    0    1    1      0    0    1
  활용       6    1    1    0    2    2    0    0    0    0      0    0    0
  대하       1    6    1    1    1    0    0    1    0    0      0    0    0
  아니       1    1    6    0    1    0    0    0    0    0      0    0    0
  요소       0    1    0    5    0    0    0    0    0    0      0    0    1
  내용       2    1    1    0    5    1    0    0    0    0      0    1    0
  수집       2    0    0    0    1    5    0    0    0    0      0    0    0
  의미       0    0    0    0    0    0    5    0    0    0      0    0    1
  철학       0    1    0    0    0    0    0    5    1    0      0    0    0
  텍스       0    0    0    0    0    0    0    1    4    1      0    0    0
  단어       0    0    0    0    0    0    0    0    1    4      1    0    0
  형태소     0    0    0    0    0    0    0    0    0    1      4    1    1
  형태       0    0    0    0    1    0    0    0    0    0      1    4    0
  단위       0    0    0    1    0    0    1    0    0    0      1    0    4
  연구       1    0    0    1    0    0    0    0    0    0      0    0    1
  결과       1    0    0    0    1    2    0    0    0    0      0    0    0
  사람       0    1    0    0    0    0    0    0    0    0      0    0    0
  주제       0    1    0    0    0    0    1    0    0    0      0    0    0
  작업       0    0    0    1    0    0    1    0    0    0      0    0    1
  c데이터    0    0    0    0    0    1    0    0    0    0      0    0    0
         Terms
Terms     연구 결과 사람 주제 작업 c데이터
  데이터     1    1    2    1    0       2
  c텍스트    0    1    1    1    0       0
  분석하     0    0    1    0    1       0
  통하       0    0    0    2    0       0
  방법       1    0    1    0    1       0
  마이닝     3    1    0    0    0       0
  위하       0    0    0    0    1       0
  기법       1    0    0    0    0       0
  과정       1    0    0    0    1       1
  가지       0    0    1    1    0       0
  전처리     0    0    0    0    1       0
  활용       1    1    0    0    0       0
  대하       0    0    1    1    0       0
  아니       0    0    0    0    0       0
  요소       1    0    0    0    1       0
  내용       0    1    0    0    0       0
  수집       0    2    0    0    0       1
  의미       0    0    0    1    1       0
  철학       0    0    0    0    0       0
  텍스       0    0    0    0    0       0
  단어       0    0    0    0    0       0
  형태소     0    0    0    0    0       0
  형태       0    0    0    0    0       0
  단위       1    0    0    0    1       0
  연구       4    0    0    0    0       0
  결과       0    4    0    0    0       1
  사람       0    0    4    1    0       0
  주제       0    0    1    4    0       0
  작업       0    0    0    0    4       0
  c데이터    0    1    0    0    0       4

참조 링크

Posted by lahuman

댓글을 달아 주세요