![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/onulf/btsrVqXXgZm/An9KxL2Cz9XQz1OUeoqsH1/img.jpg)
문제의 발생 새로운 프로젝트를 시작하면서, 로그를 다시 붙여야할 일이 생겼다. 기존 프로젝트에 로그를 개발하면서 했던 파이프라인을 그대로 가져와서 붙여넣었는데, POST 요청에서 이상하게 동작하지 않았다. 원인을 분석하면서 생긴 일을 정리해보려고 한다. 우선 현재 시스템에서 로그를 어떻게 찍는지 간단히 정리해보고 가자. 1. Controller에서 API 요청을 받아서 서비스로직까지 처리한 후 return 2. 이 return 할 때 AOP AfterReturning을 통해 캐치 3. 이때 발생하는 return object와 요청 정보를 담고 있는 HttpServletRequest을 통해서 로그를 생성 이 과정 중 3번에서 문제가 발생했다. 사실 스프링부트에서 POST 요청의 RequestBody를 가져..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/eaVo3r/btspH0OtZFl/YPczhP9W65RbobOuM3dSb0/img.png)
이전에 썼던 글에서 언젠가 Redis로 넘어갈 거라고 했었는데, 결국은 안정성 문제로 Redis를 쓰게 됐다. Redis가 고성능 인메모리 캐시라는 것 정도만 알고 있는데, 사용하기 전에 한번 짚고 들어가자. Redis 란? Redis는 데이터베이스, 캐시, 메시지 브로커 및 스트리밍 엔진으로 사용되는 오픈 소스(BSD 라이센스), 메모리 내 데이터 구조 저장소 입니다. Redis는 문자열, 해시, 목록, 세트, 범위 쿼리가 있는 정렬된 세트 , 비트맵 , 하이퍼로그로그 , 지리공간 인덱스 및 스트림과 같은 데이터 구조를 제공합니다. Redis에는 복제 , Lua 스크립팅 , LRU 제거 , 트랜잭션 및 다양한 수준의 디스크 지속성이 내장되어 있습니다. Redis Sentinel을 통한 고가용성과 Red..
이전 글에서 AOP로 로그를 처리하도록 구현하고 만족도가 너무 높아서 추가적으로 AOP로 간단히 처리할게 뭐가 있을까에 대해 고민했었다. 코드를 쭉 보다보니, 요청 객체를 검증하기 위해 사용하는 @Valid 어노테이션과 BindingResult가 눈에 들어왔다. @GetMapping("...") public ResultVo validRequestTest(@Valid RequestObject requestObjectDto, BindingResult bindingResult) { if(bindingResult.hasErrors()) { throw new BadRequestException(); } return exampleService.get(requestObjectDto); } 요청 객체가 정상적이지 않을..
이전글 스프링부트에 로그 남기기의 개선 사항이다. 이렇게 로그를 남기려고 하니, 몇 가지 문제가 있었다. 1. 로그가 두 번 남는 문제 2. message에 똑같은 로그가 한번 더 출력되는 문제 3. 모든 API 마다 set을 해줘야함 4. 윗 글엔 작성하지 않았지만, 요청 객체를 남기는 방식의 문제 이번 글에서는 1, 2, 3번 내용만 다룰 거고, 4번은 다음 글에서 다루려고 한다. 로그가 두번 남는 이슈 이 문제는 slf4j와 logback 설정을 잘못 이해해서였다. 기존 logback-spring.xml을 열어보면 아래와 같이 설정되어 있었다. [ignore] [ignore] [ignore] [ignore] [ignore] [ignore] [ignore] 별도의 새로 구현한 로그매니저를 통해 관리하..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cK3nAx/btsmIiEUSZ2/82KxyTAkc4zWlZ5Vj7UnwK/img.png)
6월 16일에 OpenAI가 업데이트 되었다. 몇 가지 모델이 업데이트 되었고, 토큰 수 증가와 함께 Function calling이란 기능도 함께 추가되었다. 이전 포스팅에서 토큰 수 증가로 대화 유지를 원활하게 할 수 있다는 것에 대해 다뤘으니, 이번에는 Function calling에 대해 알아보자. Function calling이란? Open AI reference에서 Function calling의 일부를 발췌했다. API 호출에서, 사용자가 gpt-3.5-turbo-0613, gpt-4-0613 모델에 함수를 설명할 수 있습니다. 모델이 이러한 함수를 호출하기 위한 인수가 포함된 JSON 개체를 출력하도록 지능적으로 선택하도록 할 수 있습니다. Chat Completions API는 함수를 호..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bvRWT2/btslaFWzSfb/593ioeCSKarrKiS9ZHVAq1/img.png)
6월 16일에 OpenAI가 업데이트 되었다. function call 기능과 함께 토큰 수가 증가 되었다. 무려 4k에서 16k로 4배나 증가 되었다. GPT-4도 GPT-3.5와 마찬가지로 16k 업데이트 되었다. 토큰 수가 업데이트되면서, 이전 대화를 기억하게 하는 기능을 적극적으로 활용할 수 있게 되었다. (기존 4천개로는 너무 적었음...) 구현 방식은 여러가지가 있을 것 같다. 가볍게 떠오르는건 두 가지정도인데, 1. FE는 질문만 전달, BE가 이전 질문과 답변을 저장하고 있다가 답변 생성 2. FE가 어차피 화면에 그려줘야하니까, 질문과 답변을 모두 보내주기 상용화될 앱이라면 1번이 맞다고 생각되어 1번으로 구현해봤다. 시작! chat API 연동 먼저 fegin client로 chat A..
얼마전에 비슷한 주제로 글을 하나 썼었다. 위 내용은 AWS S3 SDK 1.x 버전을 기준으로 작성했었다. 왜 1.x 버전을 선택했냐를 묻는다면 별 이유가 없었다. 그냥 구글링을하다가 가장 먼저 나왔던걸 사용했었는데, 이게 의외의 곳에서 문제를 일으켰다. 로컬에선 정상적으로 동작하는데, dev 서버에 배포되면 S3 SDK 매서드들이 Access Deny 문제로 사용이 불가능해졌다. dev 서버에 default로 지정된 AWS의 credential이 있는데도, 계속해서 문제를 일으켰는데 알고보니 SDK 버전이 문제였다. https://github.com/aws/aws-sdk-java-v2/issues/1470 요약하면 eks 환경에서 디폴트로 지정된 경로의 credential을 가져올 수 없으니 SDK ..
AWS S3의 기능만 제공하는 SDK를 알기 전에 있었던 일이다. build.gradle 설정을 아래와 같이 했다. implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' 의존성만 걸고 로컬에서 바로 실행을 한다면, 아마 gradle 빌드조차 되지 않을 것이다. yaml 프로파일에 추가 설정이 필요하다. cloud: aws: stack: auto: false region: static: ap-northeast-2 하지만 이 설정 후에도 빌드 타임이 갑자기 엄청 느려지면서 아래와 같은 에러가 발생한다. com.amazonaws.util.EC2MetadataUtils - Unable to retrieve the req..
- Total
- Today
- Yesterday
- EKS
- 람다
- OpenFeign
- springboot
- java
- JWT
- 티스토리챌린지
- ChatGPT
- CloudFront
- lambda
- Kotlin
- MySQL
- Elastic cloud
- AWS EC2
- Spring
- Log
- AWS
- 스프링부트
- openAI API
- serverless
- elasticsearch
- GIT
- 오블완
- cache
- terraform
- docker
- AOP
- S3
- OpenAI
- 후쿠오카
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |