분류 전체보기
대용량 파일 업로드 처리 (30GB)
대용량 파일 업로드 처리 (30GB)
2023.12.03FastAPI에서 대용량 파일 업로드 기능을 구현해보자. 프론트엔드에서 백엔드로 요청을 보낼 때는 axios를 사용하고, FastAPI의 웹서버 구현체로는 uvicorn을 사용한다. 1. 타임아웃 설정 용량이 크다 보니 데이터를 주고받는데 시간이 많이 소요될 수 있다.uvicorn과 axios 부분을 조작해 타임아웃 기간을 늘리자. uvicorn app:app --timeout-keep-alive 1200 우선 uvicorn에서는 --timeout-keep-alive 속성값으로 uvicorn 서버가 클라이언트와의 비활성 HTTP 연결을 얼마나 오래 유지할 지 설정할 수 있다. 예시는 1200초동안 연결이 비활성화 상태로 유지되면 자동으로 닫히도록 설정한다. upload_axios_timeout: ..
FastAPI에서의 동시성 처리
FastAPI에서의 동시성 처리
2023.11.29스프링 같은 경우는 Tomcat (서블릿 컨테이너) 을 웹 서버로 사용해 동시성을 처리한다. 서버 컴퓨터에다가 자바 기반으로 작성된 Tomcat을 프로세스로 실행시키고 Tomcat 프로세스의 쓰레드로 스프링 애플리케이션을 실행시킨다. Tomcat에 동시에 100명의 사용자가 접속하는 경우 Tomcat은 100개의 쓰레드를 생성하고 (쓰레드 풀의 개수에 따라 달라질 수 있다) 각 쓰레드들은 디스패처 서블릿으로 접근하고 디스패처 서블릿은 요청을 처리하는 메서드로 쓰레드들을 안내해준다. 이런 방식으로 멀티쓰레딩 방식으로 동시성을 처리하고, 각 쓰레드들은 스프링 컨테이너의 빈을 공유하며 메모리를 효과적으로 사용한다. 파이썬은 자바와는 다르게 인터프리터 언어이고, Global Interpreter Lock 이라는..
[JavaScript] Shadow DOM 다루기
[JavaScript] Shadow DOM 다루기
2023.11.22다른 사람이 만든 자바스크립트 라이브러리를 사용해 원하는 기능을 구현하고, CSS를 적용할 때 렌더링된 결과를 개발자 도구를 통해 살펴보면 #shadow-root 라는 부분이 나타날 때가 있다. #shadow-root는 웹 컴포넌트의 Shadow DOM을 나타내는 용어로, 스타일과 마크업을 실제 DOM에서 격리시켜 컴포넌트의 내부 구현을 캡슐화하는 도구로 사용된다. Shadow DOM 내부의 스타일은 해당 DOM에만 적용돼 격리된 UI 컴포넌트를 만들 때 사용할 때 사용된다. Vue에서는 DOM을 추상화한 Virtual DOM을 사용해 실제 DOM에 접근하고 조작하는 비용을 최소화하고, Shadow DOM은 웹 컴포넌트의 캡슐화와 스타일 격리를 위해 사용된다. 이전에 wav파일을 시각화하는 자바스크립..
[Vue] map 함수와 Vue3의 반응형 시스템
[Vue] map 함수와 Vue3의 반응형 시스템
2023.11.16서버에서 데이터를 받아오고, 받아온 데이터를 v-for 반복문을 사용해서 렌더링한다고 생각해보자. {{ subject.subject_no }} 성별 여성 남성 연령(개월) {{ subject.age_month }} --> ..
[Git] Git 협업 시 충돌 해결
[Git] Git 협업 시 충돌 해결
2023.11.14A와 B 두 명이서 협업을 하고 있다고 하자. A는 101까지 작업을 진행하고 커밋 및 원격 저장소에 push 했고, B는 101까지 진행된 작업을 pull 받아서 이어서 작업을 진행했다.이후 A와 B는 각각 이어서 작업을 진행해 102A - 103A / 102B - 103B 까지 작업했고, B는 103B 까지 작업한 내용을 커밋 후 원격 저장소에 push 했다. 이후 A가 103A까지 작업한 내용을 커밋 후 원격 저장소에 반영하려면 원격 저장소의 최신 변경사항 (103B) 을 로컬 저장소로 가져온 후 103A 관련 작업을 커밋해야 한다. git pull origin master 명령어를 통해 원격 저장소의 변경 사항을 가져올 수 있는데...A와 B가 동일한 파일의 같은 부분을 수정하고 각각 커밋했다면 ..
[FastAPI] SQLAlchemy
[FastAPI] SQLAlchemy
2023.11.06SQLAlchemy는 파이썬의 ORM 기술으로 자바 진영의 JPA와 유사한 부분이 많다. JPA의 영속성 컨텍스트와 1차 캐시 : SQLAlchemy의 Session객체 N+1 문제를 해결하기 위한 JPA의 fetch 속성 : SQLAlchemy의 joinedload(), subqueryload() JPA의 @Entity : SQLAlchemy의 declarative_base() @ManyToOne, @OneToMany : relationship() 이렇듯 같은 ORM 기술이다 보니 비슷한 개념을 공유하고 있어 JPA에 익숙하다면 SQLAlchemy도 어렵지 않게 적응할 수 있다. Core SQLAlchemy의 Core는 데이터베이스별 SQL과 스키마 정의를 위한 시스템으로, SQL 대신 Python코드..
[FastAPI] 요청과 응답
[FastAPI] 요청과 응답
2023.11.02FastAPI는 내부적으로 Pydantic 모델을 사용해 데이터의 유형을 선언하고 데이터를 검증하며 데이터를 전달한다. Pydantic은 Python의 데이터 파싱 라이브러리로, FastAPI에서는 JSON과 Python 객체간 데이터 변환, 데이터 전송 형식 검증에 사용된다. 스프링에서는 @Valid 애너테이션을 사용해서 객체를 검증했는데 FastAPI에서는 Pydantic이 비슷한 역할을 수행한다. class SubjectListResponse(BaseModel): selected_subject: str subjects: list @subject_router.get("/get-list", response_model=schemas.SubjectListResponse) def fetch_subject_l..
디렉토리 구조 탐색과 이미지 메타데이터 저장
디렉토리 구조 탐색과 이미지 메타데이터 저장
2023.09.17서버에 위와 같은 구조로 파일과 디렉토리가 구성되어 있을 때, 이 구조를 데이터베이스에 적합한 형식으로 저장하고 화면에 위와 같은 구조로 출력하는 기능을 작성해보자. 서버에 저장되는 디렉토리와 파일 구조는 고정되지 않고, 이미지만을 저장한다고 가정한다. (디렉토리를 몇 번 거친 후에 이미지 파일이 등장하는지는 정해지지 않았다) 1. 서버에 저장되는 이미지의 수는 적어도 10만장을 넘어간다. -> 저장하는 로직은 스케쥴러를 통해 특정 시간마다 수행될 수 있도록 설정할 수 있어야 한다. 2. 새로 추가된 디렉토리 및 이미지를 감지할 수 있어야 하고, 디렉토리와 이미지가 수정된 경우도 감지할 수 있어야 한다. -> 마지막으로 수정된 날짜, 저장된 이미지 수를 사용한다. 3. 특정 디렉토리를 선택하고 하위 이미..
[Ubuntu] 셸 스크립트 프로그래밍
[Ubuntu] 셸 스크립트 프로그래밍
2023.09.11리눅스에서 Shell은 사용자와 운영체제간의 상호작용을 중개하는 인터페이스로 사용자의 명령을 해석하고 명령에 따라 시스템을 제어한다. 우분투에서는 bash 라는 셸을 사용한다. 셸 스크립트 프로그래밍은 C언어와 유사한 점이 많다. 변수 / 반복문 / 제어문 등을 사용할 수 있고, 컴파일 하지 않고 바로 텍스트 파일 형태로 실행할 수 있다. 셸 스크립트에서 변수는 사용 전 미리 선언할 필요가 없고, 값을 할당함과 동시에 변수가 생성된다. 모든 변수는 문자열로 취급되며 대입 시 좌우 공백이 없어야 한다. 셸은 여러 환경 변수 값을 가지는데, echo $환경변수명 명령어로 특정 환경변수에 접근할 수 있다. 나머지 반복문, 변수 사용, 제어문 등은 일반 프로그래밍 언어와 비슷하니 필요할 때 찾아서 사용하자. 셸..
[MySQL] 인덱스
[MySQL] 인덱스
2023.08.30컴퓨터에서 CPU나 메모리같은 주요 장치는 전자식이지만, 데이터를 저장하는 HDD는 기계식이다. 이런 HDD를 대체하기 위해 전자식 저장 도구인 SSD가 등장했다. SSD는 전자식으로 데이터에 접근해 훨신 빠르고, 플래시 메모리를 장착하고 있어 전원이 공급되지 않아도 데이터가 삭제되지 않는다. MySQL에서 인덱스는 테이블에서 칼럼의 값과 해당 레코드가 저장된 주소를 키 - 값으로 저장하는 자료구조이다. 인덱스는 정렬된 상태로 보관되기에 특정 레코드에 접근할 때 인덱스를 사용하면 빠르게 접근할 수 있다. 데이터베이스 테이블에 대한 참조로 생각하면 된다. B-Tree 인덱스 B-Tree는 데이터베이스의 인덱싱 알고리즘 중 가장 일반적으로 사용되고 가장 먼저 도입된 알고리즘이다. (Balanced Tree)..
[MySQL] 트랜잭션과 락
[MySQL] 트랜잭션과 락
2023.08.28데이터베이스에서 트랜잭션은 하나 이상의 SQL 그룹으로, 그룹 단위로 실행이 성공하거나 실패함을 보장한다. 트랜잭션의 주요 속성으로는 ACID가 있다. Atomicity : 트랜잭션 단위 작업은 모두 완료되거나 모두 실패한다. Consistency : 데이터베이스를 일관성 있는 상태로만 다뤄야 한다. (계좌이체에서 인출됐지만 입금되지 않은 상태가 없어야 함) Isolation : 동시에 실행되는 트랜잭션들끼리는 서로 영향을 주지 않는다 Durability : 트랜잭션이 커밋된 후 해당 내용은 영구적으로 보존되어야 한다. 트랜잭션이 길어질수록 리소스를 많이 사용하게 되니 최소한의 코드에 트랜잭션을 적용하자. 특히 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제하자. 락 (Lock) 은 데이터베이스에서 ..
[MySQL] 아키텍처
[MySQL] 아키텍처
2023.08.25MySQL 서버는 MySQL 엔진과 스토리지 엔진으로 구분된다. MySQL 엔진 : 클라이언트와의 연결을 관리하는 커넥션 핸들러와 쿼리 최적화를 수행하는 옵티마이저가 중심을 이룬다. 스토리지 엔진 : 실제 데이터를 저장하고 관리한다. MySQL 엔진에서 데이터를 쓰거나 읽어야 할 경우 스토리지 엔진에 핸들러 요청을 보낸다.(InnoDB, MyISAM...) 스토리지 엔진은 MySQL 서버에 플러그인 형태로 추가돼 각 테이블마다 가장 적합한 스토리지 엔진을 선택해서 사용할 수 있다. InnoDB는 트랜잭션 처리에 강하고, MyISAM은 빠른 읽기 연산에 강하다. 스토리지 엔진들의 특성을 고려해 테이블별로 적합한 스토리지 엔진을 적용할 수 있다. 스토리지 엔진 뿐만 아니라 검색어 파서, 인증 도구 등도 모두..