그로스 로그가 이제 클럽 활동을 진행해서, 저는 예승님의 핸디홈, 경보님의 도커&쿠버네티스를 신청했어요!
스터디 주차별 주제 내용을 간단히 예습해보기로 했습니다!
어떤 용어인지, 어떤 기술인지에 대한 간단한 내용을 정리해두면 얘기들을 때 이해하기 편할 거 같습니다.
우선 핸디홈 주제로 MCP 라는 내용이 많이 있었는데 MCP 란?
MCP
- Anthropic이 오픈소스로 공개
- AI 에 다양한 프로그램을 쉽게 연결해서 쓸 수 있도록 만든 표준 통신 협약
- Model Context Protocol 의 약자로 일종의 프로토콜을 의미
- 애플리케이션이 LLM에 컨텍스트를 제공하는 방법을 표준화하는 개방형 프로토콜
- AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준화된 방법을 제공
- 본질적으로 호스트 애플리케이션이 여러 서버에 연결할 수 있는 클라이언트-서버(CS) 아키텍처
즉, LLM 모델이 외부 데이터와 시스템을 원할하게 통신하고 정보를 활용할 수 있는 일종의 연결 프토로콜을 의미하는 거 같습니다.
AI모델이 다양한 데이터 소스와 연결되어 다양한 데이터 소스와 연결되어 실시간으로 정보를 주고 받을 수 있도록 설계된 프로토콜이며, 기존 AI모델이 내부적으로 훈련된 데이터만을 기반으로 작동하는 경우가 많았고, 실시간 정보 활용과 동적 컨텍스트 유지가 필수적인 환경에서 한계를 보여왔기에 MCP라는 것이 새로 나왔습니다.
MCP 특징
- 개방형 표준
- MCP는 오픈소스로 공개되어 있어 누구나 자유롭게 사용하고 개선 가능, 어떤 AI 시스템에서도 사용 가능
- 양방향 연결
- AI 모델과 데이터 소스 간의 양방향 통신을 지원, AI 모델과 데이터 소스가 지속적으로 연결된 상태에서 서로 정보를 주고 받을 수 있음
- 범용성과 표준화
- 다양한 데이터 소스와 도구를 하나의 표준 프로토콜로 연결 가능, 개발자는 각 데이터 소스마다 별도의 커넥터를 유지할 필요 없이 단일 프로토콜을 통해 연결 가능
- 보안 및 신뢰성
- 개인 정보 보호화 데이터 무결성 유지 가능
MCP 구성 요소
- MCP 호스트 : MCP를 통해 데이터에 액세스하려는 Claude Desktop, IDE 또는 AI 도구와 같은 프로그램
- MCP 클라이언트 : 서버와 1:1 연결을 유지하는 프로토콜 클라이언트
- MCP 서버 : 표준화된 모델 컨테스트 프로토콜을 통해 각각 특정 기능을 노출하는 경량 프로그램
- 로컬 데이터 소스 : MCP 서버가 안전하게 액세스 할 수 있는 컴퓨터의 파일, 데이터베이스 및 서비스
- 원격 서비스 : MCP 서버가 연결할 수 있는 인터넷(ex: API)을 통해 사용 가능한 외부 시스템
저는 Spring boot 로 백엔드 개발을 하고 있어서 Spring 과 관련된 라이브러리를 확인해보니
- spring-ai-core
- spring-ai-anthropic-spring-boot-starter
- spring-ai-mcp-client-spring-boot-starter
와 같은 MCP 를 활용한 AI 모델과 통신할 수 있는 라이브러리가 존재했습니다.
Spring Boot MCP
- 외부 AI 모델과 연결 (위 라이브러리 사용, 외부 AI모델과 연결)
- 사용자 입력을 받는 Controller 생성
- 사용자 요청
- 요청 값을 외부 연결된 AI 모델로 전달
- AI 응답을 사용자에게 전달
위와 같은 순서로 사용자에 대한 요청을 AI 모델이 대신 응답하여 전달하는 방식으로 손쉽게 AI 모델을 사용할 수 있습니다.
이제 도커&쿠버네티스 에 대해서 살펴보겠습니다.
도커란
- 리눅스 컨테이너에 리눅스 애플리케이션을 프로세스 격리기술을 이용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트
라고 내용이 나오는데, 그러면 컨테이너란건 무엇일까??
컨테이너
- 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싸고, 실해중 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증
- 가상 머신과 달리 별도의 운영체제를 요구하거나 포함하지 않고, 커널의 기능에 의존하며 리소스 격리 및 격리된 이름공간을 사용하여 운영체제에 대한 응용 프로그램의 관점을 격리 시킴
- 컨테이너를 사용해서 리소스를 격리시켜 자시만의 프로세스 ID공간, 파일 시스템 구조, 네트워크 인터페이스를 갖고서 운영 체제에 대해 거의 완전히 개인화된 관점을 가짐
- 여러 개의 컨테이너들은 동일한 커널은 공유하지만, 각 컨테이너는 CPU, 메모리, 입출력과 같이 오직 정의된 양의 리소스에만 제한을 받음
그럼 위와 같은 내용으로 보면, 도커는 컨테이너를 관리하는 프로젝트이고, 그 안에는 컨테이너 가상화라는 기술이 들어있는 것 같다.
그러면 쿠버네티스는 무엇일까??
쿠버네티스
- 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리하기 위한 컨테이너 오케스트레이션 플랫폼
- 애플리케이션을 더 쉽게 배포하고 관리할 수 있게하고, 자동 스케일링 및 장애 복구를 처리하는 등의 작업을 처리하여 시스템 안정성을 높임
그러면 쿠버네티스는 도커로 컨테이너화된 애플리케이션을 스케일 아웃이나 스케일 인을 통해 자동으로 배포하는 플랫폼으로 이해하면 될 것 같다.
그러면 도커는 이미지를 기반으로 실행되고, 이미지를 손쉽게 다운받아서 사용할 수 있는 기능을 제공한다고 봤는데, 이미지란 무엇일까??
도커 이미지
- 컨테이너를 만들기 위한 정적인 템플릿, 말 그대로 실행 가능한 앱을 만들기 위한 모든 것(앱 + 라이브러리 + OS + 설정)들이 압축된 스냅샷
- 실행 가능한 앱을 배포/공유하기 위한 템플릿, 이미지 기반으로 실행된 독립된 인스턴스가 컨테이너
- Dockerfile 로 각 명령어를 입력해서 이미지를 생성, 여러 레이어로 구성됨
이렇게 내용을 찾았는데, 이미지는 말 그대로 애플리케이션이 독립된 환경으로 실행될 수 있도록 만든 템플릿이고, 이걸 실행한게 컨테이너라고 이해를 하면 될 것 같다.
간단한게 이미지를 만드는 방법을 GPT 한테 물어봤다.
# 1단계: OpenJDK 기반 이미지 사용
FROM openjdk:17-jdk-slim
# 2단계: 작업 디렉토리 설정
WORKDIR /app
# 3단계: jar 파일 복사
COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
# 4단계: 실행 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]
위 내용처럼 여러 레이어로 구성되어 있고, 위에서부터 아래로 내려가는 형식으로 작성을 하는 것 같은데 아직은 확실히 와닿지 않아서 클럽에서 열심히 배워야겠다.