개발자취 147

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 옵시디언, mysql, 파일시스템 (1)

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

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..

ElasticSearch 클러스터 노드 용량 불균형 문제 해결

개요실무에서 온프레미스로 ElasticSearch Cluster를 운영하고 있는데, 총 8개의 데이터 노드 중 특정 노드에만 디스크 사용량이 집중되는 현상이 발생하였다. 운영 중인 ElasticSearch 클러스터는 공식 가이드에 따라 샤드 1개당 30~50GB로 설정하였으며, 인덱스마다 2~3개의 샤드를 사용 중이다. 현재 문제는 각 인덱스마다 2~3개의 샤드와 레플리카가 설정되어 있으므로, 총 4~6개의 샤드가 서로 다른 노드에 분산되어 저장된다. 그러나 여러 인덱스의 샤드 할당이 특정 노드에서 겹칠 경우, 해당 노드에 데이터가 집중되는 현상이 발생할 수 있다. 결국, 이러한 불균형을 방지하기 위해 클러스터 차원에서 샤드가 어느 노드에 할당될지 결정하는 설정이 필요하며, ElasticSearch는 이..

주니어 서버 개발자의 2024 회고

어김없이 돌아온 2024 회고...이번 회고는 키워드로 정리해보려고 한다. 특별한 이유는 없고, 가독성이 좋을 것 같다는 느낌이 있다.도전이번 연도는 유난히 힘들었다. 부족함을 채워야겠다며 공부에 힘썼던 작년과 달리, 올해는 도전을 많이 했고, 성공의 문턱에서 넘어지는 일이 꽤 많았다. 그런데 아이러니하게도, 이 또한 공부가 되었다. 특히 여러 과제를 하면서 대용량 시스템 설계에 대해 깊이 고민하게 되었고, 정말 많은 것을 배웠다. 아! 성공한 도전도 있다. 상반기에 쿠버네티스 관련 자격증 CKA를 취득했다.쿠버네티스 자격증평소 인프라에 관심이 많았고, 사내에서 사용하는 인프라 아키텍처가 비효율적이라고 생각했다. 물론 게임 도메인의 특성상 서비스 중단 시 타격이 크기 때문에 인프라를 여유 있게 운영하는 ..

생각생각생각 2025.05.08

서버개발자로서 살아남기 - JPA 사용시 조회방법에 따른 영속성 여부

개요스터디에서 Spring-JPA 환경에서, 쿼리메소드와 @Query 어노테이션을 이용한 JPQL, 네이티브 쿼리을 활용한 조회에 대해 이야기를 하다가, 3개의 조회방법 중 어떤 방법이 영속될까 라는 궁금증이 생겼다.위에서 언급했던 3가지 조회 방법에 대해 영속성 여부을 알아보기로 한다쿼리메서드Query 어노테이션을 활용한 JPQLQuery 어노테이션을 활용한 네이티브 쿼리 테스트관련 내용을 리서치해보는 것도 좋지만, 일단 아묻따 테스트코드를 작성해서 영속성 여부를 확인하였다.사용할 테이블은 회원 정보가 있는 테이블이고, Pk는 memberId이다. 세팅@Autowired private MemberRepository memberRepository; @Autowired private EntityMan..

개발자가 반드시 알아야하는 데이터베이스 - MYSQL(InnoDB)에서 잠금된 데이터을 조회할 수 있는 이유

개요최근 mysql의 잠금에 대한 이슈를 많이 다루고 있는데, s-lock, x-lock된 데이터에 대해 단순 조회가 어떻게 가능할까 라는 생각이 들었다. 일차원적으로 당연히 lock이 되었으니, 읽기가 안되는 것이 아닌가? 라고 생각할 수 있지만, mysq은 비잠금읽기(Consistent NonLocking Reads)로 동작하여, 잠금된 데이터도 조회가 가능하다. 비잠금읽기에 대해 자세히 알아보자.여담으로 mysql 8.0 책을 제대로 읽었다면, 해당 질문에 대한 답을 쉽게 할 수 있을 것이다.(위 생각에 대해 구글링 중 undo를 보자마자 아맞다! 싶었다..)비잠금읽기비잠금읽기mysql(InnoDB)는 기본적으로 비잠금 읽기(Consistent Nonlocking Reads)을 사용한다. 이는 se..

JAVA - Synchronized와 ThreadLocal 을 이용한 동시성 문제 해결

개요static와 synchronized의 연관관계에 대해 한번 정리를 해보려고 한다. 일단 JAVA에서 static은 클래스가 로딩될 때 메모리의 정적 영역(Static Area)에 할당된다.이 영역은 특징은 다음과 같다.JVM이 시작될 때 생성되며, 프로그램의 실행이 끝날 때까지 유지된다.클래스의 모든 인스턴스가 공유하는 공통된 값은 가진다.즉 멀티스레딩 환경에서 주의하여 사용해야한다.테스트아래 예시는 주의하지 않고 사용한 코드이다.public class A { public static int a; public static void plus() { a++; } }public class ATest { @Test public void testP..

728x90