일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Deep Dive
- concurrency limit
- bucket4j
- 검색
- 프론트엔드
- 파일 url
- 우아한 테크코스
- TypeORM
- 프론트엔드 과제
- 프리코스
- Dev-Matching
- this
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
- 자바스크립트
- api 요청 수 제한
- oauth
- 타입스크립트
- 우아한테크코스
- 프로그래머스
- 음악 url 파일 다운로드
- 딥다이브
- invalid_grant
- api 비동기처리
- 유효시간 설정 url
- redis
- AWS
- compateto
- 스프링부트
- 모던 자바스크립트
- NestJS
- Today
- Total
목록웹 (68)
개발 알다가도 모르겠네요

배경인생네컷에는 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 이..
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(..

OAuth란? 사용자가 비밀번호를 제공하지 않고 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준. 구현 권장 방식 기본 네이티브 앱 서비스 클라이언트에서 인가 코드 및 토큰 발급 모두 처리 Redirect 방식 웹 서비스 클라이언트에서 소셜 로그인 요청 시, 인가 코드가 발급되어 서비스 서버의 Redirect URI로 전달됨. 서비스 서버에서 인가 코드로 토큰 발급을 요청해야 함. REST API 시퀀스 다이어그램 (PC 및 모바일 웹 환경 권장) 네이티브 시퀀스 1. 클라이언트에서 SNS 서버로 로그인 요청 2. SNS 서버로부터 access token 받음 3. 서버에 access token 전달 4. 서버에서 전..
Original import CatModule from '../../cat/cat.module.ts' Alias Path import CatModule from '@/cat/cat.module.ts' tsconfig.json "paths": { "@/*": ["./src/*"], "@boards/*": ["./src/boards/*"], "@configs/*": ["./src/configs/*"] }, Jest Unit 테스트를 위한 설정 package.json (jest config 설정) "moduleNameMapper": { "^@/(.*)$": "/$1", "^@boards/(.*)$": "/boards/$1" } jest-e2e.json (Jest End-to-End 테스트 설정) { ... "..