VSCode Git Private Key 오류

1
Git: git@github.com: Permission denied (publickey).

위와 같은 오류가 vscode 에서 발생하였습니다.

git@github.com permission denied

분명 터미널에서는 이슈가 없었는데, vscode에서만 이슈가 발생하였습니다.

ssh key에 passphrase를 넣어주었는데, vscode에서는 설정하는 구간이 없었고, 이 부분이 문제가 되는것 같아

설정을 찾아보았으나 설정하는 영역이 따로 없는것 같아 구글링을 해보았는데 아직 기능으로 제공하고 있지 않은것 같았습니다.

현재 해당 이슈 https://github.com/microsoft/vscode/issues/13680 로 등록되어 있습니다.

이슈 코멘트 확인중 https://github.com/microsoft/vscode/issues/13680#issuecomment-1192145377 이 코멘트를 보았는데,

git repo 설정을 git@github.com:hodory/source.hodory.github.io.git 가 아닌,

https://github.com/hodory/source.hodory.github.io.git 와 같이 적용하면 되는 방법이 있었습니다.

명령어로는 아래와 같이 설정하면 ssh 방식이 아닌 https 방식으로 처리하기때문에 공개키를 등록 했을 경우 정상적으로 동작하는것을 확인 할 수 있었습니다.

1
$ git remote set-url origin https://github.com/hodory/source.hodory.github.io.git

[Java] Spring AOP 에서 Custom Exception 사용하기

Spring AOP에서 Custom Exception 사용하기

Spring AOP는 CglibAopProxy 클래스를 이용하여 동작합니다.

아래 코드와 같이 super.process() 를 try-catch로 처리하고 있고, Runtime Exception은 exception 을 그대로 던질 수 있기 때문에

Custom Exception은 Exception 클래스가 아니라 RuntimeException을 상속받아서 사용해야 합니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

@Override
@Nullable
public Object proceed() throws Throwable {
try {
return super.proceed();
}
catch (RuntimeException ex) {
throw ex;
}
catch (Exception ex) {
if (ReflectionUtils.declaresException(getMethod(), ex.getClass()) ||
KotlinDetector.isKotlinType(getMethod().getDeclaringClass())) {
// Propagate original exception if declared on the target method
// (with callers expecting it). Always propagate it for Kotlin code
// since checked exceptions do not have to be explicitly declared there.
throw ex;
}
else {
// Checked exception thrown in the interceptor but not declared on the
// target method signature -> apply an UndeclaredThrowableException,
// aligned with standard JDK dynamic proxy behavior.
throw new UndeclaredThrowableException(ex);
}
}
}

[Notion]Notion과 Github Actions로 가계부 자동화 하기 - (1)

시작하기에 앞서


해당 포스트는 [Notion]Notion과 Zapier로 가계부 자동화 하기의 후속편입니다.

해당 포스트에서는 토스의 소비 서비스를 기반으로 Google Drive, Naver OCR, Github Actions, Notion API 를 사용합니다.

왜 Github Actions로 변경하게 되었을까?


기존에 가계부 자동화로 맨처음 고려 했던 방식은 Github Actions + Naver OCR을 이용한 가계부 자동화 방식이였습니다.

하지만 가계부를 쓰기 위해 코딩을 하는게 맞나? 싶은 생각에 솔루션들을 사용하기로 하였고

플랫폼들을 이용한 기존에 구성한 스택은 다음과 같습니다.

  • Google Drive : 캡쳐 이미지 저장소
  • Zapier : Google Drive 이미지 업로드시 정해진 프로세스를 진행하도록 하기 위한 플랫폼
  • Nanonets : 이미지에 OCR을 동작시켜 이미지에서 필요한 영역의 데이터를 뽑아낼 수 있음.

해당 스택으로 구성하였을때 무엇보다 좋았던 점은 코드를 한줄도 작성하지 않아도 가능하기 때문에,

개발자가 아니더라도 충분히 따라서 할 수 있다 였습니다.

