728x90
반응형

IaC (Infrastructure as Code)

 소프트웨어를 작성하는 것처럼 인프라를 코드로 관리하는 것을  IaC라고 한다.

인프라를 코드로 관리할 때의 장점은 아래와 같다.

  • 효율적인 구성 관리 : IaC로 인프라를 구성할 때의 장점 중 하나는 버전 관리 시스템(Git 등)을 활용할 수 있다는 점이다. 이를 통해 인프라의 구성을 버전별로 추적하고 이전 버전으로 되돌리는 등 인프라 구성을 쉽게 수정할 수 있다.
  • 자동화 : IaC를 사용하면 인프라가 자동으로 구성되기 때문에 사람이 구성할 때보다 신뢰성과 정확성이 증가한다.
  • 쉬운 구축과 배포: IaC를 사용하면 인프라 구축과 배포가 쉽고 빨라진다.
  • 히스토리 : 직접 구축된 서버를 보면 실제로 사용하진 않지만, 작업 중에 남겨진 흔적 등이 발견되는 경우가 있다.
    이럴 때 이력이 없다면 의미를 이해하기 쉽지않다. 하지만 코드를 통해만들어졌다면 코드를 읽어만 봐도 인프라 구성을 한 눈에 알 수 있게 된다.
  • 멱등성 : 언제 어디서 실행해도 동일한 인프라를 구성할 수 있다.

 DevOps 관점에서의 IaC는 개발자와 운영자가 SDLC 상에서 더 가까이 있을 수 있게 하고 운영을 더 명확하게 하며, 운영 업무에 소프트웨어 개발 원칙과 반복성을 적용할 수도 있다. 또한 DevOps의 핵심인 자동화와 협업을 위해서 버전 관리 시스템을 사용하여 IaC를 관리할 경우, 팀으로 하여금 효과적으로 협력하는 방법에 관한 허브 역할도 수행할 수 있다.


IaC의 종류

 코드로 인프라를 다룰 수 있게 도와주는 도구들은 여러가지가 있다.

각 도구마다 IaC의 구현 방식과 특성이 다르고, 인프라의 특성에 따라 사용할 때 이점이 다른 경우도 있다.

  • Chef (2009) : 루비 형태의 DSL(도메인 특화 언어)를 사용하여 recipe(레시피)를 작성한다. 사용을 위해 대상 서버에 별도의 agent 설치가 필요하다.  
  • Puppet (2005) : Chef와 비슷하게 루비로 작성된 DSL를 사용하고, Agent를 설치해야한다. 
  • SaltStack (2011) : ZeroMQ를 사용하여 비동기로 인프라를 구축할 수 있다. Agent가 필요하며 yaml을 사용한다. 
  • Ansible (2012) : agent-less 방식으로 ssh 접속만 가능해도 사용할 수 있다. yaml을 사용하여 코드를 작성할 수 있으며 2015년 Redhat에 인수되었다.
  • Terraform (2014) : Hashicorp에서 제공하는 오픈소스 IaC로 HCL과 JSON을 사용한다. 클라우드 인프라를 코드로 구성할 수 있다.
  • Azure Resource Manager : Microsoft Azure에서 제공하는 IaC 도구로 Azure 자원을 관리할 수 있다.
  • AWS CloudFormation : AWS에서 제공하는 IaC 도구로 AWS 자원을 관리할 수 있다.

위 내용 중 Terraform과 SaltStack, Ansible를 앞으로 블로그에 정리해볼 계획이다.

 

728x90
반응형
728x90
반응형

 이름이나 확장자는 다르지만 사실 동일한 파일이 있다.

이 2개의 파일을 코드로 구분하려면 어떻게 해야 할까? 그리고 디렉토리 내에 그런 파일들이 여러개 있다면 어떻게 찾을 수 있을까?

 

아래 파일은 get_tickers.py를 복사하여 .txt로 확장자를 바꾼 동일한 파일이다. 2개의 파일이 사실은 같다는 걸 코드로 확인해보자.

 

 파일이 동일하다는 걸 확인하려면 파일 전체를 해쉬로 만들어 값을 비교해보면 된다.

코드로 작성해보자.

import hashlib

def my_hash(file):
    with open(file, 'rb') as f:
        read_data = f.read()
        hash = hashlib.sha512()
        hash.update(read_data)
        hexSHA512 = hash.hexdigest()
        hashValue = hexSHA512.upper()

    return hashValue

file_a = "C:\\Users\\Hwan\\Desktop\\TestDir\\get_tickers.py"
file_b = "C:\\Users\\Hwan\\Desktop\\TestDir\\get_tickers.py.txt"
hash_a = my_hash(file_a)
hash_b = my_hash(file_b)

print(file_a)
print(file_b)
print(hash_a)
print(hash_b)
print(hash_a == hash_b)

파일의 내용을 sha512로 해싱해주는 함수를 작성했다.

코드를 실행하면 이름과 확장자는 달라도 내용은 같다는 걸 알 수 있다.

 

 폴더 내부를 전체 탐색하기 위해 아래 코드를 작성했다.

import os

workspace = "C:\\Users\\Hwan\\Desktop\\TestDir"
keywords = ["pass"]
list_result = []

for file in os.walk(workspace):
    if any([True if keyword in file[0] else False for keyword in keywords]): continue
    
    for x in file[2]:
        list_result.append(file[0] + "\\" + x)
        
print(list_result)

 

코드를 실행하면 입력받은 경로 밑의 (경로나 파일 명에 pass가 포함되지 않은) 모든 파일을 리스트에 담아준다.

 

이제 입력한 경로 내의 모든 동일한 파일을 찾도록 아래의 코드를 추가했다.

dict_hash = {}     
for file in list_result:
    try:
        dict_hash[my_hash(file)].append(file)
    except:
        dict_hash[my_hash(file)]= [file]

딕셔너리의 키로 파일 내용을 해싱한 값을 줬고, 값으로는 해당 해쉬값을 갖는 파일명 리스트를 담았다.

 

아래는 전체 코드이다.

import os
import hashlib

def my_hash(file):
    with open(file, 'rb') as f:
        read_data = f.read()
        hash = hashlib.md5()
        hash.update(read_data)
        hexSHA512 = hash.hexdigest()
        hashValue = hexSHA512.upper()

    return hashValue

workspace = "C:\\Users\\hwan\\Desktop"
keywords = ["pass"]
list_result = []

for file in os.walk(workspace):
    if any([True if keyword in file[0] else False for keyword in keywords]): continue
    
    for x in file[2]:
        list_result.append(file[0] + "\\" + x)
        

dict_hash = {}     
for file in list_result:
    try:
        dict_hash[my_hash(file)].append(file)
    except:
        dict_hash[my_hash(file)]= [file]
        
for x in dict_hash:
    if len(dict_hash[x]) > 1:
        print(x, dict_hash[x])

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

QR-CODE 생성하기  (2) 2023.03.29
[Python] requirements.txt로 패키지 설치하기  (0) 2023.01.12
FastAPI  (0) 2023.01.12
[Python] Docstring  (0) 2022.11.27
[Python] OS 모듈 : 디렉토리 전체 탐색하기 (하위 디렉토리까지)  (0) 2022.11.20
[python] JWT 모듈  (0) 2022.09.13
728x90
반응형

 

Chat GPT

 Chat GPT는 OpenAI 재단에서 GPT-3.5 모델로 만든 인공지능 챗봇이다. 

