일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- oauth
- 우아한테크코스
- concurrency limit
- TypeORM
- NestJS
- 프리코스
- redis
- 타입스크립트
- Dev-Matching
- AWS
- 모던 자바스크립트
- Deep Dive
- 유효시간 설정 url
- 딥다이브
- 프로그래머스
- 파일 url
- invalid_grant
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
- 프론트엔드
- 음악 url 파일 다운로드
- 검색
- api 비동기처리
- 스프링부트
- bucket4j
- 우아한 테크코스
- 자바스크립트
- 프론트엔드 과제
- api 요청 수 제한
- this
- compateto
- Today
- Total
목록웹/Spring (10)
개발 알다가도 모르겠네요
![](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/dIxr5L/btsG483BGra/rpvZBYW1vjF9dersUZtRa1/img.png)
애플은 2019년 애플 로그인 기능을 발표한 동시에, App Store에 등록할 때 소셜 로그인이 하나라도 있다면 애플 로그인이 필수로 제공되어야 한다는 심사정책을 내놓았다. 5월에 MVP 출시 예정인 앱에는 소셜로그인 기능이 들어가기 때문에 애플로그인을 필수로 적용시켜야 하는 상황이었다. 문제는 애플로그인이 다른 소셜로그인들과 동작방식이 좀 다르다는 점이다. 애플의 경우에는 아래처럼1. 서버 내부에서 별도로 client_secret라는 값을 생성해준 뒤에2. 애플서버에 여러 설정정보를 함께 전달해줘야 한다.3. 여기서 끝이 아니라 애플서버로부터 전달받은 id_token 값을 파싱해야 비로소 이메일과 같은 사용자 정보를 얻을 수 있었다. 여러 레퍼런스를 살펴보니까, Identity Token값을 활용해서..
![](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/T4Qao/btrZ8NA5hE2/07i8kO0CrnGKPevaMfgt81/img.png)
servlet-context.xml Spring설정 중 InternalResourseViewResolver를 이용해 View Page를 지정. InternalResourseViewResolver는 Controller에서 return된 ModelAndView 객체에서 선언된 View Page를 지정해주는 클래스. 이 클래스를 편리하게 사용하도록 Prefix(접두어), Suffix(접미어) 사용. 접두어로 /WEB-INF/views/를 붙이고 접미어로 .jsp를 붙여 해당 위치에 있는 jsp 호출. 결론 Controller에서 /hello를 return하게 되면 /WEB-INF/views/hello.jsp를 호출.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cTwq9U/btrmeamEiyF/RUxPklCFIGZjDbi4m922t1/img.png)
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부릅니다. 일반적인 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성하고 조작하는 작업 (객체를 직접 생성하여 메소드 호출)을 했습니다. 즉, 모든 작업을 사용자가 제어하는 구조였습니다. 예를 들어 A 객체에서 B 객체에 있는 메소드를 사용하고 싶으면, B 객체를 직접 A 객체 내에서 생성하고 메소드를 호출합니다. 하지만 IOC(제어의 역전) 가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡깁니다. 이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 됩니다. 즉, 사용자의 제어권을 다른 주체에게 넘기는게 되는 것입니다. Class를 생성하고 new를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bY1gE0/btrjKNgiak0/oPfvTveB94lsGdJD5KpPJK/img.png)
클라이언트로부터 요청이 들어오면 Controller가 요청을 받게 된다. service -> DAO 호출 후, 그 결과를 Model에 저장하게 된다. Model을 View에 전달하게 되고 View는 Model를 렌더링해 동적인 페이지로 클라이언트의 요청에 응답하게 된다. –Model •애플리케이션 데이터를 캡슐화하며 일반적으로 POJO로 구성됩니다. – View •모델 데이터 렌더링을 담당하고 일반적으로 HTML 출력을 생성합니다. –Controller •사용자 요청을 처리하고 적절한 모델을 구축하고 렌더링을 위해 뷰에 전달합니다. •Dispatcher servlet –프론트 컨트롤러 역할 – 애플리케이션에 들어오는 모든 요청을 가로채서 핸들러(즉, 컨트롤러)에 요청을 전달합니다. – 요청을 처리하기 위..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bk4UML/btre5vxX7Mz/uCs8AL1e7027hGX8RdHOfK/img.jpg)
프레임워크란? 프레임워크는 '구조 품질' 을 보장합니다. SW 구조 그리고 기반되는 클래스를 제공합니다. 라이브러리 vs 프레임워크 제어의 역전 (Inversion of Control) 라이브러리 클래스의 집합으로, 코드의 재사용성을 지원(ex.math) 제어의 주체는 개발자: 코드에서 라이브러리 함수를 호출. 프레임워크 제어의 주체는 프레임워크: 프레임워크에서 우리의 코드를 호출(제어의 역전) 프레임워크에서 기본적인 골격을 잡아놓았기 때문에 우리는 제어의 흐름에 맞게 코드를 작성해 두면 프레임워크에서 호출. 따라서 프레임워크는 애플리케이션 구조 및 코드의 상당 부분을 제공. 개발자는 애플리케이션의 핵심 로직에 집중 가능. 스프링이란? 자바 애플리케이션을 개발하는데 필요한 하부구조(infrastructu..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/DUeG0/btrdEjmUQJk/vwLriTB47oSm3KskdlRNf1/img.png)
웹의 동작 원리 웹은 기본적으로 클라이언트/서버 방식으로 동작합니다. 요청과 응답으로 이루어지며 요청은 클라이언트에서 서버로 정보를 요구하기 위해 보내는 메시지입니다. 이 요청방식에는 GET방식과 POST 방식이 있습니다. 응답은 HTTP에서 요구된 메시지에 대한 응답, HTML, 이미지 등이 내용이 됩니다. 대표적인 웹 서버로는 아파치(Apache), IIS(Internet Information Server) 등이 있습니다. Static Pages vs Dynamic Pages 정적 웹 페이지 컴퓨터에서 저장된 텍스트 파일을 그대로 보는 것 HTML(HyperText Markup Language), image, video 등의 정적인 콘텐츠 동적 웹 페이지 저장된 내용을 다른 변수로 가공 처리하여 보는..