하지만 해당 스택으로 구성하였을때 개발자로써 한계가 더 쉽게 다가왔고, 제가 느꼈던 문제점은 다음과 같습니다.

  • Zapier (자동화 플랫폼)

    • 무료 플랜사용시에는 월 100회 실행 무료이며, 1개의 자동화(zap)당 1개의 작업만 설정이 가능합니다.

      저의 경우 아래 두가지 자동화로 나뉘게 되어, 하나의 항목 업로드시 무료 횟수가 2회씩 차감이 됩니다.

      1. 구글 드라이브에 이미지가 업로드 되면 OCR 분석을 실행
      2. OCR 분석이 완료되면 Notion DB에 저장.
    • 자동화는 15분 간격으로 실행되기때문에, 위와 같이 2개가 처리되면 최악의 경우 30분이 걸리게 됩니다.

    • Notion의 Database에 항목(Property)이 많으면 일부만 노출되는 문제가 있어 원하는대로 매핑을 할 수 없습니다.

    • 데이터 포맷 변환 또한 Zap을 새로 추가해야해서 비용이 발생함.

      • 날짜 포맷이 토스에서는 2022년 1월 1일 14:40 이지만, Notion에는 ISO8601의 날짜 포맷인 2022/01/01 이 아니면 데이터가 오늘 날짜로 입력됩니다.
  • Nanonets (이미지 글자 인식 OCR 플랫폼)

    • 해외 플랫폼의 한계로 한글 인식률이 부족합니다.

      • 한글의 경우 글자사이에 띄어쓰기가 계속 추가되는 문제도 있습니다.
    • 무료 플랜에서는 월 100회 이미지 인식 제한이 있습니다.

    • 모델학습을 여러번 해보았지만 영역이 잘못 잡혀서 값이 누락되는 케이스가 있습니다.

      • 날짜 인식이 잘못되어 데이터가 잘못 들어감.

위와 같은 한계로 초기에 고려한 방식을 사용한다면 직접 개발해야 하는 문제를 뺀다면,

훨씬 높은 자유도를 얻어 원하는대로 설정할 수 있고

각 서비스의 API의 무료 한도도 Naver OCR의 API 한도인 300회만 고려하면 되기 때문에

한달의 가계부를 쓰기에 충분할것이라 판단하였습니다.

서비스 구성


이와 같이 구성하여 작성하였습니다.

각 영역에 대한 상세한 내용은 다음편에서 작성 예정입니다

Hexo Netlify CMS 연결하기

Netlify CMS


블로그 플랫폼에 의존적이지 않고, 개발자st 블로그를 운영하고자 2017년부터 hexo를 이용해 블로그를 운영하고 있습니다.

마크 다운과 파일시스템을 이용하여 블로그 포스트를 작성하고, git을 이용하여 버전 관리를 하는것은 개발자로서 꽤나 매력적이었습니다.

하지만 랩탑을 항상 소지하고 있지 않다면,
다양한 환경에서 블로그를 작성하기 위해 nodejs를 설치하고, hexo-cli 를 설치하는것은 언제나 부담스러운 일입니다.

제 블로그는 Github Actions 를 이용하여 포스팅만 작성하면 자동으로 빌드하여 배포가 되지만,
또 다른 문제점은 포스팅에 이미지가 들어가게 될 경우 작업의 복잡도가 올라가게 됩니다.

위와 같은 이유로 hexo를 온라인에서도 작성할 방법을 고민하고 검색하였고, netlify-cms 라는 서비스를 알게 되어 적용하고자 했습니다.

사실과 오해


작년에 해당 서비스를 처음 접하였을때는 gatsby 블로그를 알아보다가 알게 된 것이라 두가지 오해가 있었습니다.

  1. graphQL으로 포스트를 관리한다.
  2. netlify로 블로그를 호스팅 할때만 사용이 가능하다.

