이 글은 AI, RAG에 대해 기술적으로 전혀 모르는 상황에서 인앱 AI를 도입하기 위한 기본 개념을 정리합니다. 이 개념을 이해한 후에, 아래 Spring AI 실습 글을 보시길 바랍니다.(이 글에서 Spring AI는 직접적으로 다루진 않습니다.)[Spring] - [Spring] Spring AI + RAG 임베디드 AI 구축 방법 [Spring] Spring AI + RAG 임베디드 AI 구축 방법시작하기 전에, 이 글은 개념 정리는 없는 실습 글입니다.RAG 및 AI 개념에 대해 정리한 글이 있으니, 참고하세요.[Spring AI] Spring Boot에 LLM을 도입하기 전 꼭 알아야 할 RAG 개념 정리 [Spring AI] Spring Boinnovation123.tistory.com 인..
시작하기 전에, 이 글은 개념 정리는 없는 실습 글입니다.RAG 및 AI 개념에 대해 정리한 글이 있으니, 참고하세요.[Spring AI] Spring Boot에 LLM을 도입하기 전 꼭 알아야 할 RAG 개념 정리 [Spring AI] Spring Boot에 LLM을 도입하기 전 꼭 알아야 할 RAG 개념 정리이 글은 AI, RAG에 대해 기술적으로 전혀 모르는 상황에서 인앱 AI를 도입하기 위한 기본 개념을 정리합니다. 이 개념을 이해한 후에, 아래 Spring AI 실습 글을 보시길 바랍니다.(이 글에서 Spring AI는innovation123.tistory.com 특정 도메인의 정보를 LLM이 읽어서 챗봇처럼 대답해 주기 위한 기본 흐름은 아래와 같다.특정 도메인을 임베딩 하여 vector DB..
@Transactional 전파 수준이란?Spring에서는 @Transactional을 통해 트랜잭션을 선언적으로 쉽게 관리한다.대부분의 경우 기본 전파 수준인 REQUIRED만으로도 충분하지만, 하나의 서비스 메서드에서 또 다른 트랜잭션 메서드를 호출할 때, 전파 전략을 명확히 이해하고 설정하지 않으면 원치 않는 rollback 또는 commit이 발생할 수 있다. 트랜잭션 전파 수준은 “이미 존재하는 트랜잭션이 있는 상황에서 이 메서드를 새 트랜잭션으로 실행할 것인가, 아니면 기존 트랜잭션에 참여할 것인가”를 결정하는 설정하는 것이다. 트랜잭션 전파가 중요한 상황들주문 entity 저장 진행 중, 로그테이블에 기록해야 됨. -> 로그 저장 중 에러 발생한다고 비즈니스 로직을 롤백하면 안 됨서비스 내의..
@RequestBody Json 데이터 바인딩Frontend에서 Http Body에 Json 데이터를 담아서 보내면, Spring Boot Controller의 @RequestBody로 객체로 바인딩된다. 결론부터 말하자면 아래의 방법 중 하나로 바인딩 한다.기본 생성자 + Setter전체 필드 생성자 + @JsonCreator필드 직접 접근HttpMessageConverterSpring은 @RequestBody가 붙은 파라미터를 처리할 때 내부적으로 HttpMessageConverter를 사용한다.HandlerMethodArgumentResolver → RequestResponseBodyMethodProcessor → HttpMessageConverter 순으로 요청을 처리한다.JSON String은 ..
Java Stream APIJava의 Stream API는 선언적이고 간결한 방식으로 데이터 처리 로직을 구성할 수 있도록 도와주는 매우 강력한 기능이다. 하지만 Stream은 겉으로 보기엔 단순해 보여도, 내부적으로는 lazy evaluation(지연 평가) 기반의 평가 전략을 사용한다. 이 개념을 제대로 이해하지 못하면, 예상과 달리 불필요한 연산이 수행되어 성능 저하로 이어질 수 있다. 우선 lazy evaluation을 알아보기 전에, Stream 동작 순서를 예측해 보자. 테스트 환경Item을 그대로 반환하지만, sout을 찍어주는 log(Item item) 메서드로 로그를 찍어볼 것이다.@AllArgsConstructor@Getterstatic class Item{ private in..
카르케시안 곱(Cartesian Product) 란?Cartesian 곱은 2개의 테이블을 Join 할 때 모든 조합의 데이터를 생성하는 곱집합을 말한다.예를 들면 User를 참조하고 있는 Order 3개, Payment 5개가 있을 때, 총 15개의 결과가 나온다.아래(더 보기)는 카르테시안 곱을 처음 보는 분들을 위한 쿼리 예제입니다.더보기app_userSELECT * FROM app_user uwhere id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';ordersSELECT * FROM orderswhere user_id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';paymentSELECT * FROM paymentwhere user_id ..
Spring의 Cache 추상화개발을 하다 보면, 동적으로 변하진 않는데, 자주 필요한 데이터들을 조회하는 API를 호출할 일이 종종 있다. 간단한 예시로 아래와 같은 상황이 있을 수 있다.Frontend에서 select-box의 값을 채우기 위한 data List 조회외부 API에서 특정 데이터를 조회하는데, 외부 API에서 제공하는 데이터의 갱신 주기가 길 때자주 호출되는 데이터이지만, 실시간으로 변하는 값이 아닐 때Spring은 자주 호출되는 메서드의 실행 결과를 캐시에 저장하고, 이후 동일한 요청이 들어오면 캐시 된 값을 반환하여 응답 속도를 높이고 시스템 부하를 줄일 수 있도록 캐싱 기능을 추상화하여 제공한다.캐시 구현체와 무관하게 사용할 수 있도록 @Cacheable, @CacheEvict, ..
복합키(Composite key)관계형 데이터베이스에서 복합키(Composite Key)란, 두 개 이상의 컬럼을 조합하여 하나의 기본 키(Primary Key)로 사용하는 것을 의미한다. 단일 컬럼만으로는 데이터의 고유성을 보장할 수 없을 때, 여러 컬럼을 묶어 하나의 키로 사용하는 방식이다. 아래 테이블처럼, 주문번호와 상품번호 두개를 묶어야 하나의 고유한 key가 되는 경우를 말한다.이런 경우에 JPA에서 단일키를 사용할 때보다 복잡하고, 귀찮은 작업이 필요하다. 복합키가 꼭 필요하지 않다면, 단일키 전략을 사용하는 것이 낫다고 생각하지만,이미 존재하는 테이블을 엔티티 매핑 해야할 때가 있을것이다.복합키 매핑 시 특징key class에 Serializable을 구현해야된다.key class에 equ..