일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 스프링부트
- 타입스크립트
- 딥다이브
- 프론트엔드 과제
- Dev-Matching
- redis
- 모던 자바스크립트
- invalid_grant
- NestJS
- api 요청 수 제한
- concurrency limit
- 유효시간 설정 url
- 프론트엔드
- 우아한 테크코스
- 우아한테크코스
- this
- 자바스크립트
- 파일 url
- 음악 url 파일 다운로드
- Deep Dive
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
- oauth
- bucket4j
- 프리코스
- AWS
- 프로그래머스
- compateto
- 검색
- TypeORM
- api 비동기처리
- Today
- Total
목록전체 글 (174)
개발 알다가도 모르겠네요
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Q7mk5/btsHD6EifhY/XmAp1IoOxBWowc8VrFcm2k/img.png)
배경인생네컷에는 QR코드를 통해 촬영 과정을 담은 비디오, 사진 이미지를 다운받을 수 있는 유효시간 72시간의 URL을 제공한다.현재 개발중인 Daytune 앱 내에도 사용자가 자신의 음악을 주위 친구들에게 자랑함으로써 참여도를 높이고, 유입자 수를 증가시키기 위해 공유 URL 기능을 추가하기로 했다. 현재는 사용자가 일기를 작성하면, 그 일기의 감정에 맞는 음악 2개를 생성해주고 사용자는 2개 중 하나를 골라 소유하게 된다. 그 다음 과정으로 72시간동안 접근 가능한 음악공유 URL 을 생성하여 제공하는 방식이다. 그렇다면 유효시간이 설정된 url은 어떻게 만들어야 할까? 답은 AWS S3의 Presigned Url 기능에 있다. Pre-Signed URL 이란?Pre-Signed URL은 AWS S3..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qHXEV/btsHpyIpJoy/tZiFU3kKOZENXb2lcxu2a1/img.png)
기존에는 일기를 작성하면 내부적으로는 '일기 생성 -> GPT로 일기 감정 추출 -> Suno AI로 음악생성 -> 일기 생성 완료' 의 로직으로 돌아가고 있어 클라이언트가 응답을 받는데까지 7~8초가 소요됐다.따라서 비동기 처리를 활용하면 장기 실행 작업이 메인 스레드를 차단하지 않도록 하여 사용자 응답 시간을 줄이고 시스템 자원을 효율적으로 사용할 수 있도록 구현했다. 비동기 처리를 위한 AsyncConfig 클래스비동기 처리를 위한 설정 클래스를 작성한다. AsyncConfig 클래스는 Spring의 비동기 기능을 활성화하고, ThreadPoolTaskExecutor를 설정하여 비동기 작업을 처리할 때 사용할 스레드 풀을 구성한다.@Configuration@EnableAsyncpublic class..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wbIcl/btsHq3tsiyO/K1qLnbOHG4y9Jxg3bFEOL0/img.webp)
이번 글에서는 SunoAI와 Spring Boot를 연동해 사용자 감정에 맞는 음악을 생성하는 기능을 구축하는 방법을 설명하겠다.SunoAI는 AI를 활용해 음악을 생성하는 서비스로, 사용자의 감정에 맞춘 음악을 제공하는 데 적합하다. 그러나 SunoAI는 공식 API를 제공하지 않기 때문에 SunoAI의 쿠키값을 이용한 GitHub 오픈소스 API를 사용하였다. (EC2 서버에 따로 AI서버 구축한 상태)이 기능은 일기를 작성한 후 ChatGPT를 이용해 일기의 핵심 단어를 추출하고, 이를 바탕으로 SunoAI가 감정에 맞는 음악을 생성하도록 설계했다. GitHub - gcui-art/suno-api: Use API to call the music generation AI of suno.ai, and ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/I2vqW/btsG6gHE10M/Dqj1iXJ9TgSCKtwZycicF1/img.png)
Immutable 객체란 무엇인가?자바에서 객체가 Immutable이라는 것은 해당 객체가 생성된 후 그 상태가 변하지 않는다는 것을 의미한다. 즉, 객체의 상태(데이터)를 변경할 수 없다는 것이다. 이는 데이터의 무결성을 유지하고, 멀티스레딩 환경에서의 동기화 문제를 해결하는데 도움이 된다고 한다. Immutable 객체의 이점1. 데이터 무결성 보장: Immutable 객체는 생성 후 상태가 변경되지 않으므로, 예기치 않은 side effect로부터 데이터를 보호할 수 있다.2. 스레드 안전: 여러 스레드에서 동시에 해당 객체를 참조해도 객체가 변경될 수 없으므로 동기화를 신경 쓸 필요가 없다.3. 캐싱과 재사용 용이: Immutable 객체는 그 자체로 고유한 식별자 역할을 할 수 있으며, 캐시에 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dIxr5L/btsG483BGra/rpvZBYW1vjF9dersUZtRa1/img.png)
애플은 2019년 애플 로그인 기능을 발표한 동시에, App Store에 등록할 때 소셜 로그인이 하나라도 있다면 애플 로그인이 필수로 제공되어야 한다는 심사정책을 내놓았다. 5월에 MVP 출시 예정인 앱에는 소셜로그인 기능이 들어가기 때문에 애플로그인을 필수로 적용시켜야 하는 상황이었다. 문제는 애플로그인이 다른 소셜로그인들과 동작방식이 좀 다르다는 점이다. 애플의 경우에는 아래처럼1. 서버 내부에서 별도로 client_secret라는 값을 생성해준 뒤에2. 애플서버에 여러 설정정보를 함께 전달해줘야 한다.3. 여기서 끝이 아니라 애플서버로부터 전달받은 id_token 값을 파싱해야 비로소 이메일과 같은 사용자 정보를 얻을 수 있었다. 여러 레퍼런스를 살펴보니까, Identity Token값을 활용해서..
Comparable (compareTo())"자기 자신과 매개변수 객체를 비교"@Overridepublic int compareTo(Cls cls) { if (this.number > cls.number) return 1; // 비교주체가 더 크면 양수 else if (this.number == cls.number) return 0; // 같으면 0 else return -1; // 비교값이 더 크면 음수} Comparator (compare()) "두 매개변수 객체를 비교"@Overridepublic int compare(Cls o1, Cls o2) { if (o1.number > o2.number) return 1; //..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bUqXNk/btsH8xhmttw/MZTdkGJvZqWIakB7kZSGak/img.png)
최근 프로젝트에서 API 요청 수를 제어하기 위해 Rate Limiter를 적용하는 작업을 수행했다.이 과정에서 겪은 문제점과 해결하기 위해 학습한 내용을 정리해보고자 한다. * 업무 환경은 Laravel 프레임워크를 쓰고 있기 때문에, 지금 설명하려는 Spring에서의 Rate Limiter 구현과는 적용 알고리즘 정도의 차이가 있다.Problem1. 사용자 계정별 글 작성 수 제한 정책 추가사용자마다 시간 당 글 작성 수를 제한해야 하는 기획팀의 요구사항이 있었다. (아래처럼 자동화 공격이나 도배성 뻘글 방지 목적도 있었다.) 2. AI 이미지 생성 API 다중 호출 시 서버 과부하로 인한 타임아웃 이슈현재 운용 중인 단일 AI서버에서 이미지를 하나 생성하는데는 약 5~6초가 걸린다. 다수의 AI 이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/JWXn0/btsppIoxPrM/RFZsvbiwC0auSP4q1zG7Bk/img.png)
Situation맡고 있는 앱 내 기능 중, 텍스트를 입력하면 AI이미지로 출력해주는 기능이 있다. 이때, 사용자가 비속어 등의 특정 단어를 쓸 경우 선정적이거나 폭력적인 이미지가 나올 수 있어, 입력값에 비속어가 있는지 판별해 필터링하는 로직을 구현해야 했다. 기획팀에게 받은 단어는 약 2500개였고, 받은 데이터들을 어디에 저장하는게 좋을지 고민을 하게 되었다.그래서 생각한 것이 로컬 파일, db, redis서버 이었다. 그 중에서도 캐싱 및 공유 데이터 관리가 가장 용이하다고 들은 redis를 통해 데이터를 저장해보고자 했다.지금까지 redis서버를 한번도 구축해본 적이 없었고, 사실 redis에 대한 개념도 제대로 잡혀 있지 않았다. 그래서 먼저 redis가 무엇인지부터 알아보았다. 결론적으로는 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cWyd1x/btsnIJP3hQH/DRRs53iXHjcrwgqJg9dk00/img.png)
Stable Diffusion자연어 설명으로부터 이미지를 생성해내는 딥러닝 생성형 AI로 Text to Image 모델, 즉 텍스트로부터 이미지를 뽑아내는 것이다. 아무튼 회사에서 운영중인 앱에 Stable Diffusion 기술을 탑재시켜야 했다.그림을 잘 못 그리는 사용자들을 위해, 텍스트를 입력하면 그 텍스트를 stable diffusion을 이용해 이미지를 출력해서 그림에 흥미를 갖도록 하기 위한 의도였다. Situation : 외부서버에서 접근 가능하도록 만들자 동작 구조는 [클라이언트] 이미지 생성 요청/응답---> [WAS서버] 이미지 생성---> [Stable Diffusion서버]프로세스가 이뤄져야 했다. 아래의 깃헙은 Stable Diffusion을 web ui형태로 구현해낸 소스코..
npm i --save @nestjs/config 설치 후, 아래와 같이 ConfigModule.foorRoot 안에 envFilePath를 추가한다. import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot({ envFilePath: '.development.env', isGlobal: true, }), TypeOrmModule.forRoot({ type: 'mysql', host: process.env.DB_HOST, port: Number(..