Backend 43

Soft Delete 테스트: @SQLDelete와 @Where의 효과적인 검증 방법

Soft Delete는 데이터베이스에서 레코드를 물리적으로 삭제하지 않고 상태 플래그를 변경해 비활성화 처리하는 방식입니다. 이를 구현한 후 예상대로 동작하는지 철저히 검증하는 테스트 전략이 중요합니다. 이번 글에서는 Soft Delete와 Delete의 내부 동작 방식, 그리고 Soft Delete 구현 시 테스트 코드 작성 방법에 대한 구체적인 전략을 다룹니다. 1. @SQLDelete와 @Where의 내부 동작 방식1. @SQLDelete@SQLDelete는 엔티티가 삭제될 때 Hibernate가 생성하는 기본 DELETE SQL 대신 사용자 정의 SQL을 실행하도록 설정하는 어노테이션입니다. 내부적으로 아래의 단계를 거칩니다.1단계: Hibernate Entity Persister를 설정Hiber..

Backend 2024.11.30

MySQL vs PostgreSQL데이터베이스의 성능 및 확장성 비교

요약 본 글은 MySQL과 PostgreSQL, 두 관계형 데이터베이스가 백엔드 개발에서 제공하는 성능과 확장성, 데이터베이스 일관성 및 커뮤니티 지원을 비교한다. 각 데이터가 백엔드 환경에서 어떻게 동작하는지 성능 및 기술 측면에서 분석하고, 성능, 확장성, 데이터 일관성, 커뮤니티 및 기능 지원을 비교 항목으로 제시한다. 서론 MySQL과 PostgreSQL는 2024년 기준으로 IT 산업에서 필수적인 역할을 하고 있으며, 특히 백엔드 개발에서 많이 사용되고 있다. DB-Engines의 2024년 순위에 따르면, MySQL은 2위, PostgreSQL은 4위를 차지하고 있다. 이 두 데이터베이스는 각각의 강점과 약점을 가지고 있으며, 산업 전반에서 광범위하게 사용되고 있다. 본 보고서는 IT 업계에서..

Backend 2024.10.31

비동기 처리를 지원하는 모델(스레드 기반/이벤트 루프 기반)

비동기(Asynchronous) 처리개발을 하다보면 비동기라는 용어를 많이 접하게 된다. 비동기라 함은, 특정 작업의 완료를 기다리지 않고 다른 작업을 동시에 수행하는 것이다. 곧, 서버에서 데이터를 요청하고 응답을 받아야 한다면, 응답이 오는 것과 관계없이 작업을 계속 이어나가 병렬로 작업을 동시에 처리하여 흐름이 멈추거나 지연되지 않는 것이다.왜 웹은 비동기를 지원해야하는가? 주로 성능과 사용자 경험을 향상시키기 위해서 필요하다. 웹 애플리케이션의 효율성을 높이고, 대규모의 동시 요청을 효과적으로 처리하며, 사용자의 대기 시간을 줄이는 데 중요한 역할을 한다.성능 향상효율적인 자원 사용: I/O 작업을 수행하는 동안 다른 요청을 동시에 처리할 수 있다.대기시간 감소: 데이터베이스 쿼리나 파일 다운로드..

Backend 2024.06.23

[FastAPI] HTTPException과 Exception 예외처리의 목적과 사용방법

FastAPI에서 주로 발생시키는 에러는 HTTPException, Exception이 있다. 프로젝트를 진행함에 따라서 예외 핸들링을 하게 되는데, 이 두 가지 간에 혼용하여 사용할 경우가 있어 이를 바르게 사용하고자 정리해보겠다. 1. HTTPExceptionHTTPException은 FastAPI에서 HTTP 요청 처리 중에 발생할 수 있는 특정 예외를 처리하기 위해 사용됩니다. 특히나, 주로 클라이언트에게 HTTP 상태 코드와 함께 명확한 오류 메시지를 반환하고자 할 때 사용된다. 주로, 잘못된 요청, 인증 실패, 리소스 없음 등과 같은 HTTP 관련 오류를 명시적으로 나타내기 위해 사용된다. ✔️ HTTPException의 특징HTTP 상태 코드status_code를 인자로 받아 반환할 HTTP..

Backend/FastAPI 2024.06.07

FastAPI PostgreSQL DB 트랜잭션 동기/비동기 처리

🕊️ FastAPI 데이터베이스 처리이번 게시물에서는 FastAPI에서 데이터베이스 처리를 위해 사용하는 두 개의 라이브러리에 대해서 다루어보겠다. 지난 게시물에 이어서 이번에는 ASGI인 FastAPI에서 비동기적으로 수행할 수 있는 Asyncpg에 대해서 설명하고자 하는데, 이를 위해서 동기식으로 동작하는 psycopg2에 대해 다루어볼 것이다. 아래서 내가 제시하는 get_db(), get_db_session()함수 두개는 각자 두개의 라이브러리를 활용하여 작업할 때 필요한 데이터베이스 접근 방식이다. 각자 동기/비동기적으로 접근한다. ✨ psycopg2해당 라이브러리는 "동기식"으로 작동한다.따라서, 요청을 처리하는 동안 다른 작업들은 수행하지 못하고 대기 상태에 있게 된다.  그러나, Djan..