이번에 작업을 진행하면서 알게된 내용은 틀린 부분들이 있었습니다.

  1. graphQL으로 포스트를 관리한다.

    1. git-gateway라는 자체적인 방식을 이용하여 git repository를 저장소로 사용합니다.
  2. netlify로 블로그를 호스팅 할때만 사용이 가능하다.

    1. admin에 접근하기 위해서는 netlify를 이용해 호스팅을 해야하는것은 맞지만, 기존에 github pages로 제공하던 블로그와 별개로 다른 환경에 별도의 배포본을 이용하여 사용할 수 있다.
    2. 위와 같은 이유로 저는 기존의 깃허브 블로그(https://blog.hodory.dev)[https://blog.hodory.dev]
      netlify-cms를 이용하기 위한 https://hodory-blog.netlify.app/ 를 따로 사용하고 있습니다.

설정방법


자세히 보기

[Notion]Notion과 Zapier로 가계부 자동화 하기

왜 가계부를 쓰나요?

저는 예전부터 가계부를 써서 돈의 사용처를 기록하고 카테고리화 해서 어디에 돈을 많이 쓰고 있는지 흐름을 보는것을 좋아했습니다.

가계부를 Notion으로 쓰는 이유

첫 가계부는 편한 가계부라는 어플을 사용했고, 그 이후 핀테크쪽 서비스가 커지면서 뱅크샐러드를 사용했었습니다.

뱅크 샐러드는 느리긴 했지만 제가 필요하다 생각했던 모든 것들을 제공 해주고 있었습니다.
토스에서 소비 라는 탭으로 연동된 계좌들의 소비 내역을 보여주는 기능도 출시하여 엄청나게 빠른 속도로 스크래핑이 되었습니다.

문제는 결혼 이후로는 제 지출 내역만 관리하는게 아니라 아내의 지출 내역도 관리가 필요했습니다.

저는 위에 가계부를 쓰는 이유가 돈의 흐름을 보고 싶은 것이라 통계들을 볼 수 없는 종이 가계부는 쓰고 싶지 않았고,

언제든 접근할 수 있고 두사람이 같이 온라인으로 관리 할 수 있는 가계부가 필요했습니다.

개발자 답게 직접 서비스를 만드는것도 고려했으나 주 목적인 가계부를 쓰기 위해 서버를 관리하고, 비용을 내고 해야한다는것이 점점 야크 털 깎기가 되어 가는 느낌이였습니다.

이러한 이유로 새로운 방법을 찾아보기 시작합니다.

앱을 알아봤을때 iOS 에는 Buboo 가계부라는 어플이 있었는데,

웬만한 공유 가계부 서비스들이 서비스 중단된 케이스가 많아서, 모든 데이터를 작은 서비스에 의존할 수 없겠다는 판단을 했습니다.

주위에 자문을 구했을때, 엑셀 템플릿을 구하여 엑셀 또는 구글 스프레드 시트를 이용하여 가계부를 쓰는 기혼자 분들이 많이 있었습니다.

그분들을 따라 블로그들을 돌아다니며 템플릿을 수집하고 가장 제가 쓰기 편한것을 3개월정도 사용했습니다.

여기서도 발견된 문제점은 제가 엑셀을 잘 사용하지 않다보니, 만들어진 템플릿을 커스텀하는데 드는 리소스가 너무 컸습니다.
여기서도 엑셀을 배우는것보단 제가 원래 많이 사용하는 노션으로 가계부를 옮기게 됩니다.
직접 만들 수도 있었지만 템플릿은 노션 강좌 유튜브에서 구해서 사용했습니다.

자동화를 하게 된 계기

  • 생활비 통장
  • 실제 결제에 사용하는 카드 N개

위와 같이 나누어 쓰고 사용한 금액을 생활비 통장에서 차감하는 방식으로 사용합니다.

처음에는 노션에만 가계부를 작성을 했는데 누락되는 케이스가 있어서 보조수단으로 토스 메모 기능을 활용했습니다.

카드로 결제를 하면 어떤것을 결제했는지(PG결제 같이 사업자명이 안 나오거나 실제 매장명과 거래처명이 다른 경우가 많음) 토스 소비 탭에서 메모를 작성을 하고,
토스에 있는 내역을 기반으로 노션에 가계부를 작성을 하고 있었습니다.

이렇게 하다보니 똑같은 일을 결제 내역당 두번씩 하고 있었습니다.

하루에 1~2건이라면 문제가 없지만 하루에 결제내역이 많으면 10건까지도 있는 경우가 있다보니 제가 해야 할 반복 작업은 N(결제건수)*2가 되어버립니다.

이를 어떻게 해결하면 좋을까 고민하다보니 제가 하는 작업은 아래와 같습니다.

  1. 토스 소비탭에서 결제 내역에 메모를 추가한다.
  2. 노션 가계부에 1의 내용을 바탕으로 저장한다.
  3. 생활비 통장에서 금액을 차감하고 결제수단을 업데이트 한다.(월별 생활비 추가)

3번 동작은 송금 기능도 들어가기때문에 자동화가 애매하지만, 2번 동작은 1번 동작에 상당히 의존적이였습니다.
그렇다면 1번이 다 되었을 때, 해당 내용을 읽어들여 최근에 나온 Notion API를 사용하면 되지 않을까? 라고 생각하게 됩니다.

어떻게 연결 하였을까

Zapier라는 서비스에서는 구글드라이브의 이벤트와 Nanonets OCR 이라는 서비스를 연결 할 수 있었습니다.

자세히 보기

SSL Connection Error 발생

1
2
[root@aaaaa ~]# curl -XGET {{링크}}
curl: (35) SSL connect error

원인


Curl 버전이 낮아서 발생하는 문제

해결방법


패키지를 업데이트 할 수 있을 때

1
$ yum update -y nss curl libcurl

패키지를 업데이트 할 수 없을 때

-1 을 파라미터로 넣어주면 해결 가능하다. (https://github.com/userify/shim/issues/25)

1
$ curl -XGET {{링크}} -k -1

참고 자료


http://www.kwangsiklee.com/2017/07/문제해결-centos-curl-ssl-connect-error/

https://wwwnghks.tistory.com/62

윈도우 컴포저 패키지 설치시 오류 처리 방법

Your requirements could not be resolved to an installable set of packages.

1
2
3
4
5
6
7
Your requirements could not be resolved to an installable set of packages.

Problem 1
- laravel/horizon v4.2.1 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
- laravel/horizon v4.2.0 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
- laravel/horizon 4.x-dev requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
- Installation request for laravel/horizon ^4.2 -> satisfiable by laravel/horizon[4.x-dev, v4.2.0, v4.2.1].

Laravel Horizon을 windows에서 설치하려 할 때 위와 같은 오류가 발생하였습니다.

해결방안

pcntl은 윈도우에서 지원이 되지 않으므로 Docker 또는 Vargrant와 같은 가상환경을 사용해야 합니다.
Link

또는 아래와 같이 실행하여 설치를 완료 할 수 있습니다.

1
composer require laravel/horizon --ignore-platform-reqs

--ignore-platform-reqs 옵션의 설명은
해당 링크에서 확인할 수 있습니다. Link

1
ignore php, hhvm, lib-* and ext-* requirements and force the installation even if the local machine does not fulfill these. See also the platform config option.

패키지를 설치하는데 필요한 조건을 충족하지 못하더라도 무시하고 설치를 실행하는 옵션입니다.

필요 조건을 모두 충족하지 않은 경우이므로 정상동작에 실패 할 수 있습니다.

[Git] 원격 브랜치명으로 새로운 브랜치 생성하기

주로 PHPStorm 같은 IDE 나 VSCode 같은 Extension이 잘 되어 있는 에디터를 사용하고,

그 이전에는 Source Tree / Git Kraken / Fork 등 Git Client 를 사용하여 Git을 사용하기 때문에,

아직 CLI로 Git을 유연하게 다루지 못해 git-scm 문서의 내용을 정리 합니다.

명령어 정리

원격 브랜치명과 같은 이름으로 생성할 때

1
$ git checkout --track origin/master

해당 브랜치명이 리모트에만 있고, 로컬에는 없을 때 이를 축약하여 아래와 같이 실행할 수 있다.

1
$ git checkout master

원격 브랜치명과 다른 이름으로 생성할 때

가장 많이 쓰이는 경우인데, 원격 Git 서버의 master 브랜치를 기준으로 새로운 브랜치를 만들고, 체크아웃 할 때 사용합니다.

1
$ git checkout -b my-new-branch-name origin/master

위와 같이 실행하면 origin/master를 트래킹 하게 되는데,

다른 브랜치를 추적하기 위해 아래와 같이 실행할 수 있습니다.

1
$ git branch -u origin/feature-test

참고자료

Git 브랜치 - 리모트 브랜치

[Git] Git Merge 또는 Git checkout 오류 해결하기

문제 상황

git pull origin master 또는 git checkout master 와 같이 브랜치를 변경하거나, 원격저장소에서 pull을 받을때
아래와 같은 오류가 나온적 경험이 한번쯤은 있을것 입니다.


1
2
3
4
error: Your local changes to the following files would be overwritten by checkout:
themes/icarus/layout/widget/recent_posts.ejs
Please commit your changes or stash them before you switch branches.
Aborting

error: Your local changes to the following files would be overwritten by merge:

error: Your local changes to the following files would be overwritten by checkout:

위와 같은 오류와 함께 pull이나 checkout이 동작하지 않습니다.

처음 Git을 사용하였을때는 집과 회사를 오가면서 깃허브를 이용해서 push도 하고 pull도 하고 잘 사용하다가

이런 오류가 나오면 어떻게 해야할지 모르겠고, 커밋을 해야하는것 같은데

무의미한 커밋을 하고 싶지는 않아서 다른 폴더로 clone을 하고 다시 작업을 했었는데요.

해결 방법


에러 메세지를 자세히 보면 해결 방법이 나와있습니다.

Please commit your changes or stash them before you merge. 그리고

Please commit your changes or stash them before you switch branches. 라는 문구가 있습니다.

메세지 그대로 merge 또는 switch branch 이전에 변경사항을 commit 하거나 stash 하라고 합니다.

위에서도 말했지만 저는 쓸데 없는 커밋을 하고싶지 않아 방법을 모르고 새 프로젝트를 실행했지만

이때는 git stash 명령어를 사용하면 됩니다.

stash는 간단하게 버전관리 되는 대상들을 잠시동안 임시저장 해두는 방법이라고 말할 수 있습니다.

그래서 어떻게 하라는건가요?


위와 같은 상황에서는 아래와 같이 사용하면 됩니다.

1
2
3
4
5
6
# 현재 Staging 영역에 있는 파일의 변경사항을 스택에 넣어둡니다. 
$ git stash
# 아래 명령어와 같이 원격 저장소의 master에서 pull을 하거나, git checkout master와 같이 브랜치를 바꿀 수 있습니다.
$ git pull origin master
# stash 명령어로 스택에 넣어둔 변경 사항을 적용하고, 스택에서 제거하여줍니다.
$ git stash pop

간단하게 한줄로 표현하면 git stash && git pull origin master && git stash pop 와 같이 사용할 수 있습니다.

참고자료

git stash에 대한 자세한 사용법은 해당 링크에서 확인할 수 있습니다.

[AWS] S3 호스팅에 도메인 연결하기

S3에서 정적 웹호스팅을 할 수 있다는 이야기는 들어 보았지만, 아직까지 해 볼 경험이 없었는데
지인 덕분에 간만에 재밌는걸 해봐서 잊지 않으려고 기록합니다.

이미 많은 포스팅들도 있고, 공식 가이드 문서도 충분히 잘 정리 되어 있으니 참고 하시기 바랍니다.

도메인은 이미 구매하였다는 가정하에 진행합니다.
이 포스팅에서 사용할 도메인은 [travelerapp.kr](http://travelerapp.kr) 입니다.(곧 만료 예정)

S3 설정하기


  1. 우선 별 다른 설정없이 s3 버킷을 생성하여줍니다.
    이때 주의할점은 버킷명을 호스팅 하고자 하는 도메인과 일치시켜 주어야 합니다.

    버킷 생성하기

    또한 권한 설정시 퍼블릭 액세스를 꼭 체크 해제 해주어야 합니다.

    버킷 생성하기(권한 설정) - 퍼블릭 액세스 체크해제

  2. 버킷이 생성되면 호스팅 하고자 하는 파일을 업로드하여줍니다.
    호스팅시 누구나 접근 가능하게 하기때문에 퍼블릭 액세스를 허용 해야합니다.

    파일 업로드시 퍼블릭 액세스로 변경

  3. 그 후 속성 → 정적 웹 사이트 호스팅 메뉴에 들어가서
    인덱스 문서(메인 페이지), 오류 문서(404 등 오류가 발생했을때 노출 할 페이지) 2가지를 설정하여줍니다.

    정적 웹호스팅 설정

    저는 아래와 같이 main.html과 error.html으로 설정했습니다.
    저장 후 빨간색 박스 안에 있는 엔드포인트에 본인이 설정한 페이지가 정상적으로 노출되는지 확인합니다.

    정적 웹호스팅 설정 - 엔드포인트 확인

    또한 /detail.html 과 같이 존재하지 않는 페이지를 조회하였을때에 오류 문서로 설정한 페이지가 정상적으로 노출되는지도 확인합니다.

  4. 마지막으로 버킷의 정책을 설정하여 줍니다.

    해당 리소스 하위 경로에 대한 조회 권한을 설정하는것으로, 아래의 빨간 박스 내용이 자신이 설정하려는 도메인과 동일해야합니다.

    버킷 정책 편집 - 편집기 안의 빨간 박스의 내용을 본인의 도메인으로 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    "Version": "2012-10-17",
    "Id": "Policy1579004958999",
    "Statement": [
    {
    "Sid": "Stmt1579004957334",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::static.travelerapp.kr/*"
    }
    ]
    }

이것으로 S3에 대한 설정은 끝입니다.

Route53 설정하기


자세히 보기