[글쓴이:] doogle

  • 알아두면 편리한 정규표현식 모음 (계속 수정 예정)

    정규 표현식은 참 손에 안잡히는 주제중 하나죠. 이걸 꿰차면 상당히 프로그래밍 할때 막히는 부분이 줄어들겠지만 쉽게 이해 되지 않는 것도 사실입니다. 그래서 각 경우에 따른 표현식 모음을 작성하기로 해봤는데요. 앞으로도 작업하다가 마주치는 정규 표현식을 적어둘 예정입니다.

    1. 주소에서 맨 끝에 괄호 추가정보 제거하기

    네이버지도 API가 이전 및 유료화 되면서 대안으로 다음 지도 API 를 사용하면서 생긴 문제입니다.
    현재 주소를 저장할 때 1차, 2차로 나눠서 1차는 도로명주소로 저장하는데요. 정식 도로명 주소가 아직은 익숙하지 않기 때문에 맨뒤에 괄호'(…)’로 구분에 동이름이나 건물명등을 넣어 보완하고 있습니다.

    이렇게 저장한 1차 주소를 이용해 카카오지도로 연결하면 문제가 발생하는 경우가 있습니다. 웹버전의 카카오지도에서는 크게 문제 없이 바로 지도가 나오는데요. 모바일 카카오지도앱의 경우 정식 도로명주소 뒤에 추가정보가 붙으면 그냥 지도를 보여주지 않고 주소 선택하는 페이지가 먼저 뜹니다. 이게 은근히 불편하더라고요. 그래서 바로 지도를 보여줄 수 있도록 하기 위해서 맨뒤에 괄호 추가 정보를 제거하는 정규 표현식 입니다.

    // 예제 주소 문자열 : "제주특별자치도 제주시 첨단로 242 (영평동)"
    // 예상 결과 : "제주특별자치도 제주시 첨단로"
    
    // Javascript
    "제주특별자치도 제주시 첨단로 242 (영평동)".replace(/\s+\(.+\)$/g, '')
    
    // 주소 맨끝에 빈칸으로 구분한 괄호만을 찾기 위해 : \s+ 
    // 빈칸을 \s 로 표현했다. 뒤에 + 는 앞의 문자가 1개나 그이상 오는 것을 표현한다. 사실 이부분은 그다지 필요없는 부분이다.
    // 괄호 및 괄호내 내용 : \(.+\)
    // 괄호는 이스케이프 문자로 표현하고 괄호 안의 내용은 .+ 로 표현했다. 점(.)은 모든 문자 하나를 표현하고 + 는 앞 문자의 1개나 그이상의 문자를 표현한다.
    // 주소 맨끝의 괄호내용만 찾기위한 $
    // 문자열 전체 적용을 위한 플래그 g
    

    테스트하기 : https://regex101.com/r/9G7rLQ/3

    정규 표현식 관련 알기 쉽게 설명이 나온 글입니다 참조하시기 바랍니다 : https://medium.com/@originerd/정규표현식-좀-더-깊이-알아보기-5bd16027e1e0

    정규표현식 테스트 및 분석하기 좋은 사이트 : https://regex101.com/

  • 몽고디비 서버가 구동되지 않는 오류 해결하기

    개발중인 프로젝트에 도커를 도입하려고 하는데 몽고디비까지 추가해보려고 하다가 원래대로 되돌리려는 중 오류가 발생했습니다.

    몽고디비를 아래과 같이 시작해보면 아무런 반응이 없네요.

    $ sudo systemctl start mongod

    현재 서비스 상태를 확인해 봅니다.

    $ sudo systemctl status mongod
    ● mongod.service - MongoDB Database Server
       Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
       Active: failed (Result: exit-code) since Fri 2019-04-19 14:00:59 KST; 3min 45s ago
         Docs: https://docs.mongodb.org/manual
      Process: 7925 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=100)
     Main PID: 7925 (code=exited, status=100)
          CPU: 21ms
    
     4월 19 14:00:59 doogle-ubuntu systemd[1]: Started MongoDB Database Server.
     4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Main process exited, code=exited, status=100/n/a
     4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Unit entered failed state.
     4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Failed with result 'exit-code'.

    서비스가 실패상태입니다. 당연히 몽고디비 서버는 떠있지 않네요.

    로그 기록을 확인해 보면…

    $ sudo tail mongod.log 
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] build environment:
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     distmod: ubuntu1604
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     distarch: x86_64
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     target_arch: x86_64
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1", port: 27017 }, processManagement: { timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongodb", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
    2019-04-19T14:00:59.937+0900 I STORAGE  [initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /var/lib/mongodb, terminating
    2019-04-19T14:00:59.937+0900 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
    2019-04-19T14:00:59.937+0900 I NETWORK  [initandlisten] removing socket file: /tmp/mongodb-27017.sock
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] now exiting
    2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] shutting down with code:100

    밑에서 5번째 줄을 보면 원인을 확인 할 수 있습니다.

    Attempted to create a lock file on a read-only directory: /var/lib/mongodb, terminating

    /var/lib/mongodb 디렉토리가 읽기만 가능해서 lock 파일을 생성할 수 없는거 같네요.

    경로 권한을 확인해 봅니다.

    $ sudo ls -al
    ... (중략)...
    drwxr-xr-x  4           999 mongodb       32768  4월 19 13:34 mongodb/
    ... (중략)...

    보시는 바와 같이 디렉토리 및 하위 파일들 포함 모두 사용자가 바뀌었습니다. 아무래도 도커버전의 몽고디비가 한 짓(?)인거 같네요.

    다음과 같이 권한을 복구해 줍니다.

    $ sudo chown -R mongodb:mongodb mongodb

    이제 다시 서비스를 시작하면 되겠습니다.

    $ sudo systemctl start mongod

    서비스 상태를 봐보면 정상적으로 구동중이라는 것을 확인할 수 있습니다.

    $ sudo systemctl status mongod
    ● mongod.service - MongoDB Database Server
       Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2019-04-19 14:20:36 KST; 13s ago
         Docs: https://docs.mongodb.org/manual
     Main PID: 9963 (mongod)
        Tasks: 27
       Memory: 148.4M
          CPU: 926ms
       CGroup: /system.slice/mongod.service
               └─9963 /usr/bin/mongod --config /etc/mongod.conf
    
     4월 19 14:20:36 doogle-ubuntu systemd[1]: Started MongoDB Database Server.

    리눅스에서는 항상 파일 권한 문제가 생길 수 있습니다. 주의하시기 바랍니다.

  • Docker Composer 오류 해결하기 – services.server.build contains unsupported option: ‘image’

    아래와 같이 docker-composer 실행하면 바로 에러가 뜨는 경우가 있는데요.

    ERROR: The Compose file './docker-compose.yml' is invalid because:
    services.server.ports contains an invalid type, it should be an array
    services.server.build contains unsupported option: 'image'
    (더 보기…)
  • axios 사용시 폼 데이터 전송하기 (+파일 업로드)

    axios 사용시 폼 데이터 전송하기 (+파일 업로드)

    axios 의 post 기능은 기본적으로 폼 데이터 전송방식을 사용하지 않기 때문에 서버쪽에서 파라메터를 받는 부분을 수정할 수 없는 상황이라면 문제가 됩니다. 보통 외부 API 서비스를 사용할 때 많이 발생하지요.

    // 보통 axios 는 아래와 같이 보내게 된다. 
    // 이렇게 보내면 폼 전송형식이 아닌 JSON 포맷으로 전송하게 된다.
    axios.post('https://domain/form-post-url', {
      name: '이름'
      key: '값'
    }).then((response) => {
      // 응답 처리
    })
    .catch((error) => {
      // 예외 처리
    })
    (더 보기…)
  • SEO 최적화 ~ 워드프레스처럼 구글에서 검색잘되는 사이트 만들기

    현재 이 사이트는 워드프레스 기본 테마로 제작한 상태이다.

    구글에서 검색해보면 현재 상당히 잘 뜨고 있다. ^ㅇ^/
    물론 아직 방문객이 별로 없어서 다른 검색어로 검색시 잘 뜨는건 아니지만…;;;

    구글에서 ‘두글블로그’로 검색한 결과
    (더 보기…)
  • 알쏭달쏭 Nuxt.js 에서 앵커 링크 처리하기

    Nuxt.js 는 여러모로 기본 Vue 하고도 다르고 SPA (Single Page Application) 에 알맞기 때문에 기존의 일반적인 페이지 처리와 다른 부분들이 있다.

    특히 앵커에 대해서 처리가 많이 다른데…

    (더 보기…)
  • Go언어 (Golang) 에서 UTC 와 지역시간 출력하기

    Go 언어에서 time.Now() 등으로 만드는 시간은 보통 UTC 값이어서 출력시 한국 시간으로 변환할 필요가 있다. 이를 위해서는 시간값(Time 형식)에 지역 정보(loc)를 지정해 줘야 한다. 기본값은 nil 이므로 UTC 를 따라가게 된다. time.LoadLocation() 을 활용해 지역 정보를 얻어 지정해주면 출력시 지역 시간 정보를 출력한다.

    (더 보기…)
  • 우분투 18.04에서 부팅시 서비스 자동 시작하기

    우분투 18.04에서 부팅시 자동시작하지 않는 서비스들이 가끔 있다. 보통 별도 PPA 로 설치하는 최신 버전 서버 들이 그런경우가 있는데.. 이 때 아래와 같이 해주면 자동시작할 수 있게 해준다.


    (더 보기…)
  • [22년 11월 서비스 종료됨] APISTORE 카카오 알림톡 API 연동 ( PHP 구현 )

    [아쉽게도 APISTORE.CO.KR 서비스가 2022년 11월에 서비스 종료되었네요.]

    apistore.co.kr 에서 제공하는 카카오 알림톡 API 와 연동할 수 있는 소스코드입니다. 이번에 필요해서 PHP 버전으로 구현해 봤습니다.

    처음으로 카카오 플러스친구 알림톡 API를 사용해보게 되었네요.

    역시 처음하는 것은 어렵지만 만들고 나면 뿌듯하더라구요. 뭐.. 그냥 단순 API 통신이긴 하지만 앤드유저에게 제공하는 서비스는 뭔가 색다른 기분이 듭니다. 실제 고객께 전달해 드리는 것이니까요. ^ㅇ^/

    특별히 소스코드 설명같은건 하지 않겠습니다. 소스가 필요하신 분은 바로 아래 깃허브 링크로 가서 clone 하시기 바랍니다. ㅋㅋ 

    (더 보기…)
  • 구형 쏘렌토 크루젠 HP71 245/65/R17 타이어 교체 후기

    이번에 타이어가 다 닳은지라.. 거금을 들어 결국 타이어를 4짝 모두 교체하기로 하였습니다. 자동4륜이고 타이어도 4짝 모두 노후한 상태였기에 어쩔 수 없더군요. ㅜㅜ

    타이어 고르는 것도 일이지요. 원래 끼고 있는것은 한국타이어 235/60/R17 이라 순정사이즈보다 폭이 좁습니다. 코너 돌때 꿀렁거리는게 좀… 아무튼  불안한 느낌이 들어서 순정사이즈로 알아봤는데요.

    의외로 순정사이즈 제품이 몇개 없더라구요.. ㅜㅜ

    네이버 쏘렌토다이 카페에도 질문글 올려보기도하고.. 결국 금호타이어 크루젠 HP71 245/65/R17 로 결정했습니다.

    다음은 장착을 어디서 하느냐인데…

    처음에는 싸게 온라인으로 구매해서 해보려고 하나둘셋타이어에서 주문해 봤습니다.

    근데 재고가 없어서 최소 1~2주이상 걸린다고 하더군요. 그래서 주문 취소하고 그냥 바로 회사사무실 근처에 있는 타이어프로 수완 TP점에 가기로 했습니다.

    (더 보기…)