Backend(96)
-
[Java] 런타임에 메서드를 전달한다는게 무슨 말일까?
모던 자바 인 액션 초반 부엔 일급 객체가 등장한 배경을 설명하면서 아래와 같은 구절이 나온다. 만약 런타임에 메서드를 전달할 수 있다면, 즉 메서드를 일급 시민으로 만들 수 있으면 프로그래밍에 유용하게 활용할 수 있다. (넹?) 문맥상, 일급 객체(시민)를 메서드의 인자로 할당할 수 있어 생기는 이점에 대해 설명하는 내용이지만, 런타임에 메서드를 전달한다는 말이 쉽게 와닿지 않는다. 런타임 메서드 전달이 무슨 의미일까? 우선 런타임은 문자 그대로 프로그램이 실행되는 시간을 의미하는데, 이미 애플리케이션이 실행된 시점에 메서드를 객체와 연동하여 전달하고 호출하는 기법을 의미한다. 프로그래밍의 람다 표현식이나 콜백 함수, 디자인 패턴에선 전략패턴 등 여러 방법으로 구현할 수 있다. 이러한 기법의 공통점은..
2023.07.17 -
[Open AI API 에러] ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with LibreSSL 2.8.3
FastAPI 로 찌피티 import 할 때 발생한 에러 FastAPI 내부에 설치된 urllib3 v2.0 이 OpenSSL 1.1.1+ 버전만 지원한다고 한다. Error message ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with LibreSSL 2.8.3. See: https://github.com/urllib3/urllib3/issues/2168 그럼 어떻게 할까? 에러를 해결하는 여러 방법이 있지만, 필자는 간단히 urllib3의 버전을 2.0보다 아래로 다운그레이드 했다 해결 pip uninstall urllib3 pip install 'urllib3
2023.05.28 -
@Transactional 썼지만 Dirty Checking 이 안된 이유
목차 0. Dirty Checking 이 동작하지 않은 내 코드 1. Dirty Checking 은 어떤 조건에서 실행되는가? 2. @Transactional 은 어떤 원리로 Dirty Checking 을 진행하는가? 3. 그럼 어떻게 수정해야하나? 4. 결론 Dirty Checking 과 @Transactional 의 원리를 잘 아시는 분이라면 이 글에서 얻어가시는게 많이 없을 수 있습니다. 이 글은 무지성으로 @Transactional 을 사용한 지난 날을 반성하고 더 공부하기 위해 작성했습니다. 0. Dirty Checking 이 동작하지 않은 내 코드 너무 부끄럽지만 처음엔 이렇게 코드를 짜놓고 왜 Dirty Checking 이 되지 않는지 의아했다. @Transactional 어노테이션이 있는 ..
2023.03.12 -
Optional, ifPresentOrElse 로 간단한 리팩토링
ifPresentOrElse 를 이용한 (초)간단 리팩토링 프로세스 1. userEmail 로 회원이 존재하는지 확인 2. Optional 타입의 findUser 반환 3. Optional 값이 비어있으면 userEmail 을 가지는 회원이 없다는 뜻이므로, newUser 엔티티를 저장 (repository.save()) . 4. Optional 값이 존재 시, findUser 의 토큰값 갱신 5. @Transactional 어노테이션으로 인해, 더티체킹 후 영속화 진행 기존.java @Transactional private void createUser(String userEmail, Token token) { Optional findUser = userRepository.findUserByEmail(u..
2023.03.09 -
[Querydsl] Pagination 성능 개선 part1.PageableExecutionUtils
목차 기존 : QueryDSL의 페이징 개선 : PageableExecutionUtils : new PageImpl()의 count 쿼리 개선 Test Case Test case 1. 페이지 사이즈 20 / 총 content 8개 / 첫 번째 페이지 호출 Test case 2. 페이지 사이즈 5 / 총 content 8개 / 두번째 페이지 호출 Test case 3. 페이지 사이즈 3 / 총 content 8개 / 두번째 페이지 호출 (총 3개의 페이지 존재) 결론 (기존) QueryDSL의 페이징 보통 QueryDsl (이하 qdsl)에서 페이징 할 땐 new PageImpl()을 사용했습니다. 이름대로 Page 인터페이스의 구현체이며, 동시에 Chunk 인터페이스의 구현체입니다. (여기선 중요한 게 ..
2023.02.21 -
Map 타입의 forEach (feat. Biconsumer)
Biconsumer 공부하다가 Map 타입에 forEach 를 실행시키면 어떤 인자가 나오는지 알게 됐다. 보통 Map 타입을 iterable 하게 사용하는 경우엔, 아래처럼 향상된 for 문을 작성했다. void 테스트() { Map map = new HashMap(); for (String s : map.keySet()) { System.out.println("s = " + s); } for (Integer value : map.values()) { System.out.println("value = " + value); } for (Map.Entry stringIntegerEntry : map.entrySet()) { System.out.println("stringIntegerEntry.getKey(..
2023.01.31 -
[SpringBoot] @NotNull, @NotEmpty, @NotBlank 차이점, 그만 헷갈리기로 해요
@NotNull, @NotEmpty, @NotBlank 세 어노테이션은 DTO 필드의 유효성 검증에 사용된다. @NotNull @NotNull은 필드에 Null 값을 허용하지 않는다는 것을 유추할 수 있다. 실제로도 @NotNull 이 붙은 필드는 null 값만 허용하지 않을 뿐, "" 나 " " 같은 빈값, 공백값은 할당 받을 수 있다. 하지만 @NotEmpty 와 @NotBlank 는 왠지 모르겠지만 매번 헷갈린다. 둘의 차이가 헷갈림 -> 구글링 -> 오케이 확인 -> (며칠 후) 둘의 차이가 헷갈림 -> 구글링 -> ... 이젠 그만 헷갈리기로 하자. @NotEmpty Not Empty : (필드가) 비어있지 않다 그렇다면 비어있는 필드는 어떤 상태일까. 바로 null 과 "" 이다. 즉 @Not..
2023.01.28 -
[Spring] @Cacheable 메서드 내부 호출 개선하기 (feat. self invocation)
목차 배경 문제 API 개선 요구사항 현재 API 사항 개선된 API 요구사항 첫 번째 시도 두 번째 시도 세 번째 시도 Self-Invocation 해결 방안 (Proxy 생성) 1) ApplicationContext DI 2) @Resource으로 AutoWiring 마무리 배경 클라이언트에서 특정 키워드로 조회하면, 해당 키워드에 해당하는 상품 목록을 받아온다. 쇼핑몰 API 에서 상품을 보내주며, 12개의 상품을 디폴트로 보내준다. 쇼핑몰 API에서 해당 키워드의 상품 재고가 부족하면, 12개 미만으로 응답할 수 있다. 상품의 개수가 9개 미만이면, 재고 보충 notify 를 위해 슬랙봇 메시지가 전송된다. 문제 상품 재고가 부족한 키워드로 api 요청이 계속 들어오면 어떻게 될까요? 매번 api..
2023.01.07 -
InputStream 사용시 발생한 간단 장애 회고
배경 회사에서 이미지-저장 API를 개발 및 유지 보수 하고 있습니다. 클라이언트에서 이미지를 전송하면 해당 이미지를 S3에 저장하는 모듈입니다. 기획 정책상 S3 에 저장하기 전, 용량을 줄이고자 리사이즈 작업을 선 진행 후 S3 에 업로드 합니다. 사건 S3 에 저장된 이미지 중, 리사이즈 된 이미지의 용량이 0byte 로 나타나는 케이스가 간헐적으로 발생했습니다. 0byte 이미지는 무엇을 의미하는 걸까요? 그렇습니다. 이미지가 유실됐다는 거죠 😇 다행인 점은 리사이즈 전, 원본 사이즈의 이미지도 별도로 S3 에 저장하기 때문에 큰 장애로 이어지진 않았습니다. 원인 규명 다시 사건으로 돌아가서, 사건의 전날 상용 배포 커밋을 우선 비교했습니다. 리사이즈 된 이미지에서 0byte 이슈가 발생했으니, ..
2023.01.01