전체 글 34

AWS 볼트

최근 이직한 스타트업에서 데이터 백업을 어떻게 하면 더 안전하게 관리할 수 있을지에 대한 논의가 있었다. 다른 기업들이 랜섬웨어 공격을 받았다는 소식을 보면서, 우리 서비스의 데이터 보관 체계를 한 단계 강화해보자는 취지였다.이전 회사에서는 보안팀이나 데브옵스, 데이터팀이 이런 영역을 전담했기에 깊이 관여할 기회가 없었는데, 스타트업에 와서 인프라의 안전성을 직접 고민하고 설계해볼 수 있게 된 점은 엔지니어로서 꽤 즐거운 경험이었다.그렇다면 우리가 대비해야 할 최악의 시나리오, 즉 클라우드의 Root 유저 권한이 탈취당하는 상황이 발생한다면 과연 어떻게 백업 데이터를 지켜낼 수 있을까? 기존의 벡업 시스템현재 우리 인프라는 Amazon Machine Image(AMI)와 EBS 스냅샷을 활용해서 백업을 ..

백엔드/Cloud 2026.09.06

AI Agent 메모리

이전 포스트에서 AI Agent의 구성요소 중 하나가 메모리라고 얘기를 했었습니다. 그럼 이 메모리는 왜 중요할까요? 우리가 흔히 접하는 전통적인 LLM이나 AI 모델은 기본적으로 Stateless 방식으로 동작합니다. 즉, 각 질문과 요청을 완전히 독립적인 작업으로 취급하죠. 방금 전에 나눈 대화라 할지라도 세션이 끊기거나 맥락이 넘어가면 모든 것을 잊어버립니다. 하지만 진정한 AI Agent는 질의응답만이 아니라, 워크플로우를 디자인해서 주어진 목표를 자동으로 수행하는 시스템입니다. 이러한 에이전트가 제대로 작동하려면 피드백 루프를 돌고, 지식 베이스를 활용하며, 과거의 상호작용을 통해 스스로를 개선해나가야 합니다. 즉, AI가 맥락을 유지하고, 시간에 따른 패턴을 인식하며, 과거의 경험을 바탕으로 ..

AI 2026.08.30

에이전트(Agent)에 관하여

컴퓨터 공학을 배우면 코딩하는 법보다는 컴퓨터가 어떻게 작동하고 만들어져 왔는지 배웁니다. 그리고 인공지능을 배운다고 하면, Machine Learning, Deep Learning 등을 배울 때 모델, 수학 공식 등을 배웁니다. 그런데 Agentic Coding을 사용하는 우리는 Agent에 대해서 제대로 알고 쓰는 걸까요? 그래서 오늘은 Agent에 대해서 좀 더 깊게 알아볼까 합니다. 에이전트 (Agent)란?IBM 공식문서에서 정의한 바에 따르면 "가용가능한 도구(Available tools)와 함께 워크 플로우(workflow)를 디자인해서, 주어진 과제들을 자동으로 수행하는 시스템"이라고 합니다. 여기서 도구는 최신 정보를 얻거나 과제를 수행할 때 사용되는 것들을 얘기하는데요. 예를 들어서, ..

AI 2026.08.16

형 변환(Type Conversion, Type Casting) 근데 자바(Java)를 곁들인

최근에 알고리즘 문제 관련 코드 리뷰를 받았다. 자바 라이브러리의 Math.pow()를 써서 지수(Exponent) 연산을 구현했는데, 처리하려는 변수의 원시 타입(Primitive Type)은 정수(Integer)였다. 피드백의 요지는 Math.pow()가 double을 반환하기 때문에 불필요한 type conversion을 강제한다는 점이었다. 따라서 정수(Integer) 연산만 전용으로 처리하는 함수를 만들어 쓰라는 권장이었다. Math.pow()가 double을 리턴한다는 사실은 알고 있었지만, 단순 형 변환(Type Conversion)을 유발하는 오버헤드는 그리 크지 않을 거라 생각했었다. 과연 그럴까?형 변환(Type Conversion, Type Casting)이란?한국어로는 Type Co..

백엔드/Java 2026.08.09

Controller Layer에 관하여

개발 업무를 시작하고 나서, Controller - Service - Repository로 이어지는 아키텍처를 많이 봤다. 그중 Controller의 역할은 단순하게 Input을 받고/정제하고 Service 레이어에 보내주고 관련 Output을 받는 걸로 이해를 했다. 하지만 Controller를 그렇게 사용하지 않고 다른 용도를 포함해서 쓰는 코드를 본적이 있다. Controller Layer는 어떻게 정의하는게 좋을까? MVC 패턴대표적인 디자인 아키텍처인 MVC(Model - View - Controller)를 살펴보자. 먼저 Model의 대한 역할은 애플리케이션의 Business 로직과 Data 구조에 대해 관리한다. 예를 들어, 쇼핑몰에서 유저가 결제를 하게 되면 관련 Business 로직과 데..

백엔드 2026.08.02

