본문 바로가기

전체 글

(52)
WSGI, ASGI, 이벤트 루프 정리 FastAPI를 쓰다 보면 한 번쯤 마주치는 의문들이 있습니다. async def로 선언했는데 왜 느리지, 워커는 몇 개로 띄워야 하지, def 함수는 써도 되는 건가 등등이런 것들이 다 한 줄기에서 나온 질문이라는 걸 최근에야 깨달았고, 정리하는 김에 글로 옮겨보았습니다.1. WSGI vs ASGI두 표준의 차이는 결국 동기냐 비동기냐이지만, 실제로는 처리 모델 자체가 완전히 다릅니다.WSGI (동기 표준)한 워커 = 한 요청. 요청이 끝날 때까지 워커가 붙들려 있음DB 쿼리가 5초 걸리면 그 5초 동안 워커는 대기HTTP만 다룸 (WebSocket, SSE 불가)대표: Flask, 전통적 Django장점: 단순함과 안정성. 디버깅 쉽고 라이브러리 호환성도 거의 완벽단점: 동시 연결이 늘면 워커를 그만..
[클린 아키텍처] 4부 컴포넌트 원칙 ** 클린 아키텍처 소프트웨어 구조와 설계의 원칙 책을 읽고 작성한 글입니다. 컴포넌트란?SOLID 원칙이 벽돌을 벽과 방에 배치하는 방법이라면, 컴포넌트 원칙은 빌딩에 방을 배치하는 방법이라고 할 수 있습니다.컴포넌트 = 배포 단위컴포넌트란, 시스템 구성 요소로 배포할 수 있는 가장 작은 단위입니다. 컴파일형 언어: 바이너리 파일의 결합체 (ex. 자바의 jar, 루비의 gem, 닷넷의 dll)인터프리터형 언어: 소스파일의 결합체 여러 컴포넌트를 서로 링크하여 단일 파일을 생성하거나, 묶어서 .war과 같은 단일 아카이브로 만들 수 있습니다. 또한 각 컴포넌트를 동적으로 로드할 수 있는 플러그인으로 만들거나, 각각을 .exe 파일로 배포하는 것도 가능합니다. 컴포넌트의 간략한 역사오늘날: 프로그램이 메..
[CS] 인터럽트 총정리 매번 헷갈리는 운영체제의 실행 모드, 인터럽트, 스케줄링, 그리고 시스템 콜의 관계를 하나의 흐름으로 정리해보겠습니다. 1. 두 가지 실행 모드 (보호 체계)운영체제는 시스템을 보호하기 위해 CPU 실행 권한을 나눕니다. 사용자 모드 (User Mode): 일반 앱 실행. 하드웨어 직접 접근 불가.커널 모드 (Kernel Mode): OS 실행. 모든 자원 접근 및 제어 가능.전환 도구: 사용자 모드에서 커널 모드로 가기 위한 유일한 통로가 바로 인터럽트(Interrupt)입니다. 2. 인터럽트의 분류 (발생 원인과 시점)인터럽트는 누가, 언제 일으키느냐에 따라 크게 두 축으로 나뉩니다. 분류비동기 인터럽트 (Asynchronous)동기 인터럽트 (Synchronous)다른 이름하드웨어 인터럽트소프트웨어..
[클린 아키텍처] 3부 SOLID 설계 원칙 ** 클린 아키텍처 소프트웨어 구조와 설계의 원칙 책을 읽고 작성한 글입니다. SOLID 원칙이란?SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하고, 이 클래스들을 어떻게 결합할지에 대한 원칙입니다.여기서 "클래스"는 OOP에만 국한된 개념이 아니라 데이터 + 함수 구조를 의미합니다. SOLID 원칙은 모듈/컴포넌트 내부 수준(코드 레벨보다는 상위)에서 적용되며, 그 목적은 다음과 같습니다. 변경에 유연한 소프트웨어이해하기 쉬운 소프트웨어많은 소프트웨어 시스템에서 사용 가능한 컴포넌트 기반 구조 SOLID는 긴 역사를 거쳐 수많은 변경 끝에 다음 다섯 가지 원칙으로 정립되었습니다. SRP (Single Responsibility Principle): 소프트웨어 "각 모듈"의 변경 이유는 하나여야 ..
[클린 아키텍처] 2부 프로그래밍 패러다임 ** 클린 아키텍처 소프트웨어 구조와 설계의 원칙 책을 읽고 작성한 글입니다. 2장 내용을 소개하기에 앞서 1장 내용을 간략하게 정리하자면, 설계와 아키텍처우리는 흔히 "아키텍처"라고 하면 세부사항과는 분리된 고수준의 무언가를 생각하고,"설계"라고 하면 저수준의 구조 혹은 세부사항을 생각합니다. 하지만 집을 설계한다고 했을 때 아키텍트가 도면을 설계하면서 고수준의 결정사항부터 시작하여 무수히 많은 저수준의 세부사항까지 알아야하고이 모든 사항이 집 전체 설계의 구성요소가 되듯이,소프트웨어 설계에서도 저수준의 세부사항과 고수준의 구조를 구분 짓는 경계는 뚜렷하지 않습니다. 그렇다면 "잘 만든 소프트웨어"란 무엇일까요? 결론부터 말하면 아래와 같습니다. 기능이 정상적으로 동작하는 것 추가 구현 요청사항이나 수..
[Spring] JWT access/refresh token 인증 구현 (with redis) JWT access/refresh token 구현하기 (with redis) ⚙️ 개발 환경 aws linux2 ec2 + docker (github action 자동배포) springboot gradle java 17 redis 현재 진행하고 있는 프로젝트에서 github action + docker를 통해 cicd 구축을 해놓은 상태이기 때문에, 배포 서버에서 workflow를 수정하고 docker-compose를 통해 redis 환경을 구축하는 것까지 진행했다. 전체 코드는 여기서 확인할 수 있다. 기존에 구현했던 회원가입, 로그인 코드에 jwt access/refresh token 인증 방식을 적용했다. 📍 인증 순서 클라이언트의 로그인 요청 id/pw 검증 후 access/refresh toke..
[Spring] 배포 서버의 도커 컨테이너에 크롤링 환경 구축하기 배포 서버의 도커 컨테이너에 크롤링 환경 구축하기 ⚙️ 개발 환경 AWS Linux2 EC2 Java 17 Gradle Spring boot 크롤링 소스코드는 여기서 확인할 수 있습니다. 현재 비공개 레포로 되어있어 추후에 다른 글로 정리해서 올리도록 하겠습니다. 📍 Dockerfile : 도커 컨테이너에 크롬 브라우저 및 크롬 드라이버 설치 후 배포 FROM openjdk:17.0.1-jdk-slim RUN apt-get -y update RUN apt -y install wget RUN apt -y install unzip RUN apt -y install curl RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd..
[Spring] OSIV와 성능 최적화 OSIV와 성능 최적화 Open Session In View: 하이버네이트 Open EntityManager In View: JPA 📍 OSIV ON spring.jpa.open-in.view : true 기본값 위의 기본값을 뿌리면서, 애플리케이션 시작 시점에 warn 로그를 남김 기본적으로 jpa는 트랜잭션을 시작할 때 db 커넥션을 가져옴 (영속성 컨텍스트) > api가 유저에게 반환될 때까지 살아있음 즉, 고객의 요청에 Response가 갈 때까지 영속성 컨텍스트가 살아있기 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것 지연 로딩은 영속성 컨텍스트가 살아있어야 가능 > 영속성 컨텍스트는 데이터베이스 커넥션을 유지해야 함 하지만 이 전략은 너무 오랜시간동안 db c..