전체 글 15

내 서비스에 MCP 적용하기

이번 주제로 MCP를 다루는 이유프로젝트 진행 중 테이블 컬럼이 추가·수정됨에 따라매번 ERD에 수동으로 동기화해야 하는 번거로움을 해결하고자 진행 MCP란?MCP는 앤트로픽에서 만든 Model Context Protocol 이다.Claude, ChatGPT 와 같은 AI 도구가 외부 시스템과 연결되어 접근하고 작업을 수행할 수 있게된다. MCP 아키텍처공식문서의 MCP 아키텍처이다.https://modelcontextprotocol.io/docs/learn/architecture#concepts-of-mcp Architecture overview - Model Context ProtocolThis overview of the Model Context Protocol (MCP) discusses its ..

백엔드 2026.03.10

코틀린 멀티 모듈 게시판 만들기 - 자바와의 차이점

들어가며실무에서 사용하는 코틀린을 경험해 보기 위해 이 프로젝트를 진행했다.코틀린 멀티 모듈 구성 방법을 다루기보다는 자바와의 차이점만 다룬다.https://github.com/rotomoo/kotlin-multi-module-board GitHub - rotomoo/kotlin-multi-module-board: 2026.02 코틀린 멀티 모듈 게시판2026.02 코틀린 멀티 모듈 게시판. Contribute to rotomoo/kotlin-multi-module-board development by creating an account on GitHub.github.com 프로젝트 구조kotlin-multi-module-board/├── api/ # API 모듈 (컨트롤러, Facad..

코틀린 2026.01.30

외부 시스템 연동 문제 고찰

이 글은 최범균 님의 '주니어 백엔드 개발자가 반드시 알아야 할 실무 지식' 책을 참고하여 작성하였다. 마이크로서비스를 도입하는 기업이 늘면서 내부 서비스 간 연동이 복잡해지고 있다. 먼저, 하나의 예시를 보자회원이 1000만명 가입된 서비스에서 회원 서버가 1개만 있다고 가정한다. 예약 서비스의 지난 10년간 예약 현황 조회 API는회원 서비스의 전체 회원 정보 조회를 호출한다. 1000만명의 데이터를 여러 예약 서비스가 호출하면서회원 서비스는 OutOfMemory가 발생하여 서버가 멈추었다. 예약 서비스의 기존 요청들은 전부 동기 호출이므로회원 서비스의 응답만 기다리다가(Blocking) 60초가 되어서 Read Timeout 을 보게되었다. 이렇듯 서버 개발에서 외부, 내부 시스템 연동은우리 시스..

백엔드 2025.12.29

코틀린을 사용하는 이유

Kotlin은 왜 만들어졌는가?젯브레인은 스프링 개발자가 자주 사용하는 인텔리제이를 만든 회사이다.젯브레인은 기존의 자바가 가진 생산성 한계를 극복하기 위해 코틀린 프로그래밍 언어를 만들었다. 자바가 가진 생산성 한계가 무엇일까?예시를 통해 알아보자. 백준 1157 문제이다.자바코드import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOException;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader..

코틀린 2025.12.19

도메인 주도 설계 분석

이 글은 최범균 님의 '도메인 주도 개발 시작하기' 책을 참고하여 작성하였다.먼저 구현, 개발보다는 도메인 주도 설계에 대한 개념을 우선적으로 다룬다. 현재 회사에서 새로운 프로젝트의 분석 단계를 마치고 설계에 진입했다.기존에는 요구사항 분석 이후 설계 단계에서 도메인 모델과 테이블 구조(ERD)를 설계하는 과정으로 인식했다. 그러나 기존의 데이터 중심(ERD) 설계 방식으로는 복잡한 도메인 정책과 규칙을 효과적으로 관리하기 어렵다고 판단되었다. 이에 따라 팀 내부에서 도메인 주도 설계(DDD) 도입이 논의되었는데,도메인 주도 설계가 어떻게 복잡한 비즈니스 문제를 해결하고 유지보수 가능한 구조를 만들어 주는지 분석해보자. 도메인도메인이 무엇일까?소프트웨어로 해결하고자 하는 문제 영역이다. ex) 온라인..

