본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

웹 위젯과 Shadow DOM 이해하기 웹 위젯은 독립적인 UI 컴포넌트로, 외부 사이트에 쉽게 삽입할 수 있는 형태를 말한다. 마치 YouTube 영상을 embed하듯이, 간단한 태그 하나로 복잡한 기능을 추가할 수 있다. 요런 태그로 컴포넌트를 쉽게 삽입할 수 있다. 코드 살펴보기 1. 커스텀 엘리먼트 정의class AmericanopeopleWidget extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); // Shadow DOM 생성 }}Shadow DOM은 DOM 트리 안에 숨겨진 또 다른 DOM 트리를 만드는 기술이다. 웹 위젯에서는 다음과 같은 문제를 해결하기 위해 Shadow DOM을 사용한다. 스타일 격..
백엔드 개발자의 MCP (Model Context Protocol) 조금 아는 척 하기 본 글은 mcp architecture을 읽고, 학습한 내용을 정리한 문서입니다. 👩🏻‍🏫MCP이란?AI 애플리케이션에 외부 시스템을 연결하기 위한 오픈소스 표준이다. MCP를 사용하면, AI 애플리케이션 (Claude Desktop 등)에서 데이터소스 (로컬 파일, 데이터베이스 등), 도구 (브라우저 등) 등에 접근하여 작업을 실행할 수 있다.MCP 구성요소MCP은 Client-Server 아키텍처를 따른다. MCP 아키텍처는 크게 MCP Host, MCP Client, MCP Server으로 구성된다. 각 요소의 역할은 다음과 같다.Layer MCP 아키텍처는 크게 2가지 계층으로 나뉜다. Data Layer, Transport Layer이다. Data layerData Layer은 JSON-R..
FastMcp으로 Local MCP 개발하기 🤖 이 글은 YouTube 링크를 로컬 MP3 파일로 변환·다운로드하는 Local Mcp 연동 예제를 다룹니다.(1) Python으로 Local Mcp 구현하기준비물Python 3.10 이상 버전 🐍fastmcp를 포함한 최신 버전의 FastAPI 생태계 라이브러리들은 Python 3.10 이상을 필요로 한다. Local MCP 예제 코드requirements.txt 추가yt-dlpfastmcpfastapiuvicorn[standard]pydantichttpxsetuptoolsmusic_server.py 파일 추가from fastmcp import FastMCPfrom pathlib import Pathimport yt_dlpmcp = FastMCP("Music Server")@mcp.tooldef dow..
코루틴 이해하기 (1) Thread의 한계 이해하기Thread Blocking스레드가 아무것도 하지 못하고 사용될 수 없는 상태를 말한다.스레드는 비싼 자원이다. 이런 상황이 반복되면 애플리케이션의 성능이 크게 떨어진다.var chatgptfuture: Future executorService.submit { // 오래 걸리는 작업 // 만약 API 호출이 1분이상 소요된다면, thread는 1분간 점유된다. }var result = chatgptfuture.get()executorService.shutdown() 한계스레드는 생성 및 작업 전환 비용이 높다.스레드는 보유한 스레드풀 개수만큼 병렬로 실행할 수 있다. 멀티스레드 프로그래밍으로 스레드를 재사용하더라도, Thread Blocking 을 피하..
데이터베이스 트랜잭션과 격리수준 Transaction트랜잭션은 작업의 완전성을 보장해주는 것을 말한다.논리적인 작업 셋을 모두 완벽하게 처리한다. --> 트랜잭션의 Commit 작업을 뜻한다.처리하지 못할 경우에는 원 상태로 복구한다. --> 트랜잭션의 Rollback 작업을 뜻한다.이렇게 작업의 완전성을 보장하여, partial update 문제를 방지한다.(a) partial update 문제partial update은 작업이 일부만 적용되는 현상이다.myisam 엔진과 Innodb 엔진 사례를 통해, 트랜잭션이 적용되지 않아 "partial update" 문제가 발생하는 사례를 살펴보자. (myisam 엔진은 트랜잭션을 지원하지 않는다.)위의 그림은 PK가 중복되는 레코드를 추가하여 오류가 발생했을 때, 엔진 별로 최종 데이터 결..
VirtualThread 아는 체하기 (1) Virtual Thread이란?JDK 21에 추가된 경량 쓰레드이다. OS 쓰레드를 사용하지 않고 JVM 내부 스케줄링을 통해 쓰레드를 생성한다.수십만~수백만개의 쓰레드를 동시에 사용할 수 있다.(2) 일반 Thread이란?기존의 일반 Thread는 OS Thread를 그대로 매핑한 것이다. 이를 Platform Thread라고 한다.Java Thread는 실제로 OS Thread를 사용한 것이다. Thread를 생성할 때 커널 영역에 접근하기 위해, 시스템 콜을 해야한다. 이로 인하여 오버헤드가 발생한다.이러한 배경으로 생성 갯수가 제한적이고, 생성하고 유지하는 비용이 크다.그래서 Thread를 무한히 생성할 수 없기 때문에 Thread Pool으로 관리해왔다.미리 Thread를 만들어두고, 재..
spring boot 3.2에서 HTTP 통신하는 방법 아는 체하기 RestClientRestclient가 등장했다. https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-restclient restclient와 virtual thread 조합을 사용하면, non blocking 통신을 쉽게 구현할 수 있다.  RestClient와 ClientRequestFactoryRestClient는 HttpClient를 사용한다. 그리고 이 값은 ClientRequestFactory으로 조정할 수 있다.ClientRequestFactory와 관련 클라이언트 정보는 다음과 같다. FactoryClient JdkClientHttpRequestFactoryJava’s HttpClient H..
[Spring] 유틸리티 클래스에 빈 생성자를 만들어야하는 이유 public final class AmericanoUtils { public static boolean isEmpty(String source) { return source == null || source.length() == 0; } } 위와 같은 유틸리티 클래스를 만들면, 소나큐브에서 "add a private constructor to hide the implicit public one" 워닝이 뜬다. 유틸리티 클래스에는 기본 생성자가 만들어져있어야하기 때문이다. 유틸리티 클래스에 왜 기본 생성자를 만들어야할까? 컴파일러는 생성자 코드가 없으면, 자동으로 기본 생성자를 생성한다. new AmericanoUtils(); 이 경우, 예상치 못한 방식대로 코드가 구현될 수 있다. 그래서 소나큐브는 기본..