-
[Spring AI] 서버에서 LLM 호출하기: ChatClient, Tool Calling, RAG
9주차 목요일에는 Spring AI를 배웠다. 다음 주 해커톤에서 AI 기능을 붙인 서비스를 만든다고 해서, 서버에서 LLM을 어떻게 부르는지와 Spring AI가 무엇을 대신해 주는지 정리했다.1. LLM을 쓰는 여러 방법방법예데스크톱 프로그램(GUI)ChatGPT·Claude 데스크톱 앱명령줄(CLI)터미널에서 모델 실행웹사이트브라우저에서 채팅모바일 앱휴대폰 앱IDE코드 편집기 안의 AI 도우미서버에서 API로 호출우리 서버가 HTTP 요청 본문에 프롬프트를 담아 보낸다앞의 방법들은 사람이 직접 묻고 답을 읽는다. 마지막 방법은 프로그램이 모델을 부르고, 답을 코드에서 쓴다. 그래서 API 키가 필요하고, 대화 맥락을 서버가 직접 챙겨야 하고, 답을 문자열이 아니라 정해진 구조로 받을 수 있어야 한다..
2026.10.22
-
[JPA] 영속성 컨텍스트와 엔티티 생명주기
지금까지는 JDBC로 SQL을 직접 써서 DB에 넣고 꺼냈다. 9주차에는 JPA로 넘어왔다. JPA에서 가장 헷갈리는 부분이 영속성 컨텍스트라서, 수업에서 작성한 테스트(AppTest)를 따라가며 정리했다.1. ORM과 JPAORM(Object Relational Mapping)은 자바 객체(Object)와 DB 테이블(Relation)을 연결(Mapping)해서, SQL을 직접 쓰지 않고 자바 코드로 데이터를 저장·조회하게 해 주는 방법이다.JPA(Java Persistence API)는 자바 진영 ORM의 표준 인터페이스다. 인터페이스라서 실제 일은 구현체가 하고, 가장 많이 쓰는 구현체가 Hibernate다. JPA = Hibernate는 아니다. JDBCJPASQL직접 쓴다대부분 JPA가 만든다결..
2026.10.22
-
[Java] 보일러플레이트 코드와 Lombok
9주차 JPA 실습에서 엔티티 클래스를 만들다 보면 필드마다 getter를 쓰고, 생성자를 쓰고, toString을 쓴다. 이렇게 매번 같은 모양으로 적는 코드를 보일러플레이트라고 하고, Lombok은 이걸 어노테이션 한 줄로 줄여 준다.1. 보일러플레이트 코드보일러플레이트(boilerplate) 코드는 프로그램이 돌아가려면 적어야 하지만 매번 거의 같은 모양으로 반복되는 코드다. 핵심 로직은 아니고, 언어나 프레임워크 규칙상 필요해서 쓴다.이름은 1800년대 신문 인쇄에서 왔다. 여러 지역 신문에 똑같이 실어야 하는 광고나 칼럼을 강철판으로 미리 떠서 인쇄소에 보냈는데, 이 판을 보일러 플레이트라고 불렀다.분야보일러플레이트 예HTML, , 같은 기본 뼈대Java필드마다 getter/setter, 생성..
2026.10.22
-
[Spring Boot] Controller·Service·Repository와 DTO, 입력 검증, 예외 처리
웨이팅 서버 실습은 step을 하나씩 넘길 때마다 "이대로 두면 터지는 문제"를 하나씩 고친다. step-03부터 step-06까지는 코드를 역할별로 나누고(계층), 바깥과 주고받는 데이터를 따로 두고(DTO), 잘못된 입력을 거르고(검증), 실패 응답을 한 모양으로 맞추는(예외 처리) 과정이었다. 기능은 그대로인데 구조가 바뀌는 단계라 한 글로 묶었다.1. Controller · Service · Repository계층하는 일웨이팅 서버 예시Controller요청을 받고 응답을 돌려준다. 입력값이 형식에 맞는지 거른다인원수가 음수인지, 이름이 비었는지 확인Service실제 업무 규칙(비즈니스 로직)을 처리한다매장이 접수 중인지, 인원 제한을 넘지 않는지 확인하고 웨이팅을 만든다Repository저장소에..
2026.10.22
-
[BE] 멱등성과 Idempotency-Key: 재시도해도 한 번만
9주차 첫날 웨이팅 서버 실습 step-07의 제목은 "재시도했더니 웨이팅이 두 건"이었다. 같은 주 팀 실습에서 Trade(거래) 서버를 맡으면서 같은 문제를 다시 만났다. 송금이나 결제처럼 두 번 일어나면 안 되는 요청을 서버가 어떻게 한 번만 처리하는지 정리했다.1. 무엇이 문제인가손님이 지하철에서 웨이팅 "접수" 버튼을 누른다. 요청은 서버에 닿았고 서버는 웨이팅 4번을 만들었다. 그런데 터널 구간이라 응답이 늦게 온다. 앱은 1초를 기다리다 실패로 보고 같은 요청을 다시 보낸다. 서버는 5번을 또 만든다.누가본 것손님 앱첫 시도 실패 → 재시도 성공 → "대기번호 5번"매장 태블릿4번, 5번 두 팀. 4번은 오지 않는 손님이 된다앱이 재시도하는 것은 잘못이 아니다. 네트워크는 원래 끊기고 늦는다..
2026.10.22
-
[FE] MPA vs SPA, 그리고 Next.js
MPA(Multi-Page Application)와 SPA(Single-Page Application)는 웹 페이지를 렌더링하고 탐색하는 방식에서 큰 차이를 보이며, React는 이 중 SPA 생태계를 대표하는 핵심 라이브러리다. MPA(Multi-Page Application)의 특징MPA는 사용자가 다른 링크로 이동할 때마다 서버로부터 완성된 새로운 HTML 파일을 받아와화면을 완전히 새로 렌더링하는 전통적인 웹 방식이다.페이지마다 고유한 주소와 내용이 꽉 찬 HTML을 가지고 있기 때문에 검색 엔진 최적화(SEO)에 매우 유리하다. 하지만 이동할 때마다 화면 깜빡임이 발생하고 불필요한 리소스까지 다시 로드해야 하므로,인터랙션이 많은 서비스에서는 사용자 경험(UX)이 다소 떨어질 수밖에 없다. SPA..
2026.10.22
-
[React] React 기초: JSX, useState, 가상 돔, useEffect
React는 사용자 인터페이스를 구축하기 위한 자바스크립트 라이브러리로, 현대 웹 프론트엔드 생태계의 핵심으로 자리 잡았다.React를 본격적으로 다루기 위해서는 JSX 문법, 상태 관리를 위한 useState, 그리고 가상 돔(Virtual DOM)의 동작 방식을 반드시 이해해야 한다. JSX(JavaScript XML)먼저 JSX(JavaScript XML)는 자바스크립트 코드 안에서 HTML과 유사한 마크업을 작성할 수 있게 해주는 편리한 문법 확장이다. UI 렌더링 로직과 마크업을 하나의 컴포넌트 내부에 직관적으로 배치할 수 있어 코드의 가독성과 유지보수성이 크게 향상된다. useState또한, 화면에서 동적으로 변하는 데이터를 관리하기 위해 React는 useState라는 훅(Hook)을 제..
2026.10.22
-
[JS] XHR(XMLHttpRequest)
XHR(XMLHttpRequest)은 웹 브라우저가 서버와 데이터를 주고받을 수 있게 해주는 자바스크립트의 비동기 통신 객체이다.페이지 전체를 새로고침하지 않고도 필요한 데이터만 백그라운드에서 불러오거나 전송할 수 있어서,과거 AJAX 기술의 핵심 표준으로 널리 사용되었다. XHR의 주요 특징 및 동작 방식비동기 통신 지원: 백그라운드에서 서버로 요청을 보내고 응답을 받아오므로, 사용자가 페이지를 계속 이용하는 중에도 데이터를 갱신한다.다양한 데이터 형식 수신: 이름에는 XML이 들어있지만 XML뿐만 아니라 JSON, HTML, 순수 텍스트 등 다양한 형태의 데이터를 다룬다.동작 흐름: XMLHttpRequest 객체를 생성한 후 open() 메서드로 요청 방식과 URL을 설정하고, send() 메서드..
2026.10.22
-
[JS] 콜백 함수와 콜백 패턴
콜백 함수(Callback Function)는 다른 함수의 인자(Argument)로 전달되어,특정 작업이 끝난 후나 정해진 이벤트가 발생했을 때 호출되는 함수를 말한다.즉, 제어권을 다른 함수에게 넘겨주어 "이 작업이 끝나면 전달한 함수를 실행해 줘"라고 예약해 두는 방식이다. 콜백 함수의 주요 특징비동기 통신 및 이벤트 처리: 데이터를 서버에서 가져오거나 타이머(setTimeout), 클릭 이벤트 등을 처리할 때, 메인 스레드를 멈추지 않고 작업이 끝난 시점에 콜백 함수를 실행한다.제어권의 위임: 콜백 함수를 전달받은 함수(고차 함수)가 콜백 함수의 호출 시점, 실행 문맥, 전달할 인자 등을 전적으로 결정한다.콜백 패턴(Callback Pattern)콜백 패턴은 이러한 콜백 함수를 활용하여 프로그램의 ..
2026.10.22
-
[JS] Promise와 async/await
Promise는 비동기 작업의 결과를 나타내는 객체로,.then() 메서드를 통해 다음 비동기 작업으로 체이닝(Chaining)을 할 수 있어 콜백 지옥을 평탄화(Flatten)해 준다.getUser(1) .then(user => { return getPosts(user.name); }) .then(posts => { return getComments(posts[0].id); }) .then(comments => { console.log('댓글 데이터 로드 완료:', comments); }) .catch(error => { console.error('에러 발생:', error); }); 이렇게 Promise를 사..
2026.10.22