일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프론트엔드
- 프론트엔드 과제
- oauth
- 스프링부트
- 프로그래머스
- 우아한테크코스
- api 비동기처리
- 유효시간 설정 url
- 음악 url 파일 다운로드
- redis
- Deep Dive
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
- invalid_grant
- 파일 url
- bucket4j
- 모던 자바스크립트
- Dev-Matching
- 프리코스
- TypeORM
- api 요청 수 제한
- AWS
- 검색
- compateto
- 우아한 테크코스
- 자바스크립트
- concurrency limit
- 타입스크립트
- 딥다이브
- NestJS
- this
- Today
- Total
목록전체 글 (174)
개발 알다가도 모르겠네요
배경인생네컷에는 QR코드를 통해 촬영 과정을 담은 비디오, 사진 이미지를 다운받을 수 있는 유효시간 72시간의 URL을 제공한다.현재 개발중인 Daytune 앱 내에도 사용자가 자신의 음악을 주위 친구들에게 자랑함으로써 참여도를 높이고, 유입자 수를 증가시키기 위해 공유 URL 기능을 추가하기로 했다. 현재는 사용자가 일기를 작성하면, 그 일기의 감정에 맞는 음악 2개를 생성해주고 사용자는 2개 중 하나를 골라 소유하게 된다. 그 다음 과정으로 72시간동안 접근 가능한 음악공유 URL 을 생성하여 제공하는 방식이다. 그렇다면 유효시간이 설정된 url은 어떻게 만들어야 할까? 답은 AWS S3의 Presigned Url 기능에 있다. Pre-Signed URL 이란?Pre-Signed URL은 AWS S3..
기존에는 일기를 작성하면 내부적으로는 '일기 생성 -> GPT로 일기 감정 추출 -> Suno AI로 음악생성 -> 일기 생성 완료' 의 로직으로 돌아가고 있어 클라이언트가 응답을 받는데까지 7~8초가 소요됐다.따라서 비동기 처리를 활용하면 장기 실행 작업이 메인 스레드를 차단하지 않도록 하여 사용자 응답 시간을 줄이고 시스템 자원을 효율적으로 사용할 수 있도록 구현했다. 비동기 처리를 위한 AsyncConfig 클래스비동기 처리를 위한 설정 클래스를 작성한다. AsyncConfig 클래스는 Spring의 비동기 기능을 활성화하고, ThreadPoolTaskExecutor를 설정하여 비동기 작업을 처리할 때 사용할 스레드 풀을 구성한다.@Configuration@EnableAsyncpublic class..
이번 글에서는 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 ..
Immutable 객체란 무엇인가?자바에서 객체가 Immutable이라는 것은 해당 객체가 생성된 후 그 상태가 변하지 않는다는 것을 의미한다. 즉, 객체의 상태(데이터)를 변경할 수 없다는 것이다. 이는 데이터의 무결성을 유지하고, 멀티스레딩 환경에서의 동기화 문제를 해결하는데 도움이 된다고 한다. Immutable 객체의 이점1. 데이터 무결성 보장: Immutable 객체는 생성 후 상태가 변경되지 않으므로, 예기치 않은 side effect로부터 데이터를 보호할 수 있다.2. 스레드 안전: 여러 스레드에서 동시에 해당 객체를 참조해도 객체가 변경될 수 없으므로 동기화를 신경 쓸 필요가 없다.3. 캐싱과 재사용 용이: Immutable 객체는 그 자체로 고유한 식별자 역할을 할 수 있으며, 캐시에 ..
애플은 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; //..
최근 프로젝트에서 API 요청 수를 제어하기 위해 Rate Limiter를 적용하는 작업을 수행했다.이 과정에서 겪은 문제점과 해결하기 위해 학습한 내용을 정리해보고자 한다. * 업무 환경은 Laravel 프레임워크를 쓰고 있기 때문에, 지금 설명하려는 Spring에서의 Rate Limiter 구현과는 적용 알고리즘 정도의 차이가 있다.Problem1. 사용자 계정별 글 작성 수 제한 정책 추가사용자마다 시간 당 글 작성 수를 제한해야 하는 기획팀의 요구사항이 있었다. (아래처럼 자동화 공격이나 도배성 뻘글 방지 목적도 있었다.) 2. AI 이미지 생성 API 다중 호출 시 서버 과부하로 인한 타임아웃 이슈현재 운용 중인 단일 AI서버에서 이미지를 하나 생성하는데는 약 5~6초가 걸린다. 다수의 AI 이..
Situation맡고 있는 앱 내 기능 중, 텍스트를 입력하면 AI이미지로 출력해주는 기능이 있다. 이때, 사용자가 비속어 등의 특정 단어를 쓸 경우 선정적이거나 폭력적인 이미지가 나올 수 있어, 입력값에 비속어가 있는지 판별해 필터링하는 로직을 구현해야 했다. 기획팀에게 받은 단어는 약 2500개였고, 받은 데이터들을 어디에 저장하는게 좋을지 고민을 하게 되었다.그래서 생각한 것이 로컬 파일, db, redis서버 이었다. 그 중에서도 캐싱 및 공유 데이터 관리가 가장 용이하다고 들은 redis를 통해 데이터를 저장해보고자 했다.지금까지 redis서버를 한번도 구축해본 적이 없었고, 사실 redis에 대한 개념도 제대로 잡혀 있지 않았다. 그래서 먼저 redis가 무엇인지부터 알아보았다. 결론적으로는 ..
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(..