반응형

전체 글 138

AWS RDS MySQL Dbeaver로 로컬에서 연결(퍼블릭엑세스 사용 없이) - ec2 ssh 터널링 이용

1. 퍼블릭엑세스(Public Access)를 허용하지 않는 이유*과금, 비용, 돈AWS 프리티어를 이용해서 몇가지 테스트를 해보고 있었는데, RDS에 퍼블릭 엑세스를 허용하였더니조금이지만 과금이 된 것을 확인했다. 과금이 된 이유는 VPC때문이다.VPC는 AWS에서 서비스, 솔루션을 제공할 때 필요한 네트워크 환경인데퍼블릭엑세스를 허용하게 되면 이 네트워크를 공개적으로 사용할 수 있도록 열어놓는 것이기에 과금이 된다고 한다원래는 과금이 안됬었는데 2024년부터 바뀌었다고 한다. * 보안적 위험성퍼블릭엑세스 허용 시 RDS가 퍼블릭 IP를 가지게 되어 전세계의 누구라도 접속을 시도할 수 있게 된다.물론 데이터베이스의 id, password도 있고, 보안그룹을 설정할 수 있어서 DB접속을 막을 순 있지만"..

DATABASE 2025.06.20

[flutter 개발환경 세팅] 코드 리펙토링 | Code Action | ctrl + .

