"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

FastAPI 를 사용한 파이썬 웹개발

 

안녕하세요 상훈입니다. 
이번에 리뷰하게 된 도서의 제목은  [ FastAPI 를 사용한 파이썬 웹개발 ] 입니다.

주로 React.js, Vue.js 를 이용한 SPA 의 프론트엔드 개발을 하다가 우연히도 발견한 FastAPI 를 사용한 파이썬 웹개발 책이 리뷰어 리스트에 있길래 냉큼 신청하였습니다.

 

이 책의 첫번째 좋은 점!

일단 저는 Docker에 관심은 있었지만 최근 1년 이상 건드려본 기억이 없어서 어떻게 해야할지도 감이 없는 상태였습니다.
그런데 이 책에서 virtualenv (가상환경설정) 를 간단하게 설명해주어, 스스로 검색하여 찾아보고 가상환경을 세팅해주고, 이어서 도커 사용을 하였습니다.

그다음으로는 pip 관련 기초 명령어를 통해 설치 후 진행하게 되는데, 만약 설치가 안되어 있으시다면, 아래 링크를 통해 설치해주시길 바랍니다.

https://pip.pypa.io/en/stable/installation/

 

이하 자세한 내용이 있지만, 사이드프로젝트와 본업이라는 변명으로 계속 개발을 못하고있음에 부끄럽지만 전부 읽어보지 못하였습니다.

웹개발은 거기서 거기다! 라는 말을 예전에는 무슨 소리야? 라는 생각이 있었는데, html, php, java, vue.js, react.js ... 등등을 경험하면서 느낀 바는 진짜 유사하다는 것을 느꼈습니다.

페이지를 이동할때는 항상 % router % 관련된 메서드를 호출하고 parameter 를 넘겨주어 설정하더라구요.

파이썬 또한 비슷하게 사용하였습니다.

router = APIRouter()
@router.get('/') ...

마치 node.js 에서 사용하는것과 거의 동일하게 보였습니다!

요즘 웹개발 트렌드인지 모르겠지만, 상당히 유사하였으며 코드 자체가 수월하게 눈에 읽혔습니다.

 

오류처리

모든 웹어플리케이션을 비롯한 어플리케이션들은 필수적으로 오류처리를 해야합니다.

그 중에서 이 책에서는 404 not found 에 대한 내용에 대해 간략하게 서술해주어서 더 좋았습니다. 에러처리를 직접해주는 도서가 흔하지 안더라구요.

raise HTTPException(
    ....
)

이렇게 작성하게 되는데, 마치 자바에서 Interceptor - Error Exception 을 출력할 때의 모습과 유사했습니다.

 

Todo List 구현

그리고 위와 같은 여러 과정들을 거쳐 구현하게 된 Todo List!

 

놀랍게도 DB 를 만드는데 있어 *.py 를 사용하더라구요?

지금까지 모든 언어들을 접하면서 db 구성은 erd 통해서 ~ 어쩌구~ 저쩌구 작성했었는데, FastAPI의 방식인지 파이썬의 방식인지 모르겠지만 python 파일을 만들고 쓸지 전혀 예상하지 못하였습니다.

그리고 구현 후 swagger-ui 와 비슷하게 생긴 인터렉티브 문서를 통해 확인까지. 3박자가 고루 갖춰진 내용이었습니다.

 

덕분에 파이썬으로 웹개발을 해보는 귀한 경험을 해보았습니다.

이상입니다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

반응형

안녕하세요 상훈입니다.

Spring, MyBatis 에서 여러 가지의 쿼리를 만들어놓고 부품처럼 이거 쓰고 저거 쓰고 할 때 사용하는 방법입니다.

1. 메인 기능 설정

<select id="selectListPage" 
    parameterType="a.b.c.ABCDTO"			
    resultType="a.b.c.ABCDTO"
    >			
        <include refid="COMMON.pagingPreSQL" />
        <include refid="listPage" />
        <include refid="COMMON.pagingPostSQL" />
</select>

여기서 주의할 점!

include refid = "" 작성시,

1. 같은 파일 내의 쿼리를 작성하면 listPage 와 같이 작성.
2. 다른 파일 내의 쿼리를 가져다가 사용하려면, 해당 mappernamespace 를 체이닝으로 작성해주세요. COMMON.pagingPreSQL 와 같이 작성

 

2. 각 기능 설정

/*기본 목록 조회 */	
<sql id="listAdmUserBas"	>			
    SELECT USER_ID	/* 사용자아이디 */
         , DESIG_IP	/* 지정IP주소 */
         , USER_PWD	/* 사용자비밀번호 */
      FROM 테이블명	
     WHERE 1=1	
    <if test='userId != ""'> <!-- 사용자 아이디가 있을 경우 -->
        AND USER_ID LIKE CONCAT('%',#{userId},'%')
    </if>
    <if test='desigIp != ""'> <!-- 지정 아이피가 있을 경우 -->
        AND DESIG_IP LIKE CONCAT('%',#{desigIp},'%')
    </if>
    <if test='brofcCd != ""'> <!-- 코드가 있을 경우 -->
        AND BROFC_CD LIKE CONCAT('%',#{brofcCd},'%')
    </if>
</sql>

각 기능을 담당하는 쿼리는 메인 쿼리로직과는 다른점이 있는데요,

1. 각 기능에 대한 쿼리는 모두 <sql> 태그로 설정
2. parameterType, resultType 을 작성하지 않습니다.

 

이상입니다.

도움이 되셨다면, 여유롭게 커피 한 잔 사주시면 감사합니다~

반응형

안녕하세요 상훈입니다.

 

✔️ What To Do?

자바 (Java) 에서 비밀번호를 검증하는 공통코드를 작성하려고 합니다.

비밀번호 정책에 따른 비밀번호 검증
[ 영문대문자, 영문소문자, 숫자, 특수문자 ]  4종류 조합으로 생성하도록 한다.
   ㄴ 2종류 조합시 10자리 이상, 3종류 조합시 8자리 이상으로 한다.
//패턴
private static final String PATTERN_SPECIAL_CHAR = "[!@#$%^&*()+=-]";
private static final String[] PSWD_COMBI_PATTERNS = {"[0-9]", "[a-z]", "[A-Z]", PATTERN_SPECIAL_CHAR};
//길이
private static final int PWSD_COMBI_2_MIN_LENGTH = 10;
private static final int PWSD_COMBI_3_MIN_LENGTH = 8;
    
/**
 * @param pswd 입력한 비밀번호
 * @return 검증 여부 (성공: true, 실패: false)
 */
private static boolean isValidByPasswordPolicy(@NonNull final String pswd) {
    int matchCnt = 0;
    for (String iter : PSWD_COMBI_PATTERNS) {
        Pattern pattern = Pattern.compile(iter);
        Matcher matcher = pattern.matcher(pswd);
        if (matcher.find()) {
            matchCnt++;
        }
    }

    if (matchCnt == 2 && PWSD_COMBI_2_MIN_LENGTH <= StringUtils.length(pswd)) {
        return true;
    } else if (matchCnt >= 3 && PWSD_COMBI_3_MIN_LENGTH <= StringUtils.length(pswd)) {
        return true;
    }
    return false;
}

 

이상입니다.

 

여유롭게 커피 한 잔 사주시면 감사합니다~

반응형

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

안녕하세요 상훈입니다.
이번 달 한빛미디어-나는리뷰어다 에서 제공 받은 도서는 소문난 명강의 : 김범준의 핸즈온 리액트 네이티브 입니다.

리액트에 대한 관심과 공부 시간이 어느 정도 들어간만큼 기초적인 리액트에 대한 개념은 안 상태로 이 도서를 전자책으로 얻게 되어, 작성하였습니다.

 

🙄 어느 정도 수준의 책인가요?

책 소개에서도 언급이 되었지만, 이 도서는 초급 수준 리액트 네이티브 개발을 한다고, 말해주고 있습니다. 

그러나, 찬찬히 살펴면 어느 정도 개발을 하셨던 분들도 보시면 중간중간에 도움이 될 만한 내용들이 많이 있는 것 같습니다. 추천드려요!

 

🎆 목차

간략한 목차부터 말씀드리자면, 이 책은

1. Expo, React-Native, Node.js 등 기초 요소 설명
2. 프로젝트1 : 계산기
3. 프로젝트2 : TodoList
4. 프로젝트3 : 여행 사진 공유 앱 만들기 

로 구성되어져 있습니다.

 

🚩 Prettier, EsLint 

첫 번 째 챕터인 Expo, React-Native, Node.js 등 기초 요소 설명 부분에서 좋았던 부분은 Prettier, EsLint 를 어느정도 이해할 수 있게 설명해준 부분이었습니다.
예전부터 Prettier, EsLint 는 프론트엔드 개발자들을 꽤 속썩이는 역할을 하고 있었거든요. (물론 주관적인 견해입니다.)

저 또한 Prettier, EsLint 때문에 골치 아팠던 적이 한 두 번이 아니었는데, 우연찮게도 이를 어느정도 설명해주어 덕분에 Prettier, EsLint 에 대해 좀 더 알게되었습니다 😎

 

🚩 Expo

그리고 리액트 네이티브 개발 공부를 조금이라도 해본 사람이라면 모두 알고있는 Expo.

이 책 또한 편의성을 중점적으로 Expo를 사용하여 앱 개발의 초석을 만들었습니다.

Expo를 사용하여 첫 App 에뮬레이터를 띄운 상태

덕분에 오랜만에 Expo를 다시 깔게 되었네요.

 

🚩 첫 번째 프로젝트 : 계산기

1. prop-types 라는 라이브러리를 처음 알게되었습니다.

npm i prop-types

TypeScript 처럼 javascript 에서도 타입을 명시하여 사용할 수 있게 해주는 라이브러리더라구요.
매우 유익했습니다!

Button 의 타입정의 사용하기

 

 

그리고 계산기 앱을 한 개 만들어본 결과 느낀점 🚀

책을 받고 시간이 부족해 기간 내로는 클론 코딩이 어려울 것 같아 계산기 앱까지만 만들고, 리뷰를 시작하게 되었다.

React.js 를 사용하던 사람은 React-Native 를 확실히 조금만 더 공부하면 바로 사용할 수 있다.

React-Native 에 해당하는 새로운 컴포넌트 등이 많기에 그렇게 바로바로 사용할 수는 없다.

이 책은 하나하나 상세한 내용을 만들어주고, 전체적으로 오타도 거의 없는 것 같아 좋았다. 여러 개발 관련 도서들은 오타가 워낙 많아 오류도 많이 발생하게 되는데, 이 책은 그런 경우가 없었던 것 같다. (아닐 수도 있음..)

 

⚡ 제가 드리는 별점은요

⭐⭐⭐⭐⭐ 5개 드리겠습니다. 추천드립니다!

리액트 네이티브를 사용하고 싶으신 프론트엔드 개발자라면, 입문서로 봐도 무방하겠다는 생각이 들었습니다.

 

이상입니다.

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

반응형

안녕하세요 상훈입니다. Linux Ubuntu 에서 ssh 용 Key를 generate 하는 방법에 대해 포스팅 하겠습니다.

 

서버에서 ssh-keygen 이라는 명령어를 쳐주세요

ssh-keygen

그러면 아래와 같이 (윈도우로 예시를 들었습니다만 원래는 linux-server 에서 사용합니다.) 
특정 경로에 해당하는 id_rsa 가 생성되었습니다.

그리고 비밀번호를 입력하면되는데, 만약 입력하지 않을 것이면 바로 엔터로 넘어가주시면 됩니다.

 

그러면 .ssh 라는 폴더 안에 아래와 같이 생성되셨을 겁니다.

리눅스의 경로는 ~/.ssh 입니다.

리눅스-우분투의 경우 기본 경로는 ~/.ssh 이기 때문에 cd ~/.ssh 하면 확인 가능합니다.

id_rsa 파일 중 확장자 .pub 를 가지고 있는 파일이 public key
그리고 확장자가 없는 것이 private key 입니다!

이제 자유롭게 사용하시면 됩니다!

 

이상입니다.

반응형

안녕하세요 상훈입니다.

Github Action 기능을 사용하여 Ubuntu 서버에 소스를 push 했을 때 자동으로 build, deploy 를 하는 방법을 기록하도록 하겠습니다.

 

환경 🚩

Ubuntu 18.04
Code: Spring boot (Java, jdk11, gradle)
Action 동작 시기 : push 후
동작 방법: ssh

 

목차 ✅

1. Server 에서 ssh private_key 발급
2. GitHub Action 작성
3. GitHub secret 변수 설정
4. Activate

그 다음에는 Github Action 코드를 작성할건데요,

Actions - New workflow 를 눌러서 새로운 workflow를 생성합니다.
set up a workflow yourtself 를 눌러서 진행

 

set up a workflow yourtself 를 눌러서 진행하거나, 아래 MarketPlace 에 이미 작성되어져 있는 초안을 가져와도 무방합니다.

 

set up 되어있는 marketplace!

 

*.yml 이라는 파일 형식을 지키고 원하는대로 만들어줍니다. (파일명이라 원하는대로 만들어도 무방합니다.)

main.yml !

name: Gradle Package

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-18.04  #build 하는 환경 설정
    permissions:
      contents: read
      packages: write

    steps:
    - uses: actions/checkout@v3        
    - name: Set up JDK 11        
      uses: actions/setup-java@v3            
      with:
        java-version: '11'              #java 버전 설정
        distribution: 'temurin'
        server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
        settings-path: ${{ github.workspace }} # location for the settings.xml file
        
    #grant : 권한 할당을 통하여 gradlew 명령어를 통해 build 가능하도록 설정
    - name: Run chmod to make gradlew executable
      run: chmod +x ./gradlew
      
    #build : 위에서 권한을 준 명령어로 build
    - name: Build with Gradle
      run: ./gradlew build
      
    #전송할 파일을 담을 디렉토리 생성
    - name: Make Directory for deliver
      run: mkdir deploy

    #Jar 파일을 deploy 디렉토리에 Copy
    - name: Copy Jar
      run: cp ./build/libs/*.jar ./deploy/
      
    #서버에 Deploy 
    - name: Deploy to server
      env:
          PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}        # private key
          HOST: ${{ secrets.SERVER_HOST }}                   # server host (ip addr)
          USERNAME: ${{ secrets.SERVER_USERNAME }}           # username (로그인할 id)
          PORT: ${{ secrets.SERVER_PORT }}                   # port (포트포워딩한 포트번호)
          #password: ${{ secrets.NPC_DEV_SERVER_PASSWORD }}  # 비밀번호설정했을 경우 작성(저는 enter로 뺐습니다.)
      run: |
          echo "$PRIVATE_KEY" > private_key.pem              # private key 값-> private_key.pem 로 생성
          chmod 400 private_key.pem                          # 권한 설정 600이상일경우 안되는 경우가 있음
          
          # scp: 서버간 파일전송 명령어 : 위치= /var/www/html/test에 넣었는데, 원하는 경로로 변경해주세요
          scp -i private_key.pem -P $PORT -o StrictHostKeyChecking=no -r build/libs/*.jar $USERNAME@$HOST:/var/www/html/test/
          
          # ssh 통해서 서버에 접속하여 bash 명령어 실행, 마찬가지로 위에서 변경한 경로와 일치시켜주세요
          ssh -i private_key.pem -p $PORT -o StrictHostKeyChecking=no $USERNAME@$HOST 'bash -s' <<- EOF
            pgrep java | xargs kill -9 || true
            nohup java -jar /var/www/html/test/*.jar > /dev/null 2>&1 & disown  
            exit
          EOF
          rm -f private_key.pem   #작업완료 후 pem 삭제

env: 의 내용은 github action 의  [3. GitHub secret 변수 설정] 에서 설정할 것입니다.

각각의 내용의 주석을 꼼꼼히 읽어주시고, 작성 후 create commit 을 해서 remote 에 넣어주세요!

파일 생성 완료!

.yml 파일 생성 완료!

 

3. GitHub secret 변수 설정 🔨

위에서 작성한 내용중 env : 에서 써놓은 key 값들을 작성하려고 합니다.

분리하는 이유: 누군가 제 repository 에 들어와서 모든  값들을 yml 파일로 확인할 수 있기 때문에 github 의 secret 기능을 설정. (환경변수 설정과 동일)

settings - secrets and variables - actions 탭에 들어갑니다.

[ Settings - Secrets and variables - Actions ] 탭에 들어갑니다.

 

New repository secret 을 눌러 새로운 키를 생성한다고 말해줍니다.

새로운 키 생성

json 형태의 Key: value 라고 생각하면 간단합니다.

이녀석들을 작성합니다.

여기서 다른것들은 그냥 작성하면 되는데, PRIVATE_KEY 는 양식이 있었습니다.

함께 복사해서 붙여넣기해야하는 항목

이미지처럼 BEGIN~ 에 해당하는 내용을 입력해서 넣어야합니다. (그래야 저같은 삽질을 하지 않을 수 있습니다 ㅎㅎ)

ssh-gen 을 하게되면 public 과 private  Key가 각각 생성되는데, .pub 자가 붙지 않은 것이 private key 입니다. 참고 바랍니다.

 

4. Activate ✨

그리고 이제 대망의 action을 활성화 해본다면?

 

끝입니다.

제가 고생한 흔적

실패의 연속...

 

반응형
gradlew Permission Denied

에러 발생

내용인즉슨 권한이 없어 거부됨

chmod 명령어로 권한 할당

chmod +x gradlew

반응형

안녕하세요 상훈입니다.

ChatGPT OpenAIAPI 를 사용하려고 하는데, 위와같은 에러가 발생하였습니다.

이와 같은 경우, 기준치 사용량을 초과했다는 뜻입니다. 

 

제 경우에는 반대로 billing 설정을 안해서 이렇게 되었더군요.. ㅎㅎ

billing 탭에 있는 설정 화면들

그래서 Free Trial 에서 Upgrade 해주었습니다.

이상입니다.


 

ChatGPT가 활성화가 되면서 블로그의 값어치가 뚝 떨어졌다는 것이 느껴졌습니다.

기존에 10개의 글을 검색했을 때는 여러 블로그를 살펴보았지만, 지금은 저로서도 ChatGPT 를 사용하고 블로그를 들어가지 않게 되네요.

또한 Bing 의 AI 도 웹 서칭엔진 등을 이용하여 웹 스크래핑하기에 무척 뛰어나더군요. 그래서 있던 광고들을 모두 내렸습니다. 수익성이 거의 전무하다보니 그냥 내려버리는 게 나을 듯 싶더라구요.

이상 주저리 끝

반응형

+ Recent posts