[데이터 중심 애플리케이션 설계] 확장성과 부하

시스템 디자인에서 확장성은 "증가한 부하에 대처하는 시스템 능력을" 설명하는 데 사용하는 용어라고 한다. 그럼 확장성을 고려한 설계는 다양한 부하(load)를 고민해 보는 설계가 필요하다. 그럼 이 부하는 어떻게 표현할까? 부하 매개변수와 측정 방법부하는 부하 매개변수(load parameter)라고 부르는 몇 개의 숫자로 나타낼 수 있는데, 이러한 부하 매개변수에 대한 선택은 시스템 디자인에 따라 달라진다고 한다. 예를 들어, 웹 서버의 초당 요청 수, 데이터베이스의 읽기 대 쓰기 비율, 대화방의 동시 활성 사용자, 캐시 적중률 등이 될 수 있다. 그럼 부하가 생겼을 때, 시스템의 성능을 어떻게 검증할 수 있는 지도 알아봐야한다. 온라인 시스템에서 대표적인 부하 관련 지표로는 응답 시간(response..

서로소 집합 자료 구조 (Union-Find Data Structure)

지난주 Leetcode Daily Problem의 테마는 Disjoint Set을 사용하는 문제가 많이 나왔었다. 그래서 이번에 개념을 확실히 정리해두려고 . Disjoint Set두 개의 겹치치 않는 집합(Set) 이 있다. 이런 집합을 Disjoint set이라고 부른다. 즉 공통 원소(Common Element)가 존재하지 않는 부분 집합(Subset)의 집합을 말한다. 그리고 Disjoint Set을 표현하기 가장 좋은 자료구조 중 하나가 Union-Find 자료구조다. Union-Find그럼 Union-Find 자료구조는 어떻게 Disjoint Set을 표현할까요? 제일 먼저 Union-Find는 보통 Tree 방식으로 표현이 됩니다. 그리고 세 가지 연산을 이용해서 Disjoint Set을 만..

Algorithm 2026.07.19

[Docker] 컨테이너와 이미지

개발을 하다보면 도커를 직·간접적으로 자주 사용할 일이 많았다. 이미 구축된 파이프라인에 코드를 푸시해 빌드할 때나, 로컬 환경을 프로덕션 환경과 똑같이 세팅하는 등 다양한 용도로 도커를 썼다. 예전에 도커에 대해 잠깐 공부 했을 때 '격리된 환경을 만들어서 버전 관리를 쉽게 해준다'는 것만 알고 있었지 어떤 원리로 작동 되는지는 잘 몰랐다. 그래서 이번 기회에 한 번 공부해봤다. 컨테이너 (Container)컨테이너에 대해 이해 하려면 리눅스 커널이 가지고 있는 격리 기능들에 대해서 먼저 살펴봐야 한다. 결국 컨테이너는 이 격리 기능들을 기반으로 만들어진 공간이기 때문이다. 대표적인 격리 기능은 Namespaces와 Control Groups (cgroups)가 있다.Namespaces: 각 시스템의 ..

백엔드 2026.07.12

DB 격리 수준(Isolation Level): Read Committed

DB 격리 수준(Isolation Level)은 크게 4가지로 나뉩니다. 오늘은 그중 하나인 "Read Committed"에 대해서 알아볼까 합니다. Multithreading많은 데이터베이스가 멀티스레딩 기반으로 이루어져있습니다. 아마 2026년 기준으로 PostgreSQL은 싱글 스레드로 알고 있지만, 유명한 DB 시스템인 MySQL, MS SQL, Oracle 등 멀티스레드 기반으로 만들어졌습니다. 그 말은 즉 Race Condtion이 발생할 수 있는 환경에 놓여있다는 거죠. Race Condition 종류와 SolutionDirty WritesDirty Writes는 아직 Commit 되지 않은 데이터에 쓰기(Write)을 하려고 할 때 발생합니다. 예를 들어서 Transaction A와 Tr..

자료구조 최적화: 해시맵과 배열

알고리즘 해답 중에 해시맵을 배열로 속도가 빨라지는 경우가 있어서, 그 부분을 기록으로 남길까 합니다. 왜 배열로 바꿨을 때 빨라질까?배열이나 해시맵이나 원소(Element)에 접근할 때의 시간 복잡도는 O(1)로 같습니다. 하지만 해시맵은 내부적으로 해시 함수를 거쳐야 하는 등 여러 오버헤드가 발생하기 때문에, 실제 연산 속도는 배열이 훨씬 빠릅니다.두 구조의 내부 접근 순서를 비교해 보면 다음과 같습니다.배열: Arr[Index] => 인덱스를 통한 메모리 주소 접근 => 원소 반환해시맵: Map.get(key) => 해시 함수(Hash Function) 연산 => 해시 값을 버킷 인덱스로 변환 => 해당 버킷 접근 => Collision 있을 시 연결 리스트나 트리 탐색 및 Key 동등성 비교 =>..

Algorithm 2026.06.08