flutter 개발하다보면 이미 만든 widget을 Center로 감싸거나 Container로 감싸야 하는 등 수정할 상황이 생긴다이때마다 들여쓰기 하나하나 확인해가면서 부모 레벨에서 Container를 추가하는건 굉장히 힘들고 에너지가 많이 든다. Code Action를 이용하면 위의 작업을 손쉽게 끝낼 수 있다. 수정하고 싶은 부분에 커서를 이동시키고 ctrl + . 을 입력하면 아래와 같이 뜬다. Wrap with Column, Wrap with Container 등등 감싸고 싶은 위젯을 선택해서 감싸주면 끝심지어 Wrap with widget은 커스텀 위젯을 내가 사용할 수 있도록 틀을 만들어준다. 아주 유용한 기능이 될것 같다. 플러터 개발자 경험(flutter Developer Experien..

플러터 Flutter 2025.05.28

[django] Django Admin 메뉴 순서 커스터마이징 – 공백 기반 정렬 방식

Django 프로젝트가 커지면 Admin 페이지에 등록된 모델 수가 많아지고, 이를 보기 좋게 정렬하고 싶은 상황이 생깁니다. 기본적으로 Django Admin은 모델 이름을 알파벳순으로 정렬하지만, 실제 사용 시에는 업무 플로우나 중요도에 따라 직접 메뉴 순서를 조정하고 싶은 경우가 많습니다. 이번 포스트에서는 verbose_name_plural의 앞쪽 공백 수를 활용해 원하는 정렬 순서를 만드는 방법과 함께, 이를 상수로 정리해서 관리하는 패턴을 소개합니다.🧩 문제 상황Django Admin은 모델 이름의 알파벳 순서로 메뉴를 정렬합니다.그런데 아래와 같은 모델들을 관리할 때는 업무에 따라 특정 모델을 위쪽에 배치하고 싶은 경우가 있습니다.🛠️ 해결 방법: 공백 수를 활용한 정렬 순서 제어모델 메..

[django] Django Admin Inline템플릿에 Custom Context 안전하게 전달하는 방법

— get_inline_instances()로 커스텀 컨텍스트(custom context) 주입하기Django Admin은 뛰어난 기능을 제공하지만, 종종 커스터마이징에는 제한이 따릅니다. 특히, Inline에 custom template을 적용하고, 여기에 개별 객체 정보를 포함한 동적 context를 전달하고 싶을 때 어려움이 있습니다. 이 글에서는 get_inline_instances()를 활용해 Django Admin Inline에 안전하게 custom context를 전달하는 가장 실용적인 방법을 소개합니다.🎯 목표Django Admin의 Inline에 custom template을 사용Inline 템플릿 내에서 동적 정보를 안전하게 활용🔥 핵심 전략Django는 Inline을 렌더링할 때 ..

[django] database is locked - 원인파악 | 해결방안

1. 원인 파악Django에서 "database is locked" 오류는 SQLite3 데이터베이스에 현재 다른 프로세스가 잠금을 걸고 있는 상태에서 데이터베이스 작업을 시도할 때 발생합니다. 이 문제는 여러 가지 이유로 발생할 수 있습니다:동시 접근: SQLite3 데이터베이스는 낮은 트래픽에서 중간 트래픽까지를 처리하도록 설계되었습니다. 높은 수준의 동시 쓰기는 데이터베이스가 잠기는 결과를 초래할 수 있습니다.장시간 실행되는 트랜잭션: 트랜잭션이 완료되는 데 오랜 시간이 걸리면, 데이터베이스에 잠금을 걸어 다른 트랜잭션이 진행되지 않게 할 수 있습니다.파일 잠금 문제: SQLite는 동시성을 관리하기 위해 파일 잠금을 사용합니다. 파일 시스템 잠금 메커니즘에 문제가 있으면 데이터베이스가 잠길 수 있..

[파이썬] 천 단위로 쉼표 표기하는 초간단 방법 : format, f-string 이용

파이썬으로 금액 데이터를 사용하다 보면 천 단위로 구분하기 위해 쉼표를 찍어야 할 때가 있다. 예를 들어 770000원 보다 770,000원 이 더 보기 편하고 사용자 편의성이 좋다. 이번 글에서는 이렇게 천 단위로 쉼표를 표시해주는 간단한 파이썬 코드를 공유한다. 1. format 이용# 금액을 천 단위로 쉼표를 찍어서 표시하는 함수def format_amount(amount): return "{:,}".format(amount)# 예시 금액amount = 770000formatted_amount = format_amount(amount)print(formatted_amount) # 출력: 770,000 2. f-string이용# 금액을 천 단위로 쉼표를 찍어서 표시하는 함수def format_..

파이썬 python 2024.10.08

[django] model object update 방법 정리

django에서는 모델 객체를 업데이트 하는 방법이 여러가지가 있다.쓸때마다 이거였지 생각은 나는데 정확하지 않아 계속 찾아보고 하는 과정이 반복되어이번 기회에 정리하고자 한다.django developer들에게 조금이나마 도움이 되길 바란다.  목차  Queryset.update()"django model update"를 검색했을 때 가장 많이 나오는 방법이다. 즉시 적용(applied instantly)obj.save() 필요 없음update()매서드를 호출하는 순간 데이터가 변경된다.save()보다 더 빠르다(Queryset의 특징인 laziness가 적용되지 않는다.) 외부 테이블의 필드는 수정 불가해당 테이블의 데이터필드만 수정 가능하고 외래키로 수정은 불가하다.>>> Entry.objects...

[django] django로 포트포워딩(port forwarding)하는 방법 (w. middleware)

django로 포트포워딩(port forwarding)하는 방법- Django 애플리케이션에서 클라이언트가 어떤 도메인을 통해 접근했는지를 확인하고, 해당 도메인에 따라 다른 페이지로 리다이렉션하는 방법  배포 관점에서 그려본 프로젝트의 전체적인 흐름이다. 처음에는 django admin페이지를 이용한 서비스를 구현했다.따라서 back과 front모두 django안에서 해결 할 수 있었다. 도메인을 하나 구입해서 Route53을 이용해서 호스팅을 했고,subdomain으로 first를 붙여 (예) first.webname.net으로 배포했었다. 탄력적 IP를 이용해서 내가 배포한 EC2에 고정적으로 접근할 수 있도록 설정해두었고,django 웹앱을 포트번호 8000번을 이용했다. 여기까지는 문제 없다. ..

[django] annotate에 관하여...

django annotate 매서드는 queryset에 내가 원하는 값으로 계산해서 기존 queryset에 추가해줄 수 있다. 그럼 원하는 값으로 계산한다는 건 어떤 말이냐?공식문서에서는 query expression이라고 표현하는데F매서드를 사용해도 되고, Aggregate Func을 사용해서 값을 나타내도 된다. annotate가 "주석을 단다"라는 뜻인데 django annotate는 "queryset에 주석을 달아주는데 주석의 값도 사용 가능"이라고 이해하면 될 듯 하다. (적어도 나에겐...) 아래는 공식문서에 나온 예시이다.from django.db.models import Countq = Blog.objects.annotate(Count("entry"))# The name of the fir..