본문 바로가기
관리자

Programming-[Backend]

(421)
[링크] could not initialize proxy - no Session Service 레이어에서 Entity를 가져올 때 발생할 수 있다. Entity에 접근해서 JPA의 Fetch 설정이 LazyLoading(주로 1:N으로 연결된 필드) 설정인 경우 서비스 레이어 -> 컨트롤러 레이어에서 프록시 객체를 넘겨서 발생할 수 있다. 아래 참조 글에 따르면 이것은 프록시 객체를 가져오는 것도 트랜잭션 단위로 이루어지기 때문이다. 서비스 레이어에서는 StudentDto내에 School 엔티티를 프록시로 들고 있어도 되지만, 그대로 서비스 레이어를 끝내고 다른 레이어로 넘어가면 세션이 끝나버려서 프록시로 들고 있던 School 엔티티의 값을 참조하지 못하게 된다. 서비스 레이어에서 모든 프록시 객체들을 개별 DTO로 변환하는 것이 추천된다. Eager 로딩할 수도 있겠으나 N+1 ..
[TIL] Django Restframework Exception Handler 개요 1. Exception Handler 설정 Django에서 exception handler는 settings.py 파일의 RESTFRAMEWORK 설정에서 경로를 지정해줄 수 있다. 기본적으로는 Class를 지정하여 사용하며 exception_handler.ExceptionHandler를 상속받아 메서드들을 override한다. from rest_framework.views import exception_handler class CustomExceptionHandler(exception_handler.ExceptionHandler): def handle_exception(self, exc): # Custom logic to handle the exception # Return a custom respon..
[TIL] Django Cache 개요 1. Cache 설정 Caching은 잦은 접근이 예상되어 데이터베이스에 직접 접근하지 않고 Memchached나 Redis 같은 속도가 빠른 저장소에 데이터를 저장해놓는 방식이다. Django에서는 아래와 같이 settings.py에 설정하여 사용할 수 있다. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', }, 'redis': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'dj..
[TIL] 여러 where 조건 한번에 조회하기. multi column related id query join 상황 base_table에 a, b컬럼이 FK로 잡혀있고, 중복된 항을 count로 구한 결과가 아래와 같을 때 다시 base_table에서 a_id, b_id를 갖는 id 값을 조회할려면 어떻게 해야할까? 다시 말해 (a_id, b_id) = (9002, 3145), ...인 Row들의 각 id 값을 구하고 싶은 경우 어떻게 해야할까 해결 방법 with 구문(또는 서브쿼리)로 원래 SQL문을 감싸고, 기존 테이블과 join을 하되 on절에 원하는 조건을 기입하면 된다. with tmp as (select count(id), a_id, b_id from base_table bt where 1 = 1 and deleted is null group by a_id, b_id having count(id) > ..
[TIL] python @patch doesn't work, @patch 작동 안함. mock 현상 python에서 test를 하는데 @patch가 작동을 안했다. 아래 코드에서 make_something 함수는 테스트 대상이 아니라서 테스트 도중에 실행되지 않도록 @patch를 적용했는데 정상 작동하지 않고 make_something 함수가 그대로 실행되었다. from a.util import make_something # 중략 @patch("a.util.make_something") def test_make_other_thing(self, mock_make_something): # ... mock_make_something.assert_not_called() # Error 원인 mock은 특정 object의 참조를 가짜 객체로 바꾼다. 그런데 최상단에서 import를 해버리면 실제 그 clas..
[TIL] Django ListSerializer 활용, List Update/Create viewset을 이용하면 list, create API 끼리 묶이고, retrieve, update, destroy 끼리 detail로 묶여서 동작한다. 여기서 detail쪽은 반드시 어떤 테이블의 레코드와 일치하는 특정 인스턴스를 가리키기 위해서 아래와 같이 pk 값을 써줘야한다. 특정 학생 정보를 업데이트하기 위해 student의 pk값을 받는다. https://django.school//student/ 그래서 만약 여러 레코드(인스턴스)를 한 번에 update하고 싶다면 ListSerializer를 구성하여 처리해야한다. Serialier 구성 class StudentListSerializer(serializers.ListSerializer): def update(self, instance: Lis..
[링크] 파이썬 assert, raise 차이 https://ltlkodae.tistory.com/17 파이썬 assert, raise 차이점 파이썬에서 예외를 발생시키는 방법은 assert, raise 두가지가 있다. 그동안 크게 고민없이 사용했는데, 정리가 필요한것 같아 포스팅을 작성한다. assert 아래처럼 사용법은 굉장히 간단하다. cond = F ltlkodae.tistory.com assert는 DEBUG=True 일때만 동작. 테스트나 디버깅 성격이 강하다 실제 서비스에서는 raise 사용이 권장
웹 스크래핑, 크롤링- 2. Selenium 나도 코딩님의 파이썬 웹 스크래핑 강의 정리 https://www.youtube.com/watch?v=yQ20jZwDjTE 1. Selenium 설치 웹 자동화 테스트 툴이다. pip install selenium 크롬 웹드라이버 설치 크롬을 자유롭게 제어할 수 있는 실행파일이다. chrome://version 접속 -> chromedriver에서 알맞은 버전 다운로드 후 설치 *M1 맥북에서 chromedriver 실행파일을 열 수 없을 때 터미널로 chromedriver가 있는 디렉토리로 이동하여 아래 명령어를 입력해주면 된다. xattr -d com.apple.quarantine {크롬 드라이버 파일명(chromedriver)} 이후 다시 실행해보면 잘 실행된다. 2. 기본 사용법 naver에 접속..