전체 글
-
프로덕션의 마이그레이션은 검토가 필요합니다기술/Django 2024. 1. 18. 23:37
Django 를 쓰게되면 내부적으로 마이그레이션 도구를 사용하게 되는데 이걸 프로덕션까지 사용하여 반영하는 경우가 많은 것 같습니다. Django 의 마이그레이션은 상황에 따라 Down Time 이 발생할 수 있기 때문에 발생한 ORM 에 대해 검토가 반드시 필요합니다. 더 좋은 방법으로는 SQL 문을 한 줄씩 실행하는 것입니다. 개발자는 특정 쿼리에 대한 문제를 분리하여 문제를 정확하게 식별하고 해결할 수 있습니다. 이렇게 세분화된 문제 해결은 연쇄적인 장애를 방지하고 예기치 않은 동작의 근본 원인을 정확히 파악하는 데 큰 도움이 됩니다. 이 때 도움이 될만한 좋은 프로젝트가 있습니다. https://github.com/tbicr/django-pg-zero-downtime-migrations GitHu..
-
Docker Build Time 개선기기술/Infra 2024. 1. 18. 23:07
문제점 같은 코드베이스에서 네 개의 거의 비슷한 도커파일을 통해 빌드하는데 일부 ( API, Admin ) 의 빌드 타임이 굉장히 늦어지는 문제를 발견 했습니다. 분석 너무나 당연하지만 문제는 이미지의 일부 코드가 달랐습니다. 왜 Worker 만 캐시되었을까? actions@cache 를 사용해 캐시하고 있었는데 이 방식은 같은 이름의 가장 처음 생성한 캐시를 덮어쓰지 않습니다. 즉, 우리 build cache 가 4 번 실행되는 데 그 중 가장 빠르게 실행된 것이 캐시되었던 것이였습니다. 결론적으로 옛날에 Worker 와 API 의 Dockerfile 코드가 달라질 때 Worker 가 먼저 캐시를 선점했고 이후에도 캐시 된 애가 더 빠르니 Worker 가 계속 캐시를 선점한 것이였습니다. 해결 당연히 ..
-
Java 의 생성자 동작 ( GSON 을 통해 Class 를 만들었을 때 기본 값이 설정되지 않는 문제 )기술 2023. 8. 31. 20:44
Java 에서 GSON 라이브러리를 사용해 JSON 데이터를 클래스 객체로 변환할 때 초기값이 설정이 예상대로 동작하지 않은 경우가 있었습니다. 이 문제를 파악한 내용을 공유하려 합니다. 문제 상황 다음과 같은 SomeClass 가 있다고 가정합니다. public class SomeClass { private Boolean isInvalid = false; } GSON.fromJson(json, SomeClass); GOSN 을 사용해 json 데이터를 SomeClass 로 바꿨을 때 isInvalid 가 false 일 것 같지만 실제로는 Null 로 되어 있었습니다. 원인 이 문제의 원인은 GSON 이 Unsafe 모듈의 allocateInstance 메서드를 사용해 객체를 생성하기 때문입니다. 이 메..
-
유지보수를 위해 타입은 선택이 아니라 필수가 되어야합니다.기술/Python 2023. 1. 14. 18:35
개발하면서 항상 마주치는 상황이 있습니다. 내가 만들지 않았거나 너무 오래되서 기억이 잘 나지 않은 메서드나 변수를 가진 코드를 유지보수하는 문제입니다. 우리는 항상 유지보수의 문제와 맞닿아있기 때문에 유지보수하기 쉬운 코드를 목표하기도 해야합니다. 이 때 타입은 유지보수를 위한 최소 조건이라고 생각합니다. 타입을 적용하면 변수는 올바른 유형의 값만 할당할 수 있습니다. 이렇게 하면 오류를 방지하고 코드를 더욱 유지 관리할 수 있습니다. 예를 들어, "int"(정수) 유형의 변수가 있고 "string"(텍스트) 유형의 값을 할당하려고 하면 오류를 발생시킬 수 있습니다. 이것은 큰 문제가 되기 전에 실수를 일찍 발견하는 데 도움이 됩니다. 타입이 없을 때 발생할 수 있는 가장 큰 문제는 사람의 실수로 발생..
-
일반적인 Django 서비스는 단일 앱을 통해 개발해야합니다.기술/Django 2022. 12. 11. 20:22
Django의 프로젝트 구조 Django를 시작하면 아래와 같은 구조로 사용하게 됩니다. - project - namespace1 - models.py - migrations - urls.py - namespace2 - ... 네임스페이스를 하나 정의하고 해당 네임스페이스에서 사용되는 스키마, 뷰, URL를 정의하고 노출합니다. 이를 Django에서는 앱이라고 부르고 있습니다. 문제점 저는 앱을 보통 도메인을 나눠서 관리하면 좋을 것 같다고 생각하게 되면 나눕니다. 유저를 다루는 앱이 있고, 새로 물류와 관련된 기능을 작성해야 한다면 물류라는 앱을 만들고, 계약과 관련한 기능을 나누어 앱을 만드는 것과 같이 어느 정도 큰 단위의 도메인을 다루게 된다면 나누게 되었던 것 같습니다. 하지만 이렇게 앱을 나누..
-
Django 에서 N+1 쿼리 문제 예방, 발견하기기술/Django 2022. 1. 25. 22:18
N+1 이란? 쿼리를 한번으로 N건 가져왔는데, 관련 컬럼을 얻기 위해 N번의 쿼리를 추가수행하는 문제는 N+1 문제라고 합니다. 간단한 예시를 통해 N+1 이 발생하는 원리를 알아봅시다. class PressGroup(models.Model): name = models.CharField(max_length=64) class Reporter(models.Model): full_name = models.CharField(max_length=64) press_group = models.ForeignKey(PressGroup, on_delete=models.CASCADE) class Article(models.Model): headline = models.CharField(max_length=64) conte..
-
Django Application 의 메모리 누수 해결하기기술/Django 2022. 1. 25. 20:00
원본: https://adamj.eu/tech/2019/09/19/working-around-memory-leaks-in-your-django-app/ Working Around Memory Leaks in Your Django Application - Adam Johnson Working Around Memory Leaks in Your Django Application 2019-09-19 Several large Django applications that I’ve worked on ended up with memory leaks at some point. The Python processes slowly increased their memory consumption until crashing. No..