백엔드 2025.11.07

Spring Boot Redis Replication

현재 내 서비스에서는 레디스를 세션 저장소(session store)로 사용하고있다.그리고 단일 인스턴스로 사용하고있다. 만약 실제 운영 상황에서 레디스 인스턴스에 문제가 생기면 무슨일이 일어날까? 예시 상황레디스에는 {keyTest: valueTest} 데이터만 저장되어있다. @RestController@RequestMapping("/v1/private/api/redis/test")@RequiredArgsConstructor@Slf4jpublic class RedisTestController { private final RedisTemplate redisTemplate; @GetMapping("/read/{key}") public ResponseEntity getKeyValue(@Pat..

백엔드 2025.05.25

실시간 통신 기술

Polling다른 프로그램의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때, 데이터 처리 하는 방식을 말한다.당연히 주기가 짧을수록 요청은 많아지기 때문에 답해줄 메시지가 없는 경우에도 서버 자원이 불필요하게 낭비되는 문제가 있다.다음은 클라이언트에서 서버에 새 메시지가 있는지 5초 주기로 요청하는 client polling 예시이다.// 5초마다 서버에 요청setInterval(async () => { const response = await fetch('/api/new-messages'); const messages = await response.json();}, 5000); 클라이언트가 계속 요청을 하기 때문에 클라이언트가 많아지면 그만큼 서버의 자원도 더 필요해진다.새로운 메시지가 없더라..

백엔드 2024.12.09

캐싱 전략

캐싱은 성능 향상, DB 트래픽 부하 감소 이로인한 비용 절감등의 이유로 많은 시스템에서 사용된다.어떠한 전략을 선택하느냐에 따라 데이터 정합성 문제, 조회 성능이 달라질 수 있기 때문에 전략을 고려해야한다.캐시 읽기 전략Cache-Aside캐시를 옆에 두고 필요할 때만 데이터를 캐시에 로드하는 전략이다.초기 조회 시 DB에서 데이터를 호출 해야 하므로 단건 호출 빈도가 높은 서비스보다는 반복적으로 데이터를 조회하는 서비스에 적합하다.Look Aside, Lazy Loading 전략이라고도 불린다.가장 일반적으로 사용되는 캐싱 접근 방식이다.Memcached 와 Redis가 널리 사용된다.캐시에 붙어있던 connection이 많다면, 캐시가 다운된 순간 많은 요청이 DB로 몰려서 부하가 발생한다.웹 서버..

백엔드 2024.11.11

데이터베이스 설계 / 정규화(1NF, 2NF, 3NF, BCNF)

데이터 베이스 정규화를 시작하기 전에 정규화의 정의 먼저 살펴보자.위키백과에 정의된 정규화의 정의이다. 말이 어렵다. 왜 중복을 최소화 해야되는지 예시로 알아보도록 하자. order 테이블과 user 테이블에 동일한 사용자 정보가 중복 저장한된 경우이다. 이때 회원이 개명을 해서 userName 데이터를 수정한다고 해보자. user 테이블의 userName을 변경했다. 이때 order 테이블의 userName도 당연히 변경되어야한다. order 테이블의 모든 주문에서 해당 사용자의 이름을 수정한다. 근데 하나를 놓쳤다고 가정하자. 각각의 주문에 다른 이름이 저장되어 버렸다. Order 테이블 기준에서는 데이터가 정확하지 않다. 이를 데이터 무결성 이라 한다. 그리고 User 테이블과 Order 테이블..

백엔드 2024.09.24

Redis 캐시 적용 해보기

조회 API Redis 캐싱빈번하게 요청되는 조회 API에 Redis를 활용하여 캐싱을 적용해보자. 캐싱 구조 흐름Spring 애플리케이션:클라이언트 요청이 들어오면 먼저 캐시에서 데이터를 확인하기 위해 Redis로 요청을 보낸다.Redis:Redis는 메모리 기반으로 작동하며, 자주 사용되는 데이터를 캐시로 저장한다.만약 Redis에 요청된 데이터가 있다면, Spring 애플리케이션은 MySQL에 접근하지 않고 Redis에서 데이터를 바로 가져온다.Redis에 해당 데이터가 없으면, MySQL로 요청이 전달된다.MySQL:MySQL은 디스크 기반 데이터베이스로, Spring 애플리케이션이 필요로 하는 데이터를 제공한다.이 데이터는 Redis에 저장되어, 이후 동일한 요청이 들어왔을 때는 MySQL을 거..

백엔드 2024.09.11

체크 예외와 언체크 예외, 낙관적락이 롤백되는 이유

체크 예외와 언체크 예외의 중요한 차이 중 하나는 트랜잭션 롤백 여부이다.https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/rolling-back.html Rolling Back a Declarative Transaction :: Spring FrameworkYou must carefully consider how specific a pattern is and whether to include package information (which isn’t mandatory). For example, "Exception" will match nearly anything and will probably hid..

백엔드 2024.09.11

Mybatis 동작 원리

추후 레거시 시스템 개선, 마이그레이션을 위해 Mybatis Legacy 프로젝트를 경험해보자.세팅, 동작 원리가 더 중요하다 생각되어 사용 방법은 생략한다. Mybatis 세팅 주의할점plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6'}스프링 부트 3.3.2 버전에서 오류가 발생했다.Invalid bean definition with name 'userProfileMapper' defined in file 생략 'factoryBeanObjectType': java.lang.String상위 버전에서는 스프링 컨테이너에 빈 주입이 실패한다.plug..

백엔드 2024.08.28

SHA-256 핵심, 요약, java 구현, 결론

SHA256은 미국 국가안보국(NSA)에서 설계한 해시 함수이다.NIST(National Institute of Standards and Technology)에서 관리하는 FIPS (Federal Information Processing Standards) 180-4 문서에 정의되어 있다.https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf굳이 해당 내용을 다 알고있을 필요는 없다.복잡한 해시 알고리즘을 통해 해싱 한다는것만 가져가면 된다.SHA-256은 SHA-2 계열에 속한다.SHA-3 계열은 SHA-2에 비해 더 강력한 보안을 제공하기 위해 개발되었지만, 오랜 기간 동안 널리 사용되면서 안정성과 보안이 검증되었기 때문에 대부분의 시스템에서 SHA..

백엔드 2024.08.28

Patch 메서드가 멱등이 아닌 이유

HTTP 메서드 스펙을 보면 PATCH는 멱등성을 보장하지않다고 나와있다.보통 데이터 수정에 PUT, PATCH가 많이 사용된다.여기서 PUT은 데이터 로우를 완전히 교체하기때문에 멱등성이 보장된다.하지만 PATCH는 멱등성이 보장이 되는 설계도, 안되는 설계도 가능하다.먼저, 멱등성이 보장된 설계이다.PATCH - api.ex.com/users/1{ "name" : "홍길동"}이번에는 멱등성이 보장되지 않는 설계이다.PATCH - api.ex.com/users/1/add/point{ "addPoint" : 10}수정 메서드는 보통 엔티티 필드를 더티체킹으로 변경하는 방식으로 많이 사용된다.실제 코드는 이러할것이다.public void addPoint(int Point) { this.point += po..

백엔드 2024.04.29

Stack을 Deque로 사용하자!

왜 Stack을 deque로 사용할까?Stack class는 vector class를 상속 받는다.Vector를 상속받은 Stack은 3가지의 단점이 있다.중간에 데이터를 삽입하거나 삭제 할 수 있기 때문에 stack class의 가장 중요한 후입선출(LIFO)원칙이 깨지는 문제가 발생한다.초기 용량을 설정할 수 있는 생성자가 없기 때문에 데이터의 삽입이 많아지면 배열을 복사해야 하는 일이 빈번하게 발생해 성능이 느려진다.pop, peek, search 등 각 메서드에 synchronized 키워드가 붙기 때문에 Thread-safe 하게 되고, Single-Thread 환경에서 모든 작업에 lock을 걸어 많은 오버헤드가 발생되어 성능이 느려진다.빨간박스를 해석해보면 '보다 완전하고 일관된 스택 작업은..

백엔드 2022.10.25