기존 3.0 버전도 성능이 좋았지만 ChatGPT는 직접 사용 해보고 꽤 충격을 받았다. 공식적으로는 해당 모델이 인터넷에 연결되어있지 않고, 2021년까지의 데이터를 기반으로 학습되었기 때문에 아래처럼 정확하지 않은 정보를 진실처럼 전달해주기도 한다.

하지만 공식 또는 지식과 같은 내용을 질문한다면 문맥 파악 능력과 정확하고 방대한 지식에 큰 충격을 받을 것이다.

개인적으로 웹 서비스를 만들면서 생겼던 문제를 Chat GPT에게 물어보면서 해결하는 과정을 글로 작성해보았다.

 

해당 모델에 대한 좀 더 자세한 내용은 아래 기사를 참고하자.

 

오픈AI, 'GPT-3.5' 모델 공개 - AI타임스

오픈AI가 대형 언어모델인 \'GPT-3\'의 뒤를 잇는 \'GPT-3.5\' 시리즈 모델을 선보였다. 자연어처리 모델 ‘다빈치-003’과 대화형 모델인 ‘챗GPT’다.다빈치-003은 인간의 피드백을 통한 강화학습을 이

www.aitimes.com

 


Chat GPT로 문제 상황 해결하기

 먼저 내가 겪은 문제 상황은 Flask 백엔드에서 ['A', 'B', 'C']와 같은 문자열 리스트 형태의 데이터를 render_template로 프론트에게 전달하면서 발생했다. 프론트에서 전달받은 데이터는 리스트가 아닌 문자열로 인식되었고 중간의 ' 기호를 코드로 나타내면서 아래처럼 ' 로 변환되어 표시되었다.

 

구글에서 검색해봤지만 명확한 이유가 설명된 글이 거의 없었고, 위와 비슷한 상황을 찾기 위한 검색어를 만드는 것 자체가 어려웠다. 그래서 AI에게 물어보기로 했다.

 

 

먼저 내 상황을 그대로 물어보았다. str.replace(/'/g, "\'"); 를 사용하여 해결할 수 있지만 복잡하고 번거로운 방법이라 추천하지 않는다고 한다. 아직 답변이 조금 부족하다고 생각해서 다시 질문해보았다.

 

처음보다 괜찮은 방법인 것 같지만 여전히 추천하지 않는다고 한다. AI가 추천하는 방법이 궁금해졌다.

 

여기까지만 봐도 충분히 해결할 수 있겠지만 내 코드에 이 내용을 어떻게 적용하면 좋을 지 물어보기로 했다.

작성한 코드의 일부를 그대로 복사해서 물어봐도 정확하게 알려주었다..!

 

AI가 알려준대로 코드를 수정해보자.

<script>
        var ticker_index = JSON.parse('{{ ticker_index | safe }}');
        var ticker_value = JSON.parse('{{ ticker_value | safe }}');
        var aver_step = "{{ aver_step }}"

        var chart = new Chart(document.getElementById(ticker).getContext('2d'), {
        type: 'line',
        data: {
            labels: ticker_index,
            datasets: [{
            label: 'Close Price',
            backgroundColor: 'transparent',
            borderColor: 'blue',
            data: ticker_value,
            }]
        },
        options: {
            scales: {
	    		yAxes: [{
	    			ticks: {
	    				stepSize : aver_step,
	    				fontSize : 12,
		    		}
		    	}]
		    }
        }
        });

    </script>
@app.route('/graph', methods=['GET', 'POST'])
def graph():
    if 'id' not in session:
        return render_template('signin.html')

    if request.method == 'POST':
        try:
            ticker = request.form.get("ticker")
            startdate = request.form.get("startdate")
            #enddate = request.form.get("enddate")
            enddate = datetime.now()
            interval = request.form.get("interval")
            kind = request.form.get("kind")
            
            yf_Ticker = yf.Ticker(ticker)
            
            ticker_data = yf_Ticker.history(start=startdate, end=enddate, interval=interval)[kind]
            ticker_index = (lambda origin: [str(tmp.strftime("%Y-%m-%d")) for tmp in list(origin.index)])(ticker_data)
            ticker_value = (lambda origin: [round(tmp, 2) for tmp in list(origin.values)])(ticker_data)
            aver_step = (max(ticker_value) - min(ticker_value)) / len(ticker_value)
            
            ticker_index_str = json.dumps(ticker_index)
            ticker_value_str = json.dumps(ticker_value)
        except Exception as e:
            return render_template('error_500.html', ticker=ticker, exception_msg=e)   
        
    elif request.method == 'GET':
        ticker = ""
        ticker_index = []
        ticker_value = []
        aver_step = 0
        
    return render_template('graph.html', ticker=ticker, ticker_index=ticker_index_str, ticker_value=ticker_value_str, aver_step=aver_step)

 

코드를 수정하고 다시 실행하여 정상적으로 제거된 걸 볼 수 있다.


후기

내가 위에서 물어본 질문은 사람이해도 크게 어렵지 않은 부분이었지만 하나의 예시일 뿐이고, Chat GPT는 학습한 거의 모든 데이터를 인간 전문가 정도의 수준으로 알고 있는 것 같다. 수학과 물리학 등의 이론을 물어보거나 이야기를 물어봐도 답해줄 수 있다. 잘못된 데이터로 학습하지만 않았다면 분야를 가리지 않는 방대한 분야의 지식을 왠만한 사람들보다 정확하게 (그리고 원한다면 영어, 러시아어, 중국어로도) 설명해준다.

드론 PID 튜닝

 

심지어 이런 위에서 말한 내용을 기억하고 새로운 내용을 추가한 답변을 하거나, 코드와 관련된 github 링크를 추천해주기도 한다.

 

이 글에서 모든 활용방법을 설명할 순 없고, 모든 답변이 다 정확한 건 아니지만 이 정도 수준만 되어도 현실의 다양한 문제를 질문하여 해결할 수 있었다.

만약 인터넷에 연결되어 전세계의 모든 데이터를 실시간으로 학습한다면 더 정교하고 방대한 신경망 모델이 될거라고 생각한다.

728x90
반응형
728x90
반응형

실기 시험 대비 방법 및 후기

 코로나 확진으로 인해 2회차 실기를 못봐서 3회 시험을 바로 신청했다. 정보처리 기사 실기 시험 대비를 위해 먼저 아래 수제비 문제집을 구입했다.

1권을 거의 다 풀고 기본 내용을 반복적으로 공부했고, 아래 CBT 사이트에서 문제를 반복적으로 풀면서 외웠다. 

앱스토어(또는 play 스토어)에서 정보처리기사를 검색해 나온 어플로 두음 암기도 했다..!

SQL 중 1문제가 이전 기출 중에서 동일하게 출제되어, 정답을 바로 적을 수 있었고 두음암기도 처음엔 효과를 의심했지만 막상 시험장에선 그것만 생각났다.

 

https://q.fran.kr/%EC%8B%9C%ED%97%98/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC%20%EC%8B%A4%EA%B8%B0

 

기출문제 문제은행

각종IT시험, 공인중개사 등 답있는 기출문제 시험 자격증 족보

q.fran.kr

 

 물론 위 내용을 공부한 내용들 중 시험에 나오지 않은 부분이 훨씬 많지만 부분점수가 존재하고, 기출범위가 넓은 실기 시험 특성 상 평소에 조금씩이라도 꾸준히 공부하는 방법이 유리할 것 같다. 그리고 프로그래밍과 SQL 문제만 다 맞춰도 합격 확률이 매우 올라간다. (개인적으론 프로그래밍도 1문제 틀렸고, 못적은 답도 많았지만 부분점수 덕분에 겨우 합격한 것 같다.)


 

2022년 3회 실기 가답안 및 문제

 시험 직후 아래 사이트를 보고 가답안과 부분 점수를 계산했는데 거의 실제 문제와 유사하게 정리된 것 같다.

3회 문제 내용을 대략적으로 알고 싶다면 아래 링크도 추천한다.

https://www.gisafirst.com/board/n1/view.php?offset=0&tq=1393907668&reqCategory=&idx=425&word=&s_type=&s_content=&s_terms= 

 

온라인IT자격증의 시작 기사퍼스트로 대비하세요.

정보공유 >> 가답안 * 가답안 복원과 무관한 글은 사전 통보 없이 삭제하겠습니다.* 22년 3회 정보처리기사 실기 시험은 10월 16일 (일) 오전 9:00 시행됩니다.10월 16일 시험 당일 가답안이 진행될 예

www.gisafirst.com

 


결과

 

728x90
반응형
728x90
반응형

Docstring

 파이썬은 자료형이 명시되지 않기 때문에(언어의 동적 특성) 파이썬에서의 문서화는 매우 중요하다.

문서화를 위해서 파이썬은 docstring이라는 문서화 문자열 기능을 제공하고 """ 문서화 문자열입니다. """ 처럼 표현할 수 있다. docstring은 모듈, 클래스, 함수에 붙일 수 있고 각 객체의 __doc__ 속성에 접근하여 문자열을 가져올 수 있다. 어떤 대상에 docstring을 작성할 지에 따라 적어야하는 내용들도 달라진다. 

*더 많은 내용은 https://peps.python.org/pep-0257/ 를 참고


 

모듈 docstring

 각 모듈에는 최상위 docstring이 필요하다.

docstring의 첫문장은 모듈의 목적을 기술하는 한 문장으로 구성되며 이후는 모듈의 동작을 자세히 설명한다.

 

예시)

