목록com (286)
celina의 이것저것
이번엔 추가 및 개선할 점- 사용가능한 LLM모델 API 반환- 사용자가 동적으로 모델을 선택할 수 있는 기능- 실시간 처리 - 코드 리팩토링 1. 사용 가능한 LLM 모델 API 반환요청메시지는 없고, 응답메시지만 있다.{ "object": "list", "data": [ { "id": "qwen3", "object": "model", "created": 1686935002, "owned_by": "ollama" }, { "id": "gpt-3.5-turbo", "object": "model", "created": 1687882411, "owned_by": "openai" } ]} 2. 사용자가 동적으로..
이번주는 Spring AI에 대해 배웠다.이를 활용하여 Spring AI와 Ollama를 활용하여 OpenAI 호환 API를 설계 및 개발하였다. 1. Spring AI와 LLM을 사용하면 AI 서비스를 개발할 수 있다. 하지만 프론트엔드가 없다. 2. Open WEB UI라는 오픈소스를 이용하면, 프론트엔드 웹단을 구성할 수 있다.3. 하지만, AI 관련 오픈소스는 OpenAI의 API를 표준으로 사용하고 있다.(Open WEB UI는 OpenAI의 형식만 지원한다) 그래서, OpenAI 호환 API를 중간에 만들어서, Open WEB UI(프론트엔드)와 Spring AI+Ollama(백엔드)를 연결하려고 한다. 0. 기능 요구사항질의문에 대한 응답 생성 API지원하는 LLM 목록 제공 API이렇..
이제 조금 더 자세하게 에러를 핸들링 하고자한다.현재 코드를 보자CustomException은 이 클래스 하나이고, 모든 도메인이 동일하게 하나를 사용하고 있다. @Getterpublic class CustomException extends RuntimeException { private final ErrorCode errorCode; public CustomException(ErrorCode errorCode) { super(errorCode.getMessage()); this.errorCode = errorCode; } public CustomException(ErrorCode errorCode, String message) { super(message); this.err..
기존에 내 프로젝트에는 에러 처리를 이렇게 하고 있다.예를 들어... 회원이 상품을 주문하는데, 존재하지 않는 회원이 상품을 주문한다고 해보자.당연히 오류가 나고, 404결과를 클라이언트에게 넘겨주면서, 내가 커스텀한 코드인 1001번과 함께 response응답을 한다.내가 이걸 만들면서 했던 생각은 다음과 같다.당연히 이런경우는 성공적인 경우가 아니다. 그러므로 200대가 아닌 400대 에러를 내려줘야한다.추가로 우리가 커스텀한 코드를 함께 응답으로 내려주면 되겠다!USER_NOT_FOUND(404, 1001, "존재하지 않는 회원입니다.") 하지만 실제 현업에서는 이런 방식을 사용하지 않는다고 한다.이유: 404는 요청한 엔드포인트 자체가 존재하지 않을 때 사용하는 상태코드 이기 때문이다어라라? 이 ..
현재 대세는 JPA라고는 하지만, 여전히 MyBatis가 쓰이는 곳도 많고, MyBatis도 쓸줄 알아야향후 JPA도 잘 이해할 수 있을 것같아서 v1은 MyBatis로 진행하였다. MyBatis를 사용하여 개발하는 방법은 두 가지 방식이 있다.1. Controller -> Service -> Mapper -> DB2. Controller -> Service -> Repository -> Mapper -> DB 1. Controller -> Service -> Mapper -> DB: Service에서 Mapper를 직접 주입받아 사용한다. @Service public class UserService { private final UserMapper userMapper; // Mapper 직접 ..
🤔 왜 예외 처리가 중요한가? API를 개발하다 보면 다양한 예외 상황이 발생한다 - 존재하지 않는 사용자 조회 - 이미 등록된 이메일로 회원가입 시도 - 재고가 부족한 상품 주문 - 잘못된 입력값 전달등등... 이런 예외들을 일관성 없이 처리하면 클라이언트는 각기 다른 형식의 에러 메시지를 받게 되어 처리가 어려워진다.또한 개발을 할 때는 이런 예외적인 부분을 잘 다루는것이 개발하는것만큼이나 중요한것 같다. 이번 프로젝트에서 구현한 예외 처리 구조는 다음과 같다. 1. ErrorCode (Enum) - 에러 코드 정의 2. CustomException - 커스텀 예외 클래스 3. GlobalExceptionHandler - 전역 예외 처리 1단계: ErrorCode Enum 정의도메인..
user엔티티를 만들면서...레포지토리와 서비스 코드를 작성하고 테스트 코드를 작성하려다가 이런 생각이 들었다. 레포지토리 테스트에는 뭘 작성해야하고 서비스 테스트에는 뭘 작성해야할까? 바로 찾아보자레포지토리 테스트는 실제 데이터베이스와의 상호작용을 검증하는 데 초점을 맞추고, 서비스 테스트는 서비스 로직이 올바르게 동작하는지 확인하는 데 중점 Repository Test실제 데이터베이스와의 상호작용을 검증하기 때문에 단위 테스트(Unit Test)에 가까운 성격을 가진다.리포지토리는 데이터베이스와 직접 상호작용하는 부분으로, CRUD 작업이 제대로 수행되는지를 테스트한다. 쿼리가 올바르게 동작하는지, 데이터가 올바르게 저장되고 조회되는지를 확인하는 데 초점을 맞춥니다. Repository Test의..
이커머스 쇼핑몰 개인 프로젝트를 만들며 도메인 코드를 작성하였다.프로젝트 도메인 패키지의 구조는 다음과 같고, 유저, 상품, 주문으로 크게 나누어서 엔티티 코드를 작성하였다. Entity는 DB 테이블 매핑용이고, 비즈니스 로직은 서비스에 작성하려고 하였다.하지만 해당 방법을 사용하면 문제가 생긴다. 1. 비즈니스 로직의 중복주문 취소 로직이 필요한 곳이 중복된다.// OrderServicepublic void cancelOrder(...) { // 검증 + 상태변경 + 재고복구}// AdminOrderService public void adminCancelOrder(...) { }// BatchServicepublic void cancelExpiredOrders(...) { }이렇게..