개발자취 152

현업에서 사용되는 코틀린 정복하기 - companion object 와 @JvmStatic

개요이직 한 후, 배울께 천지 삐까리다.일단 제일 급한 건 코틀린이고, 그 다음은 리액트이다.4년전쯤 전회사의 신입으로 들어가, 모르는 부분들을 정리하여 포스팅 했던 기억이 있는데, 그때 기억을 되살려, 앞으로 자주 포스팅 할 예정이다.companion object클래스 안의 싱글턴인 네임스페이스 자바의 static 메소드와 비슷한 역할을 한다. 인스턴스 생성 없이 사용할 수 있다.class ClassName { companion object { const val property: String = "Something..." fun funName() { // ... } }}위와 같은 코드는 property와 funName을 static 하게 사용할 수 있다.@..

React - 사진 용량 가져오기 HEAD는 안되고, RANGE는 되는 이유

개요CDN에서 이미지를 가져오는 리액트를 활용한 어드민을 코파일럿과 함께 개발중이였다. 그떄, 이미지에 대한 픽셀, 사이즈를 가져오는 요구사항이 있었고, 해당 이미지의 size을 가져오기 위해 HEAD 헤더 메소드를 통해 가져오는 것을 추천하였다. 근데 0으로 가져오는 이슈가 있었다. 아래 내용을 통해 자세히 알아보자왜 HEAD에는 사이즈가 없고, Range GET에는 있나?CDN의 정책대부분 CDN/오브젝트 스토리지는 HEAD 요청에서 Content-Length를 생략하거나 0으로 넣는다. (압축/청크 전송, 헤더 정규화, 오리진에 HEAD를 안 넘기는 정책 등)반면 Range GET(206) 은 설계상 Content-Range: bytes start-end/total 를 꼭 내보내므로 총 크기(tot..

서버개발자로서 살아남기- spring json 라이브러리 어노테이션 부수기

아래와 같은 Json 관련 어노테이션이 있다.아래 어노테이션을 상세분석 해보자@JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(Include.NON_NULL) @JsonAutoDetect @JsonPropertyOrder(alphabetic = true) @JsonRootName(value = "result")Jackson 어노테이션 상세 분석@JsonIgnoreProperties(ignoreUnknown = true)@JsonIgnoreProperties(ignoreUnknown = true)목적: JSON 역직렬화 시 알 수 없는 속성을 무시동작: JSON에 클래스에 정의되지 않은 필드가 있어도 예외를 발생시키지 않고 무시예시: JSON에 "..

서버개발자로서 살아남기 - MCP 실무에서 활용하기 with spring ai (2)

MCP 서버 구현이 복잡한가?MySQL MCP 서버의 예시 코드를 보면, 구현이 매우 간단하고 직관적입니다.예시 코드 확인 (GitHub 링크)구성 요소는 다음과 같습니다:get_db_config(): DB 접속 설정list_resources(): DB 테이블 목록 조회read_resource(): 테이블 데이터 조회 (최대 100개 행, CSV 형식 반환)list_tools(): 사용 가능한 도구 정의 (여기서는 SQL 실행 도구 하나만 제공)call_tool(): 실제 도구 실행 (SQL 실행, 결과 반환)서버 실행 방식은 표준화된 입출력으로 매우 간단합니다.MCP 서버 직접 구축하기 with GIA Admin(Spring-AI)MCP 서버를 직접 구축하는 과정입니다.스프링 버전 업데이트 (3.1.6..

서버개발자로서 살아남기 - MCP 실무에서 활용하기 with 옵시디언, mysql, 파일시스템 (1)

MCP란?MCP(Model Context Protocol) 는 Anthropic이 2024년 11월 26일 공개한 개방형 표준 프로토콜입니다.대규모 언어모델(LLM)이 인터넷, 데이터베이스, 파일 시스템 등 다양한 외부 툴과 안전하고 쉽게 양방향 소통할 수 있도록 만든 규격입니다. 쉽게 말해, AI 모델이 인터넷 검색, 파일 저장, 코드 실행, 데이터베이스 작업 등 여러가지 도구(tool)를 사용할 수 있게 해주는 공통의 사용 설명서라고 생각하면 됩니다. AI 분야의 "USB-C 포트" 라고 비유될 만큼, 어떤 AI 모델이나 도구든 동일한 방식으로 연결 가능합니다.MCP 등장 배경기존 방식의 한계점이전에는 AI 모델과 외부 도구 연결 시 여러 문제가 있었습니다:특정 프레임워크(예: LangChain, L..

챌린지 배틀 회고 근데 이제 OOP와 도메인 주도 설계를 곁들인

챌린지 배틀 회고 근데 이제 OOP와 도메인 주도 설계를 곁들인1. 들어가며작년 하반기에 헥사고날 아키텍처, 클린 아키텍처, TDD 등을 공부하면서 느낀 가장 큰 깨달음은:"이 모든 것이 결국 객체지향 프로그래밍(OOP)에 기반한다" 는 사실이었습니다.기존에 데이터 중심, 절차지향 프로그래밍으로 프로젝트를 진행해오다가, 최근 챌린지 배틀 기능을 구현하면서 객체지향 관점으로 접근해보았습니다. 그 과정을 통해 느낀 점과 얻은 교훈을 공유하고자 합니다.2. 절차지향 vs. 객체지향: 이론적 특징2.1 절차지향 프로그래밍(Procedural)장점구현이 단순하고 직관적빠른 프로토타이핑 및 생산성 확보로직 흐름이 명확하게 보임단점코드 중복이 늘어나고 재사용성이 낮아짐요구사항 변경 시 유지보수 어려움복잡해질수록 가독..

개발자로서 살아남기 - 루아스크립트를 실무에서 사용한 이유

리워드 풀(Reward Pool)이란?뽑기 상품 구매 시 사용자에게 지급되는 골드 보상을 위해 미리 잡아두는 예산(풀)입니다.즉, 게임 진행 기간 동안 사용자들에게 지급할 수 있는 골드의 최대치를 통제하기 위한 장치입니다.예시리워드 풀 잔액:현재 리워드 풀에 총 1,000만 골드가 남아 있습니다.사용자가 반납한 개수에 따른 최대 당첨금:반납 100개 → 최대 당첨금: 100만 골드반납 200개 → 최대 당첨금: 500만 골드반납 500개 → 최대 당첨금: 2,000만 골드제한 조건:반납 개수에 따른 최대 당첨금을, 리워드 풀에서 차감하여 지급합니다.만약 계산된 최대 당첨금이 현재 리워드 풀 잔액보다 크다면(예: 500개 반납의 경우 2,000만 골드 > 1,000만 골드) 해당 배팅 옵션은 사용할 수 없..

개발자로서 살아남기 - JVM GC 동작 원리

아래에서는 JVM 힙(Heap) 메모리 사용량이 증가함에 따라 Minor GC(Young GC)가 발생하고, 이로 인한 CPU 사용량 상승이 이어지다가 결국 Full GC로 넘어가는 과정을 단계별로 자세히 설명하고, 이해를 돕기 위한 ASCII 그림도 함께 제시합니다.1. JVM 힙 구조 개요┌─────────────────────────────────────────────────────┐│ JVM Heap ││ ││ ┌───────────────┐ ┌───────────────┐ ││ │ Young G..

n8n 을 이용한 PR AI 코드리뷰 가이드 (with Dooray)

AI 코드리뷰 workflowWorkFlow 템플릿n8n의 가장 큰 강점은 활발한 커뮤니티입니다. 다른 사용자가 만든 자동화 Workflow를 복사해 붙여넣기만 하면 손쉽게 내 n8n 인스턴스에 가져와 활용할 수 있습니다. 이번 AI 코드 리뷰 Workflow도 아래 WorkFlow 템플릿을 참고해 구현했습니다.https://n8n.io/workflows/3804-automated-pr-code-reviews-with-github-gpt-4-and-google-sheets-best-practices/ Automated PR Code Reviews with GitHub, GPT-4, and Google Sheets Best Practices | n8n workflow templateAI-Agent Code..

docker-compose을 이용한 n8n 설치 중 Error: Command "start" not found 이슈

개요docker-compose 를 이용한 n8n 설치중 아래와 같은 에러가 발생하였다.결과적으로는 docker-compose.yml 파일에서 volume 경로 문제였다. 아래는 GPT을 활용하여, 작성하였고, 중간에 내 언어로 몇몇 바꾸었다.Error: Command "start" not found 이슈 해결 가이드목표 : Error: Command "start" not found 및Named volume ... is used ... but no declaration was found 오류를 영구적으로 해결하고,n8n 컨테이너를 named volume으로 안전하게 재배치한다.🛠️ 문제 현상n8n 컨테이너가 즉시 종료(restarting 루프)되며 Error: Command "start" not foun..

728x90