| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- sql #부트캠프 #내일배움캠프 #웹관리자 #도전 #학습
- html #css #부트스트랩 #웹사이트 #개발 #초보 #til #내일배움캠프 #스파르타코딩클럽
- sql #내일배움캠프 #스파르타코딩클럽
- java
- java #문법
- Today
- Total
목록TIL (33)
Hyeok의 웹 개발 블로그
1️⃣개요사용자의 자연어 요청을 단순 키워드가 아닌 의미 기반으로 분석하고, 이에 가장 적절한 강의를 추천하는 시스템이를 위해 OpenAi의 임베딩 모델을 사용해 강의 콘텐츠와 사용자 입력을 벡터로 변환하고, VecotorStore(PGVector)를 이용해 이 벡터 간의 유사도를 계산하여 가장 유사한 강의를 빠르게 찾는다.이 시스템은 정확한 추천뿐만 아니라, 사용자의 재질문이나 조건 변경에도 유연하게 대응할 수 있는 구조를 갖추고 있다.프로젝트 초기에는 벡터 저장 방식을 SimpleVectorStore를 사용했습니다. 하지만 프로젝트를 진행하며 PgVectorStore 로 변경하여 구현하였습니다.2️⃣기술 도입 배경🔹 임베딩의 필요성컴퓨터가 이해할 수 있도록 텍스트를 수치화강의 설명을 벡터로 변환해서..
✔️ 샷 기반 프롬프팅?- 'Shot' 은 프롬프터에 포함된 예시의 수를 나타낸다. - Zero-Shot Prompting : 예시가 제공되지 않으며, 모델은 사전 훈련된 지식에 전적으로 의존해야 한다.- One-Shot Prompting : 모델의 작업을 명확히 하기 위해 단일 예를 제공한다.- Few-Shot Prompting : 두 개 이상의 예가 포함되어 있어 모델이 패턴을 인식하고 더 정확한 응답을 제공할 수 있다.✔️ Zero-Shot Prompting- 제로샷 프롬프팅 은 가장 간단한 형태의 프롬프팅- 모델에 예시나 데모를 제공하지 않고 작업을 수행하라는 직접적인 지시를 내린다.- 즉, 모델은 사전 훈련된 지식에 전적으로 의존하여 작업 완료 방법을 파악해야한다. Prompt“문장의 감정을 분..
✅ 임베딩텍스트(문자)를 숫자 벡터로 변환하는 작업숫자로 변환된 벡터를 벡터 DB에 저장되어 나중에 유사한 질문 검색(RAG)등에 사용OpenAI의 대표 임베딩 모델 → text-embedding-ada-002✅ Spring OpenAI 임베딩Spring AI는 OpenAI의 텍스트 입베딩 모델 지원OpenAI의 텍스트 임베딩은 텍스트 문자열의 연관성을 측정임베딩은 부동 소수점 숫자로 구성된 벡터두 벡터 간의 거리로 연관성 측정 → 가까우면 연관성 높고, 멀면 연관성 낮다.✅ 필수 조건OpenAI 임베딩 모델에 엑세스 하려면 OpenAI로 API를 만들어야 한다.OpenAI API 키 페이지 에서 토큰 생성Spring AI 프로젝트는 openai.com 에서 얻은spring.ai.openai.api-ke..
✅ RAG (검색-증강 생성)RAG 란?RAG (Retrieval-Augmented Generation)는 대규모 언어 모델의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스대규모 언어 모델 LLM 은 방대한 양의 데이터를 기반으로 학습되며 수십억 개의 매개 변수를 사용하여 질문에 대한 답변, 언어 번역, 문장 완성과 같은 작업에 대한 독창적인 결과를 생성RAG는 이미 강력한 LLM의 기능을 특정 도메인이나 조직의 내부 지식 기반으로 확장하므로, 모델을 다시 교육할 필요 XLLM 결과를 개선하여 다양한 상황에서 관련성, 정확성 및 유용성을 유지하기 위한 비용 효율적인 접근 방식RAG 가 중요한 이유?LMM → 챗봇 / 자연어 처리 (..
🔎 페이지네이션(Pagination)많은 데이터를 한 번에 다 보여주면 느려지니까, 적당히 나눠서 보여주는 방법 🔎 무한스크롤(Infinite Scroll)스크롤을 내릴 때마다 자동으로 데이터를 더 보여주는 방식 🔎 커서 기반 페이지네이션(Cursor Pagination)"어디까지 봤는지 표시"해서 그 다음 데이터를 보여주는 방식 🔎 오프셋 기반페이지 번호로 데이터를 나눠 보여줌 SELECT * FROM item ORDER BY created_at DESC LIMIT 10 OFFSET 100000000;이런 쿼리는 앞에 1억 개 데이터를 먼저 읽고 그 다음 10개를 준다.→ 점점 느려진다. 커서 기반"마지막으로 본 아이디(ID)"를 기억하고, 그 다음부터 보여준다.예:1페이지: id 1~1..
✅단위 테스트작은 코드 조각을 검증빠르게 수행격리된 방식으로 처리하는 자동화된 테스트👍좋은 테스트도메인 모델 및 알고리즘 ( Entity, Utill 클래스)- 노력 대비 단위 테스트의 가치가 매우 높다.- 해당 코드가 복잡하거나 중요한 로직을 수행해서 테스트의 회귀 방지 향상- 외부 의존성이 없어서 테스트 유지비를 낮추기 때문에 저렴👎 나쁜 테스트간단한 코드 (간단한 DTO, Utill) , @Getter, @Setter, @Builder 등등- 이러한 테스트는 가치가 없어서 할 필요 X컨트롤러 - 엔드투 엔트 테스트가 적합- 단위 테스트를 적용 X 더보기좋은 단위 테스트의 4가지 특성1. 회귀 방지 -> 기능 오류를 방지2. 리팩토링 내성 -> 리팩토링을 해도 테스트가 깨지지 않음3. 빠른 피드백..
✅단방향 연관관계단방향 연관관계는 아래와 같이 연관관계에 있는 두 객체 사이에 한 방향으로의 참조가 존재하는 상태- Team -> Member- Member -> TeamTeam 입장에서는 Member 와 1:N 연관관계를 가지지만, Member 입장에서는 Team 과 N:1 연관관계이고 어떤 방향이든 두 객체 사이의 한 방향의 참조만 존재한다면 모두 단방향 연관관계라 할 수 있다.✔ @OneToOne@OneToOne 연관관계는 두 테이블 / 객체가 1:1 연관관계일 때 사용- 1:1연관관계에 있는 객체간 참조 방향을 어떻게할지 잘 결정해야함.- 물리적으로 분리되어야하는 테이블인지 고민 (데이터의 생명주기 혹은 사용 패턴을 토대로 고민 가능)✔ @ManyToOne테이블상의 외래키 위치와 객체상의 참조 위..
✅영속성이란?영속성( 永(길게) 續(속하다) - Persistence)이란, 프로그램이 종료된 이후에도 데이터가 사라지지 않고 저장되는 성질을 말합니다.즉, 메모리(휘발성 공간)가 아닌 디스크(비휘발성 저장소)에 데이터를 영구히 보존하겠다라는 강력한 의지가 나타내기 위한 것입니다. ✅JPA에서 영속성이란?JPA는 객체(Entity)와 데이터베이스 테이블(Table)간의 중간자 역할을 하며, 자바 객체를 데이터베이스에 ‘영속’시키는 과정을 관리하기 위한 라이브러리에요.한명의 유치원 선생님이 여러 유치원생을 관리하려면 유치원이라는 환경이 필요하듯 여러 객체를 관리하기 위한 환경이 바로 영속성 컨텍스트(Persistence Context) 라는 메모리 영역을 필요해요.그래서 JPA에서의 영속성은 영속성 컨텍스..
✅ 배달 기능 프로젝트 S.A 작성에 대한 피드백 - 와이어 프레임, ERD , API 명세서를 작성하여 피드백을 받아보았습니다.와이어프레임와이어프레임은 힘을 조금 빼고유스케이스 다이어그램 or 클래스 다이어그램 그려오는 거 추천(다음 팀플부터)ERD주문 테이블에 있는 중복 사용자 ID 지우기리뷰 테이블이 주문 ID만 가지고 있어도 다른 테이블 데이터를 알 수 있지만, 조회할 때 주문 데이터를 거쳐서 그 외 데이터를 조회하는 것보다 아예 다른 테이블을 필드로 가지고 있는 것도 설계상 괜찮다.특정 주문에 해당하는 리뷰가 필요하다면 주문만 가지고 있기다른 루트로도 리뷰를 조회하고 싶다면 다른 테이블을 가지고 있기조회가 대부분인 경우에는 매번 조인해서 데이터를 조회하는 게 성능에 좋지 않을 수 있어서 중복되는..
✅ 코드 개선 - Early ReturnString encodedPassword = passwordEncoder.encode(signupRequest.getPassword());UserRole userRole = UserRole.of(signupRequest.getUserRole()); if (userRepository.existsByEmail(signupRequest.getEmail())) { throw new InvalidRequestException("이미 존재하는 이메일입니다.");이렇게 되어있던 코드를 리팩토링을 통해 passwordEncoder의 encode() 동작이 불필요하게 일어나지 않게 수정했다.if (userRepository.existsByEmail(signupR..