"""
Library for testing

Test Module info

Available functions:
- func1 : test function 1
- func2 : test funtion 2
"""
...

 

클래스 docstring

 클래스 수준의 docstring은 모듈 docstring과 거의 비슷하다.

첫 번째 문장에서 클래스의 목적을 기술하고 이후는 동작을 설명한다. 그리고 공개속성과 메서드, 서브클래스가 슈퍼클래스와 상호작용하는 방법등을 안내해야한다.

 

예시)

class Test(object):
"""
Represents a test

class info

Public attributes:
- test_code : test code
- test_result : result
"""
...

 

함수 docstring

 함수의 docstring에서는 첫 줄에 수행하는 일, 다음 줄부턴 함수의 특별한 동작이나, 인수에 대한 내용 또는 반환 값을 설명한다. 또한 호출 시 함수 인터페이스에서 처리해야하는 예외도 설명해야 한다.

 

예시)

def Test_func(code):
"""
Testing target

function info

Args:
- code : String of the target Code

Returns:
- Boolean (True if Test is succeed)
"""
...

 

함수가 인수를 받지 않을 경우는 한 줄의 설명으로도 충분하고 아무것도 반환하지 않는다면 Returns는 생략해도 된다.

만약 함수가 가변인수를 사용할 경우, Args 항목에 *args, **kwargs를 적고 목적을 설명해줘야 한다.

728x90
반응형
728x90
반응형

디렉토리 탐색

 모든 하위 디렉토리 내부 파일까지 포함된 전체 파일의 목록을 가져오기 위해 파이썬으로 코드를 작성하려고 한다.

그런데 디렉토리(또는 폴더) 내부에 하위 디렉토리가 있다면?

그리고 그 디렉토리 내부에 하위 디렉토리가 있는지 없는지 모른다면?

코드를 어떻게 작성해야 될까?

 

먼저 파이썬에서 경로를 다루기위해  os 패키지를 import 했다.

그리고 아래와 같은 디렉토리 구조(주석)를 만들어 둔 뒤 하위 디렉토리 어딘가에 FindMe.txt 파일을 숨겨두었다!

#Find_TMP
#┣━1234
#┗━TEST
#  ┗━TEST1

import os

 

os 모듈 내부의 메소드들을 사용해서 FindMe.txt 파일이 어디에 있는지 찾아보자.

os.listdir() 메소드를 사용하면 입력한 폴더 내부에 존재하는 파일과 디렉토리를 모두 가져올 수 있다.

def findFiles(root):
    files = os.listdir(root)
    for file in files:
        path = os.path.join(root, file)
        if os.path.isdir(path):
            print("Directory :", path)
        else:
            print("File :", path)
      
findFiles("C:/Users/Hwan/Desktop/Find_TMP")

 

Find_dir의 하위 디렉토리인 1234와 TEST는 잘 찾았지만 우리가 원하는 FindMe.txt 파일은 찾지 못했다.

1234와 TEST 내부까지 확인하려면 그리고 내부에 우리가 알지 못하는 디렉토리가 있다면 어떻게 해야될까?

 


 

재귀를 이용한 디렉토리 탐색

  디렉토리 내부에 디렉토리, 그리고 그 내부에 디렉토리 그리고 또 하위 디렉토리.. 만들어둔 구조를 보고 있으면 뭔가 떠오르는 것 같다..! 

 

재귀를 사용해서 모든 경로를 확인해보자.

def findFiles_recursion(path):
    for x in os.listdir(path):
        subdirectory_path = f"{path}/{x}"
        print(subdirectory_path)
        if os.path.isdir(subdirectory_path):
            findFiles_recursion(subdirectory_path)
            
findFiles_recursion("C:/Users/Hwan/Desktop/Find_TMP")

우리가 원하던 FindMe.txt 파일을 드디어 찾았다!

위 구조에선 숨겨져있던 Secret 디렉토리 내부까지 확인이 되었다.

 

하지만 만약 폴더의 구조가 매우 깊다면 재귀를 사용한 함수는 Runtime Error를 뱉는다.

import sys
sys.setrecursionlimit(10000)

물론 이런 코드를 추가하면 좀 더 깊게 탐색할 수는 있지만 스택을 사용하면 더 좋을 것 같다.

 

코드로 작성해보자.

def findFiles_stack(path):
    list_stack = [path] 
    
    while list_stack.__len__():
        cur_path = list_stack.pop()
        
        for x in os.listdir(cur_path):
            _path = os.path.join(cur_path, x)
            if os.path.isdir(_path):
                list_stack.append(_path)
            print(_path)
            
            
findFiles_stack("C:/Users/Hwan/Desktop/Find_TMP")

탐색 순서는 조금 다르지만 이제 깊이에 상관없이 FindMe.txt를 찾을 수 있게 되었다!


 

os.walk

 그런데 사실 파이썬의 os 모듈에서는 위에서 고민했던 내용들을 한번에 해결해줄수 있는 메소드를 제공한다.

for x in os.walk("C:/Users/Hwan/Desktop/Find_TMP"):
    print(x)

하위 디렉토리까지 모든 경로를 찾고 싶을 땐 os.walk 메소드를 쓰도록 하자!

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

FastAPI  (0) 2023.01.12
[Python] 디렉토리 내부의 동일한 파일 찾기  (1) 2022.12.10
[Python] Docstring  (0) 2022.11.27
[python] JWT 모듈  (0) 2022.09.13
[Python] Yahoo_fin 모듈  (0) 2022.09.11
[Python] Paramiko 모듈  (0) 2022.07.07
728x90
반응형

 

Jenkins

 젠킨스는 오픈소스 CI 툴이다. 원 제작자는 카와구치 코스케이고 JAVA로 제작되었으며 MIT License를 따른다.

원래 목적은 자바 프로젝트의 CI였지만 여기서는 팀에서 제작한 Pluto 프로젝트의 컨테이너를 빌드하고 Docker Hub에 업로드 하여 버전 관리와 컨테이너 배포까지 (반)자동으로 이루어지도록 아래처럼 간단한 CI/CD를 작성해보았다.

 

 


 

Python 프로젝트 컨테이너화 시키기

 먼저 팀 프로젝트의 결과물인 Pluto(Flask 웹 서버)를 자동 배포하기 위해 서버를 컨테이너화 시켰다.

컨테이너화가 어렵게 느껴질 수 있지만 내가 했던건 이미 만들어진 우분투 컨테이너에 필요한 조치를 하고 서버를 올리는 스크립트(?)를 작성한게 전부다.

 

 아래는 파이썬 프로젝트를 Ubuntu:20.04 컨테이너에 넣고 실행시켜주는 Dockerfile 이다.

FROM ubuntu:20.04
MAINTAINER hwan001 "MyGoogleAccount@gmail.com"

RUN apt-get update
RUN apt-get install -y vim net-tools
RUN apt-get install -y python3-dev build-essential python3 python3-pip python3-venv

COPY . /Pluto
WORKDIR /Pluto

RUN pip install -r requirements.txt
RUN rm -rf ./docker_*.ps

ENTRYPOINT ["python"]
CMD ["run.py"]

 

dockerfile을 실행하면 공식 우분투 컨테이너 이미지를 다운로드 받아와 apt install, 작업 디렉토리 생성 후 소스코드 복사하고 서버를 실행한다.

 

프로젝트에서 사용하는 DockerFile은 프로젝트 폴더에 같이 포함되어 있으며, 위의 파일을 조금 수정해서 사용한다. 


 

젠킨스 설정 및 스크립트 작성

 아래 과정들은 설치해둔 Remote 빌드 서버와 젠킨스 서버에서 작성해주었다. Remote 빌드 서버(노드)를 만들고 연결하는 과정은 생략한다.

 

GitHub와 연동

 Item을 생성하고 GitHub와 연동하여 코드를 가져오는 부분은 아래 사진처럼 해두었다. 해당 Item이 빌드되면 자동으로 코드를 가져온다.

**Failed 뜨지만 됨, 이유는 확인 중

 

Execute Shell

워크스페이스로 이동해서 스크립트들을 실행하고 해당 공간을 삭제하는 코드이다.

docker_build, docker_push 등은 도커 명령어를 좀더 간단하게 다루기 위해 추가한 쉘 스크립트 파일들이다.

개발하면서 버전을 올려 배포하고 싶을 때 properties.sh 에서 버전만 변경하고 GitHub에 Push해준 뒤 젠킨스로 빌드해주면 된다. docker_run.sh는 서버를 직접 실행할 때 사용하는 코드이다. (아래 코드들 참고)

cd ${WORKSPACE}
bash docker_build.sh
bash docker_push.sh
rm -rf ${WORKSPACE}

 

properties.sh

#!/bin/bash
version=0.0.5
imagename=hwan001/pluto

 

docker_build.sh

#!/bin/bash
source ./properties.sh

docker build -t ${imagename}:${version} .

 

docker_push.sh

#!/bin/bash
source ./properties.sh

docker push ${imagename}:${version}
docker push ${imagename}:latest

 


 

Docker Hub에 배포하고 서버에 설치하기

 Docker Hub에 이미지를 배포하기 위해 설정하는 과정을 생략했다. 아래 이미지를 다운받아 실행하면 docker로 실행하면바로 flask 웹 서버가 올라가는 걸 볼 수 있다. 

 

 서버는 Docker Hub에 Public으로 배포해 두었기 때문에 누구나 다운로드 받아볼 수 있다. (참고로 서버는 미완성이고 계속 변경될 수 있다.)

 

docker_run.sh

#!/bin/bash
source ./properties.sh

docker run -it --network=host ${imagename}:${version}

간단하게 실행해보려면 도커가 설치된 서버에서  Docker_run.sh 파일을 bash로 실행하면 된다.

 

만약 필요한 사람들만 다운로드 할 수 있게 하려면 GitHub처럼 Private로 배포하고 Collaborators에 계정을 추가해주면 된다. 하지만 이 기능은 유료기 때문에 다른 대안이 필요하다. 

 

나중에 기회가 된다면 해당 내용과 관련해서 글을 정리해보겠다.

 

728x90
반응형

'DevOps > CICD' 카테고리의 다른 글

Jenkins에 설치된 플러그인 목록 얻기  (0) 2023.08.10
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12939

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근 방식

  • split 하고 min, max 함수로 결과 return

 

3. 코드

def solution(s):
    list_s = [int(x) for x in s.split(" ")]
    return f'{min(list_s)} {max(list_s)}'

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12913

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근방식

  • DP문제이다.
  • 바텀업 방식으로 해결하면 좋다.
  • 점화식 :
    4개의 열(Column) 중 현재 열과 같은 열을 제외한 나머지 값 중 최대값을 현재값에 더한다.
for j in range(4):
	land[i][j] += max([land[i-1][x] for x in list({0, 1, 2, 3} - {j})])
  • 가장 큰 합들이 마지막 열에 반영되었기 때문에 가장 아래 열에서 최대값을 선택하면 된다.

 

3. 코드

def solution(land):
    answer = 0

    for i in range(1, len(land)):
        for j in range(4):
            land[i][j] += max([land[i-1][x] for x in list({0, 1, 2, 3} - {j})])
        
    answer = max(land[len(land)-1])
        
    return answer

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근방식

  • 주어진 brown과 yellow의 개수는 해당 색 부분의 넓이와 같다.
  • 가로를 x, 세로를 y라고 할 때, 주어진 brown과 yellow의 조합으로 xy와 x+y를 알 수 있다.
  • 간단한 이차방정식을 만들고 이후는 완전탐색으로 값을 찾음

 

3. 코드

def solution(brown, yellow):
    answer = []
    
    x_y = int(brown / 2) + 2
    xy = brown + yellow
    
    for x in range(1, x_y):
        for y in range(1, x_y):
            if (x + y == x_y) and (x*y == xy):
                if x >= y:
                    return [x, y]
        
    return answer

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근 방식

  • 괄호가 "("면 push 한다.
  • 괄호가 ")"면 pop한다.
  • 문자열의 반복이 끝났을 때, 스택에 값이 남아있다면 잘못된 괄호이다.

 

3. 코드

def solution(s):
    list_stack = []
    
    for ch in s:
        if ch == "(":
            list_stack.append(ch)
        else:
            if list_stack == []:
                return False
            else:
                list_stack.pop()
            
    return list_stack == []

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42747

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근 방식

  • H-Index는 N편의 논문중 H번 인용된 논문이 H편 이상일 때의 최대값을 의미한다.
  • 논문의 순서는 중요하지 않다.
  • H-Index는 내부의 인용된 회수와 같지 않을 수도 있다.

 

3. 코드

def solution(citations):
    citations = list(reversed(sorted(citations)))
    len_citations = len(citations)
    max_citations = max(citations)
    h=0
    
    for h in range(max_citations, 0, -1):
        cnt = 0
        for x in citations: 
            if x >= h:
                cnt+=1
        if cnt >= h:
            break
        
    return h

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근 방식

  • S, D, T, *, #을 공백을 포함하여 replace 후 공백으로 split 해주면 서로 분리됨(마지막 공백은 제거)
  • 각 기호에 맞는 점수를 제곱해서 정수로 변경해줌
  • *은 현재와 이전 값에 *2 (해당 범위에 * 이나 다른 기호가 포함될 경우도 고려해서 미리 정수로 변경해줌)
  • #은 0으로 변경 후 현재 값에 -1
  • 정수로 변환된 전체 리스트를 합쳐줌 -> 총점

 

3. 코드

def solution(s):
    for str_tmp in ["S", "D", "T", "*", "#"]:
        s = s.replace(str_tmp, str_tmp + " ") 
    res = [x for x in s.split(" ")][:-1]
    
    for i in range(len(res)):
        x = res[i]
        if x == "*" or x == "#":
            continue
        
        if "S" in x:
            res[i] = int(x.replace("S", ""))
        if "D" in x:
            res[i] = pow(int(x.replace("D", "")), 2)
        if "T" in x:
            res[i] = pow(int(x.replace("T", "")), 3)
            
    for i in range(len(res)):
        if res[i] == "*":
            res[i] = 0
            res[i-1] *= 2
            if i-2 >= 0:
                if res[i-2] != 0:
                    res[i-2] *= 2
                else:
                    res[i-3] *= 2
        if res[i] == "#":
            res[i] = 0
            res[i-1] *= -1
    
    return sum(res)

 

4. 결과

각 과정 출력

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/68935

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근 방식

  • 10진법을 2진법으로 만들때와 비슷하게 3으로 나눈 나머지를 리스트에 추가
  • 역순으로 들어갔기 때문에 문제에서 요구하는 앞뒤 반전은 생략
  • 해당 자리에 맞게 3의 제곱수를 곱해서 누적해줌

 

3. 코드

def solution(n):
    answer = 0
    tmp = []
    
    # 3^0:1, 3^1:3, 3^2:9, 3^3:27, 3^4:81...
    while(n!=0):
        tmp.append(n%3)
        n //= 3

    for x in range(len(tmp), 0, -1):
        i = len(tmp) - x
        answer += tmp[x-1] * 3**i
    
    return answer

 

4. 결과

728x90
반응형
728x90
반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근 방식

  • 최대 공약수 :  두 수 이상의 여러 수의 공약수 중 최대인 수 -> n과 m에 동시에 나눠지는 i 중 가장 큰 값
  • 최소 공배수 :  두 수 이상의 여러 수의 공배수 중 최소인 수 -> n과 m을 곱한 값을 최대 공약수로 나눈 값 (유클리드 호제법)
  • 더 쉬운 방법 : math 패키지 활용
import math

math.gcd(a, b)
math.lcm(a, b)

 

3. 코드

def solution(n, m):
    answer = [1, 0]
    
    # GCD
    for i in range(1, m+1):
        if n%i ==0 and m%i==0:
            answer[0] = i
            
    # LCM
    answer[1] = n * m // answer[0]

    return answer

 

4. 결과

728x90
반응형
728x90
반응형

flask_jwt_extended

 flask에선 flask_jwt_extended라는 이름으로 jwt 토큰에 대한 기능을 제공해준다. 

토큰 인증에 대한 테스트는 POSTMAN으로 했고, JWT에 대한 내용은 아래 글을 참고하면 좋을 것 같다. 

https://hwan001.tistory.com/277

 

[python] JWT 모듈

JWT (Json Web Token)  JWT는 웹 표준(RFC 7519) 으로 두 개체 사이에서 JSON을 사용하여 정보를 안전성 있게 전달해준다. 웹에서 로그인을 하거나 인증을 받게되면 보통 세션을 사용하여 인증 정보를 기

hwan001.co.kr


 

Access 토큰 생성하기

config.py

flaskJwt_secret_key = "secret_key"
flask_admin_id = "admin"
flask_admin_pw = "1234"

 

app.py

import sys
import subprocess

try:
    from flask import Flask
    from flask import request, render_template, make_response, jsonify, session, redirect, url_for, Response
    from flask_jwt_extended import jwt_required, get_jwt_identity, create_access_token, JWTManager

except:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])


import config

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = config.flaskJwt_secret_key
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(hours=1) # 기본설정은 15분

jwt = JWTManager(app)

# 메인 페이지
@app.route('/')
def main():
    return render_template('main.html')

# 로그인 정보가 일치할 경우, 토큰을 생성한다.
@app.route("/login", methods=['POST'])
def login():
    input_data = request.get_json()
    
    user_name = input_data['id']
    user_pw = input_data['pw']
	
    if (user_name == config.flask_admin_id) and (user_pw == config.flask_admin_pw):
        return jsonify(result = "True", access_token = create_access_token(identity = user_name))
        
    return jsonify(result = "False")

 

postman

 


 

토큰 사용하기

 

app.py

#from flask_jwt_extended import jwt_required, get_jwt_identity

@app.route("/my_jwt_test", methods=['GET'])
@jwt_required()
def my_jwt_test():
    current_user = get_jwt_identity() 
    
    return jsonify(logged_in_as=current_user), 200

 

postman

 

728x90
반응형
728x90
반응형

JWT (Json Web Token)

 JWT는 웹 표준(RFC 7519) 으로 두 개체 사이에서 JSON을 사용하여 정보를 안전성 있게 전달해준다.

웹에서 로그인을 하거나 인증을 받게되면 보통 세션을 사용하여 인증 정보를 기록하는데, JWT는 토큰 내부의 Signature에 해당 정보를 기록한다. JWT를 사용할 경우 인증을 위해 웹 브라우저의 세션 공간을 사용하지 않고 인증 여부를 알 수 있기 때문에 확장성이 좋다. 또한 생성 시 권한을 지정할 수 있어 각 토큰별로 기능을 제어할 수 있고 플랫폼에 종속적이지 않다.

 

JWT의 구조는 Header.Payload.Signature로 나뉘어져 있다. Header는 토큰의 typ(해당 토큰의 타입)과 alg(해싱 알고리즘)을 Payload는 토큰에 담을 정보를 그리고 마지막 Signature는 Header와 Paylaod의 Base64 인코딩 값을 시크릿 키와 함께 다시 한번 해싱한 후 인코딩한 값을 가진다.

 

파이썬의 PyJWT 패키지를 사용해서 직접 토큰을 만들고 검증해보자.


 

구현

 파이썬에서의 jwt 사용은 아래처럼 PyJWT를 설치하거나 requirements.txt에 작성해두고 사용할 수 있다.

간단하게 토큰의 생성과 검증하는 기능을 만들어 보았다.

pip install PyJWT

 

import sys
import subprocess

try:
    import jwt

except:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
    
    import jwt


class Jwt():
    def __init__(self, payloads, secret_key):
        self.payloads = payloads
        self.algorithm = "HS256"
        self.secret_key = secret_key

    def create_token(self):
        return jwt.encode(self.payloads, key=self.secret_key, algorithm=self.algorithm)

    def verify_token(self, token):
        try:
            payload = jwt.decode(token, key=self.secret_key, algorithms=self.algorithm)
        except jwt.ExpiredSignatureError:
            return "토큰 인증 만료"
        except jwt.InvalidTokenError:
            return "토큰 검증 실패"
        
        return payload