Backend/FastAPI 2024.05.11

CGI, WSGI, ASGI 에 대하여

2년전인 1학년 때, 아무것도 모르는 상태에서 FastAPI를 시작했었는데 당시 FastAPI가 Starlette 과 Pydantic을 기반으로 한 웹 프레임워크이며, ASGI방식을 사용한다는 것을 알게되었다. 🤔 그래서 ASGI방식이 뭔데? 선배가 ASGI방식임을 알려주셨는데, 그게 뭔질 알아야 또 그거말고 뭐가 있는지 알아야 이해를 할텐데 너무 답답했다. (물론 선배가 설명을 못하신게 아니라, 내가 뭐가 있는지 모르니 아무리 설명해줘도 "그게뭔데? 머좋은건데?"라는 생각만 나는 상황..)  최근에, FastAPI공부를 하면서, DB에 접근할 때 session개념이 생기던데 Asynchronous하게/Synchronous하게 접근해야할지 고민했는데 (물론 비동기가 맞다고 생각했다!! 이건 다른 글에서..

Backend/FastAPI 2024.05.10

[Python] FastAPI Logging - correlation ID (middleware & uuid)

✨Build Up이번에 회사에서맡은 일을 해결하는 과정에서 Python FastAPI 서버를 구축하게 되었다. Llama3 모델을 활용하기 위해서 Kotlin + Spring 프로젝트에서는 유연하지 못한 것 같아 모델에 관련된 처리를 Python 서버에서 해결하기로 했고, 완전히 새로운 프로젝트를 만드는 상황이라 Logging과 배포에 관련된 문제를 모두 스스로 해결해야했다. 이번에는 그 과정 중에서도 로깅에 관한 문제를 해결해야한다.어플리케이션 밑에 찍히는 로그도 필요하지만 프로덕션에서는 Opensearch를 통해서 더 손쉽게 로그를 탐색할 수 있어야 하고 나중에는 DataDog을 활용하여 트래픽 분석도 할 수 있어야 한다. 그 중에서도 이번에는 Python FastAPI에서의 Logging에 대해서 ..

Backend/FastAPI 2024.05.03

Presigned Url 으로 S3에 이미지 업로드하기 (Kotlin)

이번 게시물에서는 Amazon S3에서 이미지를 업로드 하기 위한 Pre-Sign url를 생성하는 방법을 다룰 것이다!! 요즘 Naver Clova OCR을 활용하여 텍스트를 추출하여 AI 모델에 해당 결과를 프롬프트에 포함하여 정해진 json 형식에 맞추어 결과를 반환하는 일을 하고 있는데, OCR에 이미지를 url로 요청하게 되는데 이때 이미지 호스팅이 필요하고, 이 이유 외에도 추후에 모델 학습이나 비지니스 로직에 의해서 변환을 시도한 이미지를 저장해두는 편이 좋기 때문에 S3에 호스팅하기로 결정했다. 🤔 Presigned url 이란? 미리 서명된 url이다. 다른 사람(클라이언트)로 하여금 버킷에 객체를 업로드/조회할 수 있다. 해당 url을 사용할 경우 AWS 보안 자격 증명이나 권한이 없어..

Backend 2024.04.19

[Spring MVC] 로깅(Logging)

자바에서는 로깅을 slf4j를 사용한다.Logger를 쓰는 이유로깅을 쓰는 이유는 간단하다. 당장 아래 예시의 결과만 봐도 Logger를 활용한다면 알 수 있는 것이 훨씬 많다.@RequestMapping("/log-test") public String logTest() { String name = "Spring"; System.out.println("name = " + name); log.info("info log={}", name); return "ok"; } 또한 application.properties를 통해서 Debug 레벨을 선택할 수 있다. 이것이 로깅의 또다른 장점이기도 하다!trace, debug, info(로컬에서는 trace..

Backend/Spring 2024.04.01

Java + Kotlin 프로젝트 QueryDSL QFile을 찾지 못하는 이슈(소스 세트 구성 오류)

도입 최근 내가 스타트업에서 하고 있는 프로젝트는 기존에 Php 라라벨로 작성되었다가 Java Spring으로 넘어와 지금은 Kotlin+Spring으로 짜여져있다. 이미 자바로 중요한 비지니스 로직이 짜여져있다보니 한 번에 모든 코드를 Kotlin으로 마이그레이션 하는 것은 비용적인 면에서 좋지 않기 때문에, 도메인 단위로 쪼개어서 필요하다면 마이그레이션을 진행하고 있는 상황이었다. 다행이도 Java와 Kotlin은 같은 JVM언어로 서로 호환이 매우 잘 되는 편이지만(물론, 아직 경험이 그다지 많지 않아서 확실하진 않지만 대체로 그런 것 같다.) 외부 오픈소스 프로젝트를 사용하게 된다면 가끔 언어가 다르다는 이유로 Build할 때 예상하지 못한 문제를 겪기도 한다. 비교적 최근에 겪었던 문제인데, 만..