기본 콘텐츠로 건너뛰기

라벨이 Python인 게시물 표시

Python에서 CLI 도구 만들기 (argparse vs click)

파이썬으로 명령줄 도구 만드는 중이신가요? 저도 얼마 전에 비슷한 작업을 했었는데, argparse 랑 click 이라는 두 라이브러리 때문에 꽤 고민했거든요. 둘 다 훌륭하지만, 어떤 걸 써야 할지 정말 헷갈리더라고요. 그래서 제가 직접 써보고 느낀 점들을 바탕으로 얘기해 드릴게요! 먼저, argparse 는 파이썬에 기본적으로 포함된 라이브러리예요. 기능은 정말 막강하죠. 마치 스위스 아미 나이프처럼, 세세하게 옵션을 조절할 수 있어요. 복잡한 도구를 만들 때는 정말 유용해요. 하지만, 간단한 걸 만들 때는 쓸데없이 코드가 길어지는 느낌이 들더라고요. 마치 거대한 대포로 모기를 잡는 것 같은 느낌이랄까요? 저는 처음에 argparse 로 시작했는데, 코드가 너무 길어지니까 나중에 수정하기가 힘들더라구요. 괜히 힘들게 했나 싶었어요. 반면에 click 은 외부 라이브러리인데, 사용하기가 훨씬 쉽고 간결해요. 마치 레고 블록처럼, 몇 개의 코드만으로도 멋진 명령줄 도구를 만들 수 있죠. 특히 데코레이터라는 기능을 사용하는데, 처음엔 좀 어렵게 느껴질 수도 있지만, 익숙해지면 코드가 정말 깔끔해져요. 저는 간단한 도구를 만들 때 click 을 사용했는데, 정말 속도가 빨랐어요. 코드도 짧고 이해하기도 쉬워서 좋았습니다. 마치 마법처럼 뚝딱 만들어지는 느낌이었어요! 실제로 제가 만들었던 간단한 파일 처리 도구 예시를 보여드릴게요. argparse 로 만든 코드는 이렇게 길어졌지만, click 으로 만든 코드는 훨씬 짧고 보기 편하더라고요. 1. argparse 예제 import argparse def main(): parser = argparse.ArgumentParser(description="파일 내용을 출력하거나 줄 수를 세는 도구") parser.add_argument("filename", help="읽을 파일 이름"...

Pandas 없이도 할 수 있는 데이터 처리 - itertools, collections 정복하기

Pandas 없이 데이터 처리하기? 생각만 해도 머리가 지끈거리시죠? 저도 처음엔 그랬어요. Pandas는 정말 편리하니까요. 하지만 가끔은 Pandas의 무게가 부담스러울 때가 있잖아요? 특히 데이터가 엄청나게 클 때, 혹은 좀 더 가볍고 빠른 처리가 필요할 때 말이죠. 그럴 때 Python의 숨겨진 보물, itertools 와 collections 를 꺼내들면 됩니다! 이 두 모듈은 마치 숨겨진 비밀병기 같아요. Pandas처럼 화려하진 않지만, 제대로 활용하면 Pandas 못지않게 강력한 힘을 발휘하거든요. 저도 처음엔 낯설었지만, 쓰다 보니 매력에 푹 빠졌어요. 자, 이제부터 itertools 와 collections 의 세계로 함께 떠나볼까요? 먼저 itertools 부터 살펴볼게요. 이건 마치 데이터를 가지고 놀 수 있는 장난감 상자 같아요. 데이터를 만들고, 섞고, 필터링하고… 정말 다양한 일을 할 수 있죠. combinations , permutations 같은 함수는 순열 조합을 쉽게 계산해줘서 정말 편리해요. 그리고 무엇보다 메모리 효율이 뛰어나서, 데이터가 아무리 많아도 걱정 없답니다. 대용량 데이터 처리할 때 정말 빛을 발하는 친구예요. 그리고 collections 는요? 이건 데이터를 깔끔하게 정리하고 관리하는 데 딱이에요. namedtuple 은 데이터에 이름을 붙여서 관리할 수 있게 해주고, defaultdict 는 기본값을 설정해줘서 코드를 훨씬 간결하게 만들어줘요. Counter 는 데이터 빈도수를 척척 계산해주는 든든한 조력자고요. 제가 가장 자주 쓰는 건 deque 인데, 데이터를 효율적으로 추가하고 삭제할 때 정말 유용하더라고요. 자, 이제 실제 예제를 보여드릴게요. 먼저 itertools.groupby 를 이용해서 CSV 파일을 처리하는 방법인데요. 예전에 프로젝트에서 비슷한 작업을 했었는데, Pandas를 쓰려니 너무 무겁더라고요...

Python 프로젝트에서 linters & formatters 통합 설정 (black, isort, flake8)

자, Python 프로젝트를 좀 더 깔끔하게 관리하고 싶으신가요? 저도 한때 코드가 엉망이 되는 바람에 엄청 고생했던 기억이 나네요. 그래서 Black, Isort, Flake8 이 세 친구를 만나게 된 거죠! 이 셋이 있으면 코드 품질 유지, 협업, 유지보수가 정말 쉬워져요. 지금부터 제가 직접 써먹은 방법을 알려드릴게요. 마치 제가 옆에서 코딩하는 것처럼 말이죠! 먼저, 이 녀석들이 뭔지 간단히 설명해 드릴게요. Flake8은 코드 스타일 가이드라인을 지키는지, 혹시 버그가 숨어있는지, 코드가 너무 복잡하지는 않은지 살펴주는 린터(Linter)예요. 마치 코드의 문법 교정 선생님 같은 존재죠. PyFlakes, pycodestyle, McCabe 세 가지 도구를 하나로 묶은 슈퍼 린터라고 생각하면 돼요. 그리고 Black과 Isort는 포매터(Formatter)입니다. 코드를 자동으로 예쁘게 정리해주는 친구들이죠. Black은 들여쓰기나 줄 바꿈 같은 걸 알아서 깔끔하게 맞춰주고, Isort는 import 문들을 알파벳 순서대로 정렬해줘요. 덕분에 코드 읽기가 훨씬 편해졌어요. Black은 특히 설정을 거의 건드릴 필요가 없어서 정말 편리하더라고요. 저처럼 귀찮은 걸 싫어하는 분들께 강력 추천합니다! 자, 이제 실제로 사용하는 방법을 알려드릴게요. 먼저 requirements.txt 파일에 black , isort , flake8 를 추가해야 합니다. 이게 없으면 위 세 친구를 사용할 수 없으니까 꼭 추가해야 해요! 그리고 pyproject.toml 파일을 만들어 설정을 해야 하는데, 이 파일이 없으면 새로 만들면 됩니다. 저는 처음에 이 파일을 만드는 걸 깜빡해서 꽤 애를 먹었던 기억이 나네요. pyproject.toml 파일에는 이렇게 설정을 써 넣으면 됩니다. line-length는 코드 한 줄의 최대 길이를 정하는 건데, 저는 88로 설정했어요. target-versi...

Python 유닛 테스트 완전 가이드 (pytest 중심)

자, 파이썬 유닛 테스트 이야기, 시작해볼까요? 솔직히 말씀드리면, 저도 처음엔 파이썬으로 개발하면서 테스트 코드 작성이 얼마나 중요한지 잘 몰랐어요. 그냥 돌아가기만 하면 되는 거 아닌가? 싶었죠. 근데 프로젝트 규모가 커지고 기능이 복잡해지니까… 끔찍한 버그들이 쏟아지는 거예요. 그때부터 테스트의 중요성을 절실히 깨달았습니다. 그래서 오늘은 제가 pytest라는 훌륭한 도구를 통해 얻은 경험을 여러분과 나누려고 합니다! pytest는 파이썬 유닛 테스트를 위한 프레임워크인데요, 쉽게 말해 우리가 짠 코드 조각(함수나 클래스)이 제대로 작동하는지 확인하는 도구라고 생각하시면 됩니다. 마치 레고 블록 하나하나가 제대로 맞는지 확인하는 것과 같아요. 이게 왜 중요하냐구요? 작은 오류 하나 때문에 전체 시스템이 무너지는 걸 막아주거든요. 게다가 나중에 코드를 수정하거나 기능을 추가할 때도 훨씬 안전하고 편해집니다. 미리 테스트 해 놓으면, 내가 뭘 고쳤는데 엉뚱한 곳이 망가졌는지 바로 알 수 있으니까요. 자, 그럼 유닛 테스트의 기본 개념부터 살펴볼까요? 우선 ‘유닛’이란 각각 독립적으로 작동하는 코드의 최소 단위를 말해요. 예를 들어, 숫자 두 개를 더하는 함수라면 그 함수 자체가 하나의 유닛이 되겠죠. pytest를 이용하면 이런 유닛들을 하나씩 테스트할 수 있습니다. 테스트 함수는 test_ 로 시작하는 이름을 붙여주면 되는데, 예를 들어 test_add() 라는 함수가 있다면, add() 함수를 테스트하는 함수라는 걸 쉽게 알 수 있겠죠? 그리고 assert 문을 이용해 예상 결과와 실제 결과를 비교합니다. 결과가 다르면 테스트가 실패하고, 그 부분을 고쳐야 한다는 신호를 받는 거죠. 코드 예제를 보여드릴게요. 아래 코드는 add() 함수를 테스트하는 예시입니다. import pytest def add(x, y): return x + y def test_add()...

Python의 enum, namedtuple, TypedDict 등 구조화 기법 비교

파이썬 개발하다 보면, 데이터를 깔끔하게 관리하는 게 얼마나 중요한지 절실히 느껴지죠? 저도 처음엔 그냥 딕셔너리만 썼는데, 프로젝트가 커지니까 코드가 스파게티처럼 엉켜서 유지보수가 힘들더라고요. 그래서 파이썬에서 데이터 구조를 효율적으로 관리하는 방법을 찾아보다가 enum , namedtuple , TypedDict 를 알게 됐어요. 이 세 가지, 각각의 매력이 다르니까 상황에 맞춰 골라 쓰는 게 중요한데, 제가 직접 써보면서 느낀 점들을 정리해 볼게요. 먼저, enum (열거형)부터 볼까요? 이건 마치 이름표를 붙여주는 것과 같아요. 예를 들어 HTTP 상태 코드(200, 400, 500 등) 같은 고정된 값들을 관리할 때 딱이죠. 숫자만 써놓으면 나중에 코드 보고 무슨 의미인지 헷갈릴 수 있잖아요? enum 을 쓰면 HTTPStatus.OK 이렇게 직관적으로 쓸 수 있어서 코드가 훨씬 깔끔해져요. 저는 한번은 이걸 안 쓰고 숫자만으로 관리했는데, 나중에 코드 수정하다가 숫자 뜻을 까먹어서 한참 헤맨 적이 있답니다. 그때 enum 의 소중함을 깨달았죠! enum.Enum 클래스를 상속받아서 간단하게 만들 수 있어요. 다음은 namedtuple (명명된 튜플) 입니다. 튜플은 데이터를 묶어서 다루는 데 좋지만, 각 요소가 숫자로만 표시되니 뭐가 뭔지 알기 어려울 때가 있죠. namedtuple 은 각 요소에 이름을 붙여줄 수 있어서, 훨씬 이해하기 쉬워요. 마치 레코드처럼 사용할 수 있다고 생각하면 됩니다. 예를 들어, 사용자 정보를 저장할 때 User = namedtuple('User', ['id', 'name', 'email']) 이렇게 정의하면 user.name 으로 바로 이름에 접근할 수 있죠. collections.namedtuple 함수를 사용하면 쉽게 만들 수 있습니다. 단, 튜플이기 때문에 값을 변경할 수 없...

Python의 dataclass vs attrs 사용 비교 및 실전 예제

파이썬으로 개발하다 보면 데이터 객체를 정의해야 할 일이 정말 많잖아요? 저도 처음엔 뭘 써야 할지 엄청 고민했는데, dataclass 랑 attrs 라는 훌륭한 도구가 있다는 걸 알게 됐어요. 둘 다 코드를 깔끔하게 만들어주는 데 탁월하지만, 어떤 걸 선택해야 할지는 상황에 따라 다르더라고요. 제가 직접 써보면서 느낀 차이점들을 풀어서 설명해 드릴게요! 일단 dataclass 는 파이썬 3.7부터 기본으로 제공되는 기능이에요. @dataclass 라는 데코레이터만 붙이면 뚝딱! 데이터 클래스를 만들 수 있죠. 마치 마법처럼요! 설치할 게 없으니 얼마나 편한지 몰라요. 초보자도 금방 익숙해질 수 있을 만큼 사용법이 간단하다는 것도 큰 장점이죠. 저도 처음엔 이걸로 시작했어요. 정말 간단한 데이터 객체를 만들 때는 최고였거든요. 반면에 attrs 는 따로 설치해야 하는 라이브러리인데요 ( pip install attrs 치면 돼요!), dataclass 보다 훨씬 강력한 기능들을 제공해요. 데이터 유효성 검사라든가, 직렬화 같은 기능 말이죠. 처음엔 좀 어렵게 느껴졌지만, 복잡한 프로젝트를 진행하면서 attrs 의 진가를 제대로 알게 됐어요. 데이터 검증 로직을 직접 작성할 필요 없이 attrs 에서 제공하는 기능으로 간단하게 처리할 수 있었거든요. 시간도 많이 절약되었고요! 자, 이제 둘의 차이를 간단하게 정리해 볼까요? 표로 만들어 봤어요. 참고로, 저는 실제로 사용하면서 느낀 점들을 적어봤어요. 특징 dataclass attrs 의존성 없음! 파이썬 기본 기능이에요. attrs 라이브러리를 설치해야 해요. 기능 기본적인 기능만 제공해요. 간단하게 쓰기 좋아요. 훨씬 다양하고 강력한 기능들을 제공해요. 데이터 검증 기능이 특히 좋아요! 성능 attrs 보다는 조금 느려요. 체감은 크지 않아요. 좀 더...

Python에서 asyncio 완전 정복 (await, async, gather 등)

어휴, 요즘 파이썬으로 비동기 프로그래밍 하는 재미에 푹 빠졌어요! 특히 asyncio 는 정말 마법 같더라고요. 처음엔 좀 낯설었는데, 익숙해지니까 속도 향상이 눈에 띄게 느껴져서 완전 반해버렸습니다. 이 글에선 제가 asyncio 를 배우면서 깨달은 점들을 풀어놓을게요. 혹시 비동기 프로그래밍이 뭔지 잘 모르시겠다면, 간단히 말해 여러 작업을 동시에 처리해서 프로그램 속도를 엄청나게 높이는 기술이라고 생각하시면 돼요. 마치 여러 요리사가 동시에 음식을 만들어서 손님에게 빨리 제공하는 것과 비슷하죠! 일단 async 와 await 라는 녀석들이 핵심인데요, async 는 함수 앞에 붙여서 "얘는 비동기 함수야!"라고 선언하는 거예요. 그리고 await 는 다른 비동기 함수가 끝날 때까지 기다리라고 지시하는 역할을 하죠. 예를 들어, 네트워크에서 데이터를 가져오는 함수가 있다면, await 를 사용해서 데이터가 다 가져올 때까지 기다렸다가 다음 작업을 진행할 수 있어요. 그 동안 다른 작업을 처리할 수 있으니, 마치 멀티태스킹을 하는 것처럼 느껴져요. 신기하지 않나요? 그리고 asyncio.gather 는 여러 비동기 함수를 동시에 실행하고 결과를 모아주는 아주 유용한 친구입니다. 제가 웹사이트 여러 개에서 데이터를 동시에 가져와야 할 때 정말 요긴하게 썼어요. 하나씩 순서대로 가져오는 것보다 훨씬 빠르더라고요! 마치 여러 개의 탭을 동시에 열어놓고 작업하는 것과 같다고 생각하시면 될 것 같아요. 실제로 제가 썼던 코드를 보여드릴게요. 세 개의 웹사이트에서 데이터를 가져오는 예제인데요. (아래 코드 삽입) 이 코드를 보시면, fetch_data 함수가 각 웹사이트에서 데이터를 가져오는 역할을 하고, asyncio.gather 가 이 함수들을 동시에 실행하도록 도와주는 것을 볼 수 있을 거예요. asyncio.sleep(2) 는 네트워크 지연을 시뮬레이션하기 위해 넣...

Python 타입 힌팅과 mypy로 안전한 코드 작성하기

파이썬으로 꽤 큰 프로젝트를 진행하다 보니, 코드가 산으로 가는 경험을 여러 번 했어요. 특히 팀으로 작업할 때는요. 변수 타입을 일일이 확인하지 않아도 되는 파이썬의 동적 타이핑이 오히려 독이 되는 순간이었죠. 그래서 제가 찾은 해결책이 바로 '타입 힌팅'과 'mypy'입니다. 이 둘을 활용하면 훨씬 안전하고 효율적인 파이썬 코딩이 가능해져요! 한 번 같이 살펴볼까요? 타입 힌팅? mypy? 뭐가 뭔가요? 쉽게 말해 타입 힌팅은 파이썬 코드에 변수나 함수의 타입을 명시적으로 적어주는 거예요. 예를 들어 name: str = "철수" 라고 하면 name 변수는 문자열 타입이라는 걸 미리 알려주는 거죠. : 기호 뒤에 타입을 적어주면 됩니다. int, float, str, bool 같은 기본 타입은 물론이고, list, dict, tuple도 당연히 가능해요. 함수의 매개변수와 반환값에도 타입을 지정할 수 있는데, 이걸 타입 어노테이션이라고 합니다. def greet(name: str) -> str: 이렇게요. 함수 greet 는 문자열을 입력받아 문자열을 반환한다는 뜻이죠. 그럼 mypy는 뭘까요? mypy는 이렇게 타입 힌팅을 해놓은 코드를 검사하는 도구입니다. 코드를 실행하기 전에 미리 타입 오류를 찾아주는 거죠. "어? 여기서 int 타입을 기대했는데 str 타입이 들어왔네?" 이런 식으로요. 마치 코드의 문법 검사기 같은 역할이라고 생각하면 돼요. mypy your_script.py 명령어로 간단하게 실행할 수 있습니다. 저는 처음에 이걸 몰라서 엄청 헤맸는데, 알고 나니 정말 신세계였어요. 실제로 어떻게 쓰는 거예요? 제가 예전에 만들었던 코드를 조금 수정해서 보여드릴게요. 두 점 사이의 거리를 계산하는 함수와, 유저 정보를 가져오는 함수, 그리고 데이터 리스트의 합을 계산하는 함수예요. fro...

Python에서 데코레이터의 원리와 실전 활용 패턴

파이썬 데코레이터? 처음엔 좀 막막했는데, 쓰다 보니 정말 매력적인 기능이더라고요. 이 글에선 제가 데코레이터를 이해하고 활용하게 된 과정을, 마치 옆에서 이야기하듯 풀어볼게요. 어려운 용어는 최대한 쉽게 설명해 드릴 테니, 걱정 마세요! 처음 데코레이터를 만났을 때 솔직히 말씀드리면, 처음 파이썬 데코레이터를 접했을 땐 좀 겁먹었어요. @ 기호는 뭐고, 고차 함수는 또 뭔가 싶었죠. 마치 암호 같은 코드에 압도되는 느낌이랄까요? 그런데 막상 써보니, 코드를 깔끔하게 정리하고 재활용성을 높이는 데 정말 유용하다는 걸 깨달았습니다. 말하자면, 함수에 기능을 추가하는 마법 같은 장치라고나 할까요? 복잡한 코드를 훨씬 간결하게 만들어 주거든요. 예를 들어, 로그를 남기는 기능이나, 인증을 처리하는 기능 같은 걸 함수마다 일일이 작성할 필요 없이, 데코레이터 하나로 간단하게 추가할 수 있답니다. 핵심 개념: 함수를 감싸는 함수 데코레이터의 핵심은 '함수를 인자로 받아서, 기능을 추가한 새로운 함수를 반환하는 고차 함수'라는 거예요. 어렵게 들리지만, 쉽게 생각하면 함수를 래핑(wrapping)하는 거라고 보시면 됩니다. 붕어빵 틀에 붕어빵 반죽을 넣어 굽는 것처럼, 기존 함수를 데코레이터라는 틀에 넣어서 새로운 기능을 추가하는 거죠. 실제 코드를 보면 이해가 훨씬 쉬울 거예요. 아래 코드는 간단한 데코레이터 예시입니다. def my_decorator(func): def wrapper(): print("함수 실행 전!") func() print("함수 실행 후!") return wrapper @my_decorator def say_hello(): print("안녕하세요!") say_hello() @my_decorator 부분이 바로 데코레이터를 적용...

Python에서 멀티프로세싱을 사용하는 실전 예제

개요 Python에서 멀티프로세싱을 활용하면 CPU 바운드 작업의 처리 속도를 획기적으로 향상시킬 수 있습니다. 단일 코어만 사용하는 싱글 스레드 방식과 달리, 멀티프로세싱은 여러 코어를 활용하여 병렬 처리를 가능하게 하므로, 특히 CPU 사용률이 높은 작업에 효과적입니다. 이 포스트에서는 실제 코드 예제를 통해 Python의 multiprocessing 모듈을 사용하는 방법과 주의사항을 알아보겠습니다. 핵심 개념 정리 Python의 multiprocessing 모듈은 프로세스 생성 및 관리를 위한 다양한 기능을 제공합니다. 핵심 클래스는 Process 이며, 이를 이용해 새로운 프로세스를 생성하고, target 인자로 실행할 함수를 지정합니다. args 와 kwargs 인자를 통해 함수에 인자를 전달할 수 있습니다. Pool 클래스는 여러 프로세스를 효율적으로 관리하는 데 유용하며, map , apply_async 등의 메서드를 통해 병렬 처리 작업을 수행할 수 있습니다. 실전 코드 예제 다음은 CPU 바운드 작업인 소수 판별을 멀티프로세싱으로 구현한 예제입니다. is_prime 함수가 소수 판별 로직을 담고 있으며, multiprocessing.Pool 을 사용하여 여러 프로세스에서 병렬적으로 실행합니다. import multiprocessing import time def is_prime(n): if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True if __name__ == '__main__': numbers = list(range(100000)) # 판별할 숫자 리스트 start_time = time.time() # 싱글 스레드 방식 si...

AWS EC2에 Django 앱 배포하는 가장 실용적인 방법 (초보부터 실무까지)

AWS EC2에 Django 앱 배포하는 가장 실용적인 방법 (초보부터 실무까지) 안녕하세요! 오늘은 AWS EC2에 Django 애플리케이션을 배포하는 실용적인 방법에 대해 알아보겠습니다. 초보자부터 실무 개발자까지 따라할 수 있는 단계별 가이드를 제공합니다. 배포 전 준비사항 AWS 계정 생성 EC2 인스턴스 생성 도메인 구매 및 설정 (선택사항) SSL 인증서 준비 (선택사항) 1. EC2 인스턴스 설정 1.1 인스턴스 생성 AWS 콘솔에서 EC2 서비스 선택 "인스턴스 시작" 클릭 Amazon Linux 2 AMI 선택 인스턴스 유형 선택 (t2.micro로 시작 추천) 보안 그룹 설정: SSH (22) HTTP (80) HTTPS (443) 1.2 SSH 접속 # 키 파일 권한 설정 chmod 400 your-key.pem # SSH 접속 ssh -i your-key.pem ec2-user@your-ec2-public-ip 2. 서버 환경 설정 2.1 시스템 업데이트 sudo yum update -y 2.2 필요한 패키지 설치 # 개발 도구 설치 sudo yum groupinstall -y "Development Tools" # Python 3.9 설치 sudo yum install -y python39 python39-devel # 기타 필요한 패키지 sudo yum install -y nginx git postgresql-devel 2.3 Python 가상환경 설정 # pip 업그레이드 python3.9 -m pip install --upgrade pip # virtualenv 설치 python3.9 -m pip install virtualenv # 프로젝트 디렉토리 생성 mkdir /var/www/myproject cd /var/www/myproject # 가상환경 생성 및 활성화 python3...

GitHub Actions로 Django + Docker 배포 자동화하기

GitHub Actions로 Django + Docker 배포 자동화하기 안녕하세요! 오늘은 GitHub Actions를 사용하여 Django 애플리케이션을 Docker 컨테이너로 자동 배포하는 방법에 대해 알아보겠습니다. 1. 프로젝트 구조 project/ ├── .github/ │ └── workflows/ │ └── deploy.yml ├── app/ │ ├── Dockerfile │ ├── requirements.txt │ └── manage.py ├── docker-compose.yml └── .env.example 2. Docker 설정 2.1 Dockerfile # Python 3.9 기반 이미지 사용 FROM python:3.9-slim # 작업 디렉토리 설정 WORKDIR /app # 시스템 패키지 설치 RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ && rm -rf /var/lib/apt/lists/* # Python 의존성 설치 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 애플리케이션 코드 복사 COPY . . # 환경 변수 설정 ENV PYTHONUNBUFFERED=1 ENV DJANGO_SETTINGS_MODULE=project.settings.production # Gunicorn 실행 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "project.wsgi:application"] 2.2 docker-compose.yml version: '3.8' services: web: build: . ...

Django에서 Redis 캐싱 전략 구현하기

Django에서 Redis 캐싱 전략 구현하기 안녕하세요! 오늘은 Django 프로젝트에서 Redis를 활용한 효율적인 캐싱 전략을 구현하는 방법에 대해 알아보겠습니다. 왜 Redis를 사용할까요? Redis를 캐싱 솔루션으로 선택하는 이유는 다음과 같습니다: 빠른 성능 : 인메모리 데이터베이스로 초고속 데이터 접근 데이터 구조 다양성 : 문자열, 해시, 리스트, 세트 등 다양한 데이터 구조 지원 영구성 : 데이터를 디스크에 저장하여 서버 재시작 시에도 데이터 유지 분산 시스템 지원 : 클러스터링을 통한 확장성 풍부한 기능 : TTL, Pub/Sub, 트랜잭션 등 다양한 기능 제공 1. 기본 설정 1.1 Redis 설치 # Ubuntu/Debian sudo apt-get install redis-server # macOS brew install redis 1.2 Django Redis 설정 # settings.py CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PARSER_CLASS": "redis.connection.HiredisParser", "CONNECTION_POOL_CLASS": "redis.BlockingConnectionPool", "CONNECTION_POOL...

Django Rest Framework로 JWT 로그인 API 완벽 구현 가이드

Django Rest Framework로 JWT 로그인 API 완벽 구현 가이드 안녕하세요! 오늘은 Django Rest Framework(DRF)를 사용하여 JWT(JSON Web Token) 기반의 로그인 API를 구현하는 방법에 대해 자세히 알아보겠습니다. 왜 JWT를 사용할까요? JWT는 최근 가장 인기있는 인증 방식 중 하나입니다. 그 이유는 다음과 같습니다: Stateless : 서버에 세션을 저장할 필요가 없어 서버 부하가 줄어듭니다. 확장성 : 마이크로서비스 아키텍처에 적합합니다. 보안 : 토큰이 서명되어 있어 위조가 어렵습니다. 크로스 도메인 : CORS 정책에 더 유연하게 대응할 수 있습니다. 프로젝트 설정 먼저 필요한 패키지들을 설치하겠습니다: pip install djangorestframework djangorestframework-simplejwt settings.py 에 다음과 같이 설정을 추가합니다: INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework_simplejwt', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), } # JWT 설정 from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': False, 'BLACKLIST_AF...

AWS EC2에 Django 앱 배포하는 가장 실용적인 방법 (초보부터 실무까지)

AWS EC2에 Django 앱 배포하는 가장 실용적인 방법 (초보부터 실무까지) 안녕하세요! 오늘은 AWS EC2에 Django 애플리케이션을 배포하는 실용적인 방법에 대해 알아보겠습니다. 초보자부터 실무 개발자까지 따라할 수 있는 단계별 가이드를 제공합니다. 배포 전 준비사항 AWS 계정 생성 EC2 인스턴스 생성 도메인 구매 및 설정 (선택사항) SSL 인증서 준비 (선택사항) 1. EC2 인스턴스 설정 1.1 인스턴스 생성 AWS 콘솔에서 EC2 서비스 선택 "인스턴스 시작" 클릭 Amazon Linux 2 AMI 선택 인스턴스 유형 선택 (t2.micro로 시작 추천) 보안 그룹 설정: SSH (22) HTTP (80) HTTPS (443) 1.2 SSH 접속 # 키 파일 권한 설정 chmod 400 your-key.pem # SSH 접속 ssh -i your-key.pem ec2-user@your-ec2-public-ip 2. 서버 환경 설정 2.1 시스템 업데이트 sudo yum update -y 2.2 필요한 패키지 설치 # 개발 도구 설치 sudo yum groupinstall -y "Development Tools" # Python 3.9 설치 sudo yum install -y python39 python39-devel # 기타 필요한 패키지 sudo yum install -y nginx git postgresql-devel 2.3 Python 가상환경 설정 # pip 업그레이드 python3.9 -m pip install --upgrade pip # virtualenv 설치 python3.9 -m pip install virtualenv # 프로젝트 디렉토리 생성 mkdir /var/www/myproject cd /var/www/myproject # 가상환경 생성 및 활성화 python3...