Language/Python (45) 썸네일형 리스트형 Python의 Generic을 활용한 Repository Pattern 만들기 (feat, PEP 560) 목차 ">목차 개요 Repository Pattern은 데이터 저장소에 존재하는 데이터들을 마치 Application 메모리상에 존재하는 것처럼 가정하고 데이터 접근과 관련된 구현 사항을 추상화하는 패턴이다. Spring Boot에는 JPARepository라는 것이 있는데 이 추상화된 Repository를 사용하면 특정 Entity에 대해 어떤 방식으로 데이터를 질의할지 이미 구현된 메서드가 제공된다는 것을 체감했을 것이다. 이미 구현되어 있기에 간단한 기능은 다시 구현할 필요가 없으며 더 복잡한 조건이 필요하다면 네이밍 룰에 따라 메서드를 정의해서 사용하면 된다는 것이 특징이다. 프로젝트를 경험할 때마다 Python에는 JPARepository와 같은 역할을 대체하는 라이브러리가 없었기에 Pytho.. [SQLAlchemy] Pytest를 이용한 Imperative Mapping 테스트 코드 HTML 삽입 미리보기할 수 없는 소스 개요 최근 SQLAlchemy의 Imperative Mapping을 자주 이용하고 여러 형태의 사용법을 점검하고 있다. 이 과정에서 Pytest를 이용해 어떻게 하면 Imperative Mapping 방식을 이용한 ORM을 테스트할 수 있을지 고민했다. 이 포스팅에 기록하려고 하는 건 나름대로 구성한 프로젝트 구조에서 Pytest를 사용하면서 고민했던 부분과 이를 어떤 방식으로 해결했는지에 관한 것이다. 무엇을 테스트하며 무엇을 고려했는가 테스트를 하려고 한 대상 코드는 다음과 같은 구성이다. Service가 Repository의 Method를 사용하고 Repository의 Method는 DataBase에 Query를 날린다. 이를 코드로 표현하면 다음과 같은 구조.. [SQLAlchemy] Pessimistic/Optimistic Lock HTML 삽입 미리보기할 수 없는 소스 개요 웹 서버는 여러 Client의 요청을 동시에 수행할 수 있어야 한다. 한 자원을 놓고 동시에 요청이 실행한다면 어떤 문제가 발생할 수 있을까? 위와 같은 주제는 동시성(Concurrency)이라는 개념에 대해 생각하게 만드는 주제이다. 비관적(Pessimistic)/낙관적(Optimistic) 잠금에 대한 이해를 필요로 한다. 그러한 맥락에서 이 포스팅은 SQLAlChemy의 Session ORM을 통해 각각을 어떻게 구현할 수 있을지에 대해 정리한 내용이다. 1. Concurrency 문제 한 자원을 놓고 동시에 요청을 실행하는 문제는 익히 알려져 있다. 이는 다음과 같은 도식화로 설명이 가능하다. 위와 같은 시나리오에서는 사용자 A, B가 Resouce를 .. [SQLAlchemy] Imperative Mapping, One to Many Mapping HTML 삽입 미리보기할 수 없는 소스 관련글 2024.02.25 - [Language/Python] - [SQLALchemy] Imperative Mapping, Eager/Lazy Loading [SQLALchemy] Imperative Mapping, Eager/Lazy Loading HTML 삽입 미리보기할 수 없는 소스 개요 SQLAlchemy의 imperative mapping 방식을 계속 다루다 보니 Repository라고 정의한 계층에서 Session Query를 많이 작성하게 된다. 예를 들어 다음과 같은 형식이다. sessio jakpentest.tistory.com 개요 이 글은 SQLAlchemy의 Imperative Mapping 방식을 이용해 1:N의 관계를 다루는 방법에 관해 .. [SQLAlchemy] Imperative Mapping, exclude properties HTML 삽입 미리보기할 수 없는 소스 개요 imperative mapping을 사용하다 SELECT 쿼리로부터 특정 Column들을 제외하고 싶은 상황들이 있다. 이때 주요한 점은 SELECT로 얻은 Class의 attribute를 제외하는 방법이 아닌 SELECT 단계부터 특정 열을 제외하는 방식을 적용해 보고자 함이다. 즉, instance의 namespace 자체에서 임의로 정의한 Column들이 제외되어있어야 함을 의미한다. 1. Idea "특정 Column을 제외시키고 싶다"라는 생각에서 출발했지만 SQLAlchemy가 그러한 기능을 제공하지 않는다면 코드를 따로 작성해야 했다. 다행히 https://docs.sqlalchemy.org/en/14/orm/mapping_api.html에서 ex.. [SQLAlchemy] Imperative Mapping, Column 합성 HTML 삽입 미리보기할 수 없는 소스 개요 SQLAlchemy의 Imperative Mapping을 이용하다보니 “테이블의 열(column)을 모아서 Object로 표현할 수 있는 방법이 있지 않을까”를 고민하게되었다. 예를 들어 다음과 같은 코드가 있다고 가정해보자. class Member: address1:str address2:str 위의 코드를 ORM 관점에서 보자면 DB 테이블에 address1과 address2라는 열(column)이 존재한다고 생각해볼 수 있는 코드이다. 그러나 위와 같은 코드를 다음과 같이도 표현할 수도 있다. @dataclass class Address: address1:str address2:Str class Member: address:Address 위 코드를 통해 .. [Oauth] Python으로 KaKao Oauth Login Test하기 HTML 삽입 미리보기할 수 없는 소스 개요 과거 Google Oauth 로그인을 Python으로 테스트하기에 앞서 다음과 같은 라이브러리가 필요했었다. google-api-core==2.14.0 google-api-python-client==2.108.0 google-auth==2.23.4 google-auth-httplib2==0.1.1 google-auth-oauthlib==1.1.0 이번엔 KaKao Oauth Login(이하 KaKao Login)을 Python으로 테스트해 봤는데. 테스트하는 과정에서 KaKao Login을 위한 Python 라이브러리를 따로 찾을 수 없었다. 머리를 굴려보다 Python에서 KaKao Login을 테스트해보기 위한 방법으로 requests_oauthlib을 이.. [SQLALchemy] Imperative Mapping, Eager/Lazy Loading HTML 삽입 미리보기할 수 없는 소스 개요 SQLAlchemy의 imperative mapping 방식을 계속 다루다 보니 Repository라고 정의한 계층에서 Session Query를 많이 작성하게 된다. 예를 들어 다음과 같은 형식이다. session.query(MemberEntity).filter(MemberEntiy.id == member_id) 만약 join을 사용한다면 Session Query를 아래와 같이 작성한다. session.query(MemberEntity) .filter(MemberEntity.id == member_id) .outerjoin(MemberProfileEntity.member_id == member_id) 위와 같이 Session Query를 작성하는 게 어색하게.. 이전 1 2 3 4 ··· 6 다음