if __name__ == '__main__':
    payload = {"id":"hwan"}
    my_jwt = Jwt(payload, "secret")
    token = my_jwt.create_token()

    print("token : ", token)
    print("payload : ", my_jwt.verify_token(token))

 

결과


 

 

후기

 JWT를 직접 구현할 수도 있겠지만 파이썬의 JWT 패키지를 사용한다면 간단하게 토큰을 만들어볼 수 있다. 

위에서 생성한 토큰은 아래 사이트에서도 검증이 가능하다. 직접 구현해볼 땐 아래 사이트를 활용하면 도움이 될 것 같다.

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

728x90
반응형
728x90
반응형

** 아래 글은 개인의 조사를 바탕으로 주관적으로 작성되었습니다. 잘못된 부분은 댓글로 남겨주시면 수정하겠습니다.

 

소프트웨어 생명 주기 (Software Development Life Cycle, SDLC)

 소프트웨어의 계획부터 배포에 이르기까지 시간적인 경과를 의미하며, 명확하게 나눠진 여러 단계를 통해 시스템의 품질을 올려 고객의 만족도를 높이는 것이 목적이다. 이런 목적의 달성을 위해 구조적, 정보공학적, 객체지향, CBD(Component-Based Development), Agile, DevOps 와 같은 방법론들과 여러 모델들이 발생하게 되었다.

 

아래 이미지는 SDLC의 각 과정을 나타낸 그림이다.

 


 

구조적 방법론

1970년 발생한 기능 중심의 전통적인 방법론이다. 자세한 내용은 아래에 정리해보았다.

 

절차

요구사항 분석 - 구조적 분석 - 구조적 설계 - 구조적 프로그래밍

  • 요구사항 분석 : 데이터 분석, 시스템 환경 분석, 사용자 요구기능
  • 구조적 분석 : DFD 작성, DD 작성, Minispec 작성, DB 분석 (1/2)
  • 구조적 설계 : DB 분석 (2/2), DB 설계, 어플리케이션 설계
  • 구조적 프로그래밍 : 3개 논리적 구조로 프로그래밍

 ** DFD : 데이터 흐름도, 기능별로 분할하여 표현한 구조도

 ** DD : 자료 사전, 자료의 의미나 단위, 값 등에 대한 사항을 정의

 ** STD : 상태 전이도, 상태가 변경되는 과정과 프로세스를 명시하는 것

 ** NS 차트 : 알고리즘은 순차, 선택, 반복 구조면 설명이 가능하다.

 

등장 배경

 GOTO 문을 쓰지 말자라는 주장이 호응을 얻으면서 분석과 설계를 구조적으로 하자. 라는 의견으로 확대됨

 

특징

 데이터 흐름 지향 (DFD/ ERD), 모듈의 분할과 정복에 의한 하향식(Topdown) 설계방식 - 소수의 전문가, 모듈의 구조화를 통한 재사용/ 유지보수성 제고, SDLC 구조를 가진 폭포수 모델이 기본. 단일입구/ 단일 출구의 처리구조를 가짐. 

정형화, 체계화, 모듈화의 장점이 있다.

 

단점 

 어플리케이션은 여전히 기능적 설계, 기능의 유지보수와 재사용성은 낮음, 프로젝트의 관리 및 조직, 역할 등 방법론적 다른 요소들의 정의가 없음., 단순한 소프트웨어의 개발만 목표로 하여 단위 프로젝트에서만 사용, 데이터의 정보 은닉이 안됨.

 

모델

 폭포수(Water Fall), v-model

 

참고 링크

https://ko.wikipedia.org/wiki/V_%EB%AA%A8%EB%8D%B8

 

V 모델 - 위키백과, 우리 모두의 백과사전

V 모델의 소프트웨어 개발 프로세스. V 모델(V-model)은 소프트웨어 개발 프로세스로 폭포수 모델의 확장된 형태 중 하나로 볼 수 있다. 아래 방향으로 선형적으로 내려가면서 진행되는 폭포수 모

ko.wikipedia.org


 

정보공학적 방법론

1980년대 발생한 자료 중심의 방법론으로 대규모 정보 시스템을 구축하는데 적합하다.

기업 정보 시스템에 공학적 기법을 적용하여 시스템의 계획, 분석, 설계 및 구축을 하는 데이터 중심의 방법론이다.

자세한 내용은 아래를 보자.

 

절차 

 정보 전략 계획 수립 단계 - 업무 영역 분석 단계 - 업무 시스템 설계 단계 - 업무 시스템 구축 단계

 

등장 배경

 정보 시스템은 소프트웨어의 개발과는 달리 하드웨어, 네트워크 등 여러 소프트웨어와 복잡하게 연결되는 대규모 시스템이기 때문에 이러한 시스템을 개발하기 위해서는 장기간, 많은 인력이 소모됨. 그러므로 철저한 계획과 팀워크를 기반으로한 프로젝트의 관리와 이를 위한 잘 짜여진 방법론이 필요하게 됨

 

특징

  • 일반전인 소프트웨어 개발이 아닌 기업의 Biz 전략에 따라 수립된 ISP에 따라 정보시스템 통합에 그 초점이 맞추어짐.
  • 따라서, ISP 수립 - 업무영역 분석 - 업무시스템 설계 - 업무시스템 구축 의 순서를 가진다.
  • Process는 변하지만 Data는 불변이기 때문에 프로그램 로직은 데이터 구조에 종속적이며(CRUD를 따르며) 데이터 안정성을 추구하기 위한 데이터 구조에 중점을 둔다.
  • 기본적으로 정보공학은 공학적 개발 방법론이며 자동화 도욱, CASE 툴을 이용하여 코드의 자동 생성을 목표로 한다.

단점

 어플리케이션은 여전히 기능적 설계, 기능의 유지보수, 재사용성 낮음

 


 

객체지향 방법론

 1990년대 발생한 객체 중심의 방법론으로 현실 세계의 개체(Entity)를 하나의 객체(Object)로 만들어, 기계를 조립하듯 객체의 조립을 통해 필요한 소프트웨어를 구현하는 방법론이다. 복잡한 현실 세계를 모델링하며 객체, 클래스, 메시지 등으로 구성되어 있다.

 

절차

개발 준비 - 분석 - 설계 - 구현 - 테스트 - 전개 - 인도

 

등장 배경

 구조적 방법론이나 정보공학 방법론 모두 프로세스와 데이터를 분리하여 처리한다는 단점은 이를 통합하여 처리하는  객체 지향의 등장에 가장 큰 배경이 되었다.

 

특징

재사용성이 뛰어나고 유지보수 비용이 적어 생산성 및 품질을 향상 시킬 수 있다.

추상화, 캡슐화, 상속, 정보은닉 등 객체를 중심으로 프로그래밍 구조를 단순화함

구조적, 정보공학적 방법론은 프로세스와 데이터 분리했지만 객체지향 방법론은 프로세스와 데이터의 통합함 (클래스)

분석과 설계간 차이가 없음.

 

단점

  • 전문가 부족 (?)
  • 기본 SW 기술 필요
  • 상속이 많으면 성능이 저하되는 단점 
  • 다형성이 많으면 유지보수가 어려워진다.

 

추상화

  • 개념 : 현실세계의 사실은 그대로 객체로 표현하기 보다는 문제의 중요한 측면을 주목하여 상세 내역을 없애 나가는 과정
  • 역할 : 복잡한 프로그램을 간단하게 해주고 분석의 초점을 명확히 함
  • 특징 : 클래스를 이용함으로써 데이터와 프로세스를 함께 추상화 구조에 넣어, 더 완벽한 추상화를 실현함

 

캡슐화 (정보은닉) 

  • 개념 : 객체의 상세한 내용을 객체 외부에 숨기고 단순히 메시지 만으로 객체와의 상호작용을 하게 하는 것.
  • 역할 : 객체의 내부 구조와 실체를 분리하여 내부의 변경이 프로그램에 미치는 영향을 최소화하여, 유지보수성을 올림
  • 특징 : Public과 Private

 

상속성

  • 개념 : 슈퍼 클래스가 갖는 성질을 서브 클래스에 자동으로 부여하는 것.
  • 역할 : 프로그램을 쉽게 확장할 수 있도록 해주는 강력한 수단

 

다형성

  • 개념 : 하나의 인터페이스를 이용하여 서로다른 구현 방법을 제공하는 것
  • 역할 : 특정지식을 최소화한 관련된 클래스들을 위한 일관된 매개체를 개발하는 수단을 제공

 


 

CBD 방법론

2000년대 발생한 컴포넌트 중심의 방법론이다.

 

** 컴포넌트 : Context와 Interface

** 컨테이너 : 컨포넌트를 구현하기 위한 서비스 런타임 환경

 

절차

 도메인 분석 - 도메인 설계 - 컴포넌트 추출 - 컴포넌트 설계 - 컴포넌트 구현

 

특징

  • Black Box 재사용 : 인터 페이스를 이요하여 재사용
  • 추상화, 캡슐화 : Input과 Output만 있음
  • 표준화된 UML을 통한 모델링 및 산출물 작성
  • 반복 점진적 개발 프로세스 제공
  • 표준화된 산출물 작성 및 컴포넌트 제작 기법을 통한 재사용 성 향상.

 

품질 측정 지료

 기능에 대한 이해가 편함, 변경이 편함, 컴포넌트간의 결합도(응집도는 이미 컴포넌트를 만들때 고려됨)

 


 

Agile 방법론

 2001년 발생한 방법론으로 고객의 요구사항 변화에 유연하게 대응할 수 있도록 일정한 주기를 반복하면서 개발 과정을 진행하는 방법론이다. 소규모 프로젝트, 고도로 숙달된 개발자, 급변하는 요구사항에 적합하다.

애자일 방법론의 대표적인 종류로는 XP (익스트림 프로그래밍), 스크럼과 칸반 보드, 크리스탈 등이 있다.

** TDD는 XP의 하위 항목이다.

 

등장 배경

기존 개발 방법론의 한계와 SW 개발 환경의 변화로 인한 새로운 방법론이 필요

 

절차

사용자 스토리 - (계획 -> 개발 -> 승인 테스트)의 과정을 반복

 


 

DevOps

2009년 발생한 방법론이다. Agile의 한계를 극복하기 위해 나왔으며, 방법론을 실현하기 위한 다양한 도구들이 발생되어 기존의 방법론들 보다 좀 더 명확하고 직관적으로 변했다고 생각한다.

다양한 파이프 라인들을 통해 부서나 팀원 간의 문제 발생 요소를 최소화하면서 결과물의 품질과 개발 효율을 높인다.

 

좀 더 많은 정보는 아래 글을 참고하면 좋을 것 같다.

https://hwan001.co.kr/200?category=1081020 

 

[SE] DevOps

** 아래 글은 개인의 조사를 바탕으로 주관적으로 작성되었습니다. 잘못된 부분은 댓글로 남겨주시면 수정하겠습니다. DevOps ?  최초 데브옵스의 개념은 2009년 O'Reilly에서 주회한 Velocity 컨퍼런스

hwan001.co.kr

 

728x90
반응형

'Computer Science > 소프트웨어 공학' 카테고리의 다른 글

[SE] XP (eXtreme Programming)  (2) 2022.07.10
[SE] MSA (Micro Service Architecture)  (0) 2022.06.26
[SE] DevOps  (0) 2022.04.12
728x90
반응형

 백엔드 공부를 하다보면 볼 수 있는 로드맵 이미지이다.

각 내용을 정리하고 개인적으로 필요하다고 생각하는 내용들도 조금 추가해 보았다.

백엔드 로드맵

 

Internet

How does the internet work? 

  • 패킷과 프로토콜을 OSI 7을 기반으로 설명
  • A PC의 프로그램에서 B PC에 위치한 프로그램으로 패킷이 전달되는 과정
  • Private IP와 Public IP
  • 라우터와 스위치
  • 전송 계층의 전송 장비
  • CIDR, 서브네팅, 클래스

 

What is HTTP?

 HTTP가 무엇인지에 대한 설명, 아래 요소들을 설명하면 되는데 조금 더 나가면 브라우저에 대한 내용과 HTTPS와의 차이를 같이 말할 수 있을 듯 하다.  

  • 브라우저에 대한 이야기 (7계층에 위치한 프로그램의 일종)
  • HyperText Transfer Protocol, HTML과 관계
  • TCP 기반이지만 HTTP/3부턴 UDP 기반
  • GET, POST, PUT, DELETE 등의 메소드

 

Browsers and how they work?

 브라우저가 뭐고 어떻게 작동되는지를 물어본 질문이다.

부라우저의 구조를 설명하면서 작동원리를 말하면 될 것 같다.

  • UI/ UI 백엔드
  • 네트워킹
  • 렌더링 엔진
  • 브라우저엔진
  • 데이터 저장
  • 자바스크립트 인터프리터

** Jinja와 파이썬 인터프리터에 대한 이야기도 하면 좋을 듯

 

DNS and how it works?

 Domain Name Server에 대한 설명, 역할, 알려진 서버 (구글 8.8.8.8) 등

 

What is Domain Name?

 도메인과 아이피에 대한 개념

 

What is hosting?

 도메인 관리, 왜 필요하고 어떻게 하는지 예시를 들어 말하면 좋을 듯 함

(ex. 국내 호스팅 제공 업체에서 도메인 구입 후 이용 중), 레코드에 대한 개념도 추가로 공부하면 좋을 듯

 

 

Basic Fronted Knowledge

 프론트를 만들기 위한 기본 지식으로 아래 언어들을 공부해야 한다.

  • HTML : HyperText Markup Language
  • CSS : Cascading Style Sheets
  • JavaScript + JavaScript Library (jQuery, react)

 

Basic Backend Knowledge

 백엔드를 만들기 위한 기본 지식으로 아래 언어들을 공부해야 한다.

여러 방법으로 만들 수 있는데 본인이 자신 있는 언어를 기반으로 프레임워크를 다루는 게 좋을 것 같다.

(국내에선 자바 + 스프링 만한게 없다고 생각한다.)

  • 자바/jsp + Spring framework
  • Python + Django/Flask/FastAPI framework
  • Node js + Express

 

OS and General Knowledge

 Basic Terminal Commands, Terminal Usage, POSIX Basics은 직접사용하면서 익히고 나머지 운영체제에 대한 내용들은 공룡책보자..!

  • Terminal Usage
  • How OSs Work in General : OS 작동 원리
  • Process Management : 프로세스 관리
  • Threads and Concurrency
  • Basic Terminal Commands : Grep, awk, sed, lsof, curl, wget, tail, head, less find, ssh, kill
  • Memory Management
  • Interprocess Communication
  • I/O Managemanet
  • POSIX Basics : stdin, stdout, stderr, pipes
  • Basic Networking Concepts

 

Learn a Language

 Java, C#, PHP, RUST, GO, JavaScript, Python, Ruby, C++ 등 프로그래밍 언어

 

 

Version Control Systems 

 코드의 형상 관리와 버전 관리를 위해 Git 또는 Subversion(SVN) 을 사용한다.

각 도구의 차이점과 특징, 사용법 등을 알아두면 좋을 것 같다.

  • Basic Usage of Git
  • Repo hosting services : GitHub, GitLab, Bitbucket

 

Databases

 SQL 쿼리를 사용하는  RDB(관계형 데이터베이스)와 NoSQL DB의 차이를 알고 각 디비를 프로그램에서 연동해보면 좋을 듯 하다. 테이블 설계와 최적화, 샤딩 등을 추가로 해보면 좋다.

  • Relational Databases : PostgreSQL, MySQL, MariaDB, MS SQL, Oracle
  • NoSQL : MongoDB, RethinkDB, CouchDB, DynamoDB
  • More about Databases : ORMs, ACID, Transactions, N+1 Problem, Database Normalization, Indexes and how they work Data Replication, Sharding Strategies, CAP Theorem

 

Learn about APIs

REST와 GraphQL 차이와 사용법을 다른 글에서 작성 중이다.

Swagger와 JSON, JWT는 기본적으로 알아두어야된다고 생각한다.

  • HATEOAS
  • Open API Spec and Swagger
  • Authentication : twilio, opt, e-mail, JWT
  • REST 
  • Graph QL : Apollo, Relay Modern
  • JSON APIs
  • SOAP

 

Caching

CDN과 Redis에 대해서 알아볼 예정이다.

Redis는 In-Memory DB로 알고있는데 Caching으로 분류된게 의문이지만 일단 넣어두었다.

  • CDN
  • Server Side : Redis, Memcached
  • Client Side 

 

Web Security Knowledge

해싱, SSL/TLS, CA인증서 등에 대해서 알아보자. 좀 더 확장하면 RSA, ECC 등의 암호화 알고리즘을 공부해봐도 좋을 것 같다.(SSL 안에서 사용된다.)

  • Hashing Algorithms : MD5 and why not to use it, SHA Family, scrypt, bcrypt
  • HTTPS, CORS, Content Security Policy, SSL/TLS, OWASP Security Risks

 

Testing

테스트 기법과 테스트 자동화

  • Intergration Testing
  • Unit Testing
  • Functional Testing
  • Test Automation : 라노렉스, Python, Guitar 등

 

CI/ CD

DevOps와 더 큰 연관이 있다고 생각한다. 시간될 때 공부해두자.

  • GitOps : GitLab, ArgoCD
  • K8S 
  • Jenkins

 

Design Patterns and Development Principles

MVC, DDD, TDD 위주로 공부하자.

  • MVC (Model View Control)
  • GOF (Gang Of Four)
  • DDD (Domain Driven Design)
  • TDD (Test Driven Development)
  • SOLID
  • KISS
  • YAGNI
  • DRY

 

Architectural Patterns

아키텍쳐에 대한 내용을 알고 있는 것과 모르는 것의 차이는 크다고 생각한다. 

MA, MSA, Serverless 정도만 알면 될 것 같다.

  • MA (Monolithic Architecture)
  • MSA (Micro Services Architecture)
  • Serverless
  • SOA
  • CQRS and Event Sourcing

 

Search Engines

로그 등의 빅데이터를 수집하고 검색할 수 있는 엔진 (키바나는 가시화 도구)

  • Elasticsearch(+kibana)
  • Solr

 

Message Brokers

  • RabbitMQ
  • Kafka

 

Containerization vs Virtualization

컨테이너화와 가상화에 대한 내용인 듯 하다. 

Docker를 위주로 공부하자. (사용법, 컨테이너 개념)

  • Docker
  • rkt
  • LXC

 

Graph Databases

  • Neo4j

 

WebSockets

 

 

Web Servers

외부 사용자들의 접근을 위한 웹 서버들이다. config 작성방법과 백엔드(Python일 경우 Gunicon 또는 uwsgi) 연동을 해보면 좋을 것 같다.

  • Nginx
  • Apache
  • Caddy
  • MS IIS

 

Building for Scale

마이그레이션과 수직적, 수평적 확장을 제외하고 잘 모르겠다. 하나씩 알아보자.

  • Mitigation Strategies : Graceful, Degrodation, Throttling, Backpressure, LoadShifting, Circuit Breaker
  • Understand the Diff : Instrumentation, Monitoring, Telemetry
  • Migration Strategies
  • Horizontal vs Vertical Scaling
  • Building with Observability in mind

 

728x90
반응형
728x90
반응형

Yahoo_fin 모듈

  yahoo_fin은 시가총액, 배당수익률, 종목에 대한 최신 정보를 제공하는 Python 3 패키지이며, 아래 추가 기능들을 제공한다.

  • 손익 계산서/ 대차 대조표/ 현금 흐름표/ 재무 상태 표
  • 보유자 정보 및 분석가 데이터 스크래핑
  • 가상자산(암호화폐) 데이터
  • 현재 거래일 실시간 주가 및 거래 상위 종목
  • 옵션 가격 및 만료 날짜 검색 모듈
  • 수입 캘린더 기록
  • 금융 뉴스 RSS 피드 스크랩

yahoo_fin은 stock_info module, options module 두 가지 모듈로 구성된다.

자세한 옵션이 궁금하면 아래 링크들에서 찾아보자.

 

https://algotrading101.com/learn/yahoo-finance-api-guide/ 

 

Yahoo Finance API - A Complete Guide - AlgoTrading101 Blog

The Yahoo Finance API is a range of libraries/APIs/methods to obtain historical and real time data for a variety of financial markets and products.

algotrading101.com

https://officejs.files.wordpress.com/2020/05/how-to-download-fundamentals-data-with-python.pdf


 

 코드

pip install yahoo_fin

 

# requirements.txt : requests_html, yahoo_fin 추가

import sys
import subprocess

try:
    from yahoo_fin.stock_info import *

except:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
    
    from yahoo_fin.stock_info import *


if __name__ == '__main__':
    ticker = "JEPI"

    if ticker in tickers_dow():
        print("dow")
    if ticker in tickers_other():
        print("other")
    if ticker in tickers_sp500():
        print("sp500")
    if ticker in tickers_ftse250():
        print("ftse250") 
    if ticker in tickers_ftse100():
        print("ftse100")
    if ticker in tickers_ibovespa():
        print("ibovespa")
    if ticker in tickers_nasdaq():
        print("nasdaq")

    print(get_data(ticker))

 

 


 

후기

 yfinance, FinanceDataReader 등을 사용봤지만 전체 티커의 목록을 얻어오거나 실시간 데이터를 얻기엔 불편한 점이 있었다. yahoo_fin에선 여러 소스에서 스크랩과 api를 활용하여 데이터를 받아오기 때문에 실시간 데이터와 전체 목록을 얻어오는 기능이 필요하다면 유용하게 사용할 수 있다. 하지만 내부 코드를 보면 위키피디아 등에서도 데이터를 스크랩해오는데.. 누구나 수정할 수 있는 위키피디아의 특성 상 항상 신뢰하긴 어려울 수도 있을 것 같다.

 

728x90
반응형

+ Recent posts