[학교명 입력]
[입학] – [졸업]전자공학 전공 · 졸업
전자공학 전공 · 졸업
신용정보(CB) 플랫폼 ├─ CB 특화·배치 시스템 개발 및 운영 리드 ├─ 마이데이터 API │ ├─ AML │ ├─ 부동산 · 대부업 │ └─ 공공 마이데이터 ├─ 보이스피싱 방지 서비스 └─ KISA 전자유통허브 연계 API
Java / Spring Boot / REST API / Batch / OAuth 2.0 (마이데이터)
Java / Spring / REST API
공공 · 기업 시스템 ├─ KISA smartG2B · 보호나라 · ePrivacy ├─ KAIT 전자계약 ├─ 타타대우 TOSS └─ 멀티캠퍼스
Java / Spring Framework / Frontend
Java / Spring / FIDO
[발급기관]
DDD 애그리거트, 포트와 어댑터, 애플리케이션 컴포넌트, ArchUnit 아키텍처 검증, Instancio 테스트 픽스처
Eureka, Spring Cloud Gateway, Config·Bus, FeignClient, Kafka Connect, Resilience4J, Zipkin, Micrometer
Docker, EKS, Ingress, Route53·HTTPS, GitHub Actions CI/CD, HPA·Cluster Autoscaler, ArgoCD, Prometheus·Grafana
Spring AI ChatClient, RAG·pgvector, RAG 평가, Tool Calling·MCP, Dify 연동, 가드레일, 멀티모달
Observation API, Actuator 메트릭, Prometheus·Grafana 토큰 비용 대시보드
클러스터 구조, 컨슈머 그룹, key 기반 순서 보장, offset 수동 커밋
공통 인터페이스, 쿼리 메서드, 페이징, 확장 기능
자료구조별 활용, 동시성 이슈와 캐싱 처리
스레드 생명주기, 메모리 가시성, 동기화, 락, 스레드 풀과 Executor
대칭·비대칭 암호, 해시, 전자서명, 인증서와 TLS 핸드셰이크
검증, 예외 처리, 파일 업로드, 자동 구성 원리
회원, 강사, 강의, 수강, 커리큘럼 다섯 개 도메인을 가진 강의 플랫폼입니다. 도메인 모델 패턴과 헥사고날 아키텍처를 적용해, 비즈니스 규칙이 프레임워크와 인프라에 의존하지 않도록 설계했습니다.
splearn
├─ domain 애그리거트, 값 객체, 도메인 규칙
├─ application
│ ├─ provided 인바운드 포트 (MemberRegister, CourseFinder …)
│ ├─ required 아웃바운드 포트 (MemberRepository, EmailSender …)
│ └─ service 애플리케이션 컴포넌트
└─ adapter
├─ webapi REST API, ProblemDetail 예외 처리
├─ persistence JPA 매핑 (도메인과 분리)
└─ security 회원 인증 어댑터
비밀번호 해싱과 인증을 아웃바운드 포트로 분리해 도메인이 보안 구현을 모르게 했습니다.
계층과 애플리케이션 컴포넌트 간 의존 방향을 테스트로 고정해 구조가 무너지지 않게 했습니다.
엔티티 클래스에서 매핑 정보를 떼어내 도메인 코드를 순수하게 유지했습니다.
Instancio로 랜덤 데이터를 생성해 테스트가 특정 값에 기대지 않도록 했습니다.
커리큘럼과 강의 컴포넌트가 서로를 참조하는 양방향 의존이 생겼습니다. 커리큘럼 쪽에 필요한 기능만 담은 포트를 정의하고 강의 컴포넌트가 이를 구현하도록 의존을 역전(DIP)해 순환을 끊었고, ArchUnit 슬라이스 테스트로 재발을 막았습니다.
사용자, 상품, 주문 서비스를 분리한 쇼핑몰 백엔드입니다. API Gateway에서 JWT 인증을 처리하고, 서비스 간 데이터는 Kafka로 동기화합니다.
Client
└─ API Gateway ── AuthorizationHeaderFilter (JWT 검증)
├─ User Service Spring Security, BCrypt, JWT 발급
├─ Catalog Service ◀── Kafka ── 재고 차감 이벤트
└─ Order Service ── Kafka Producer ──▶ Sink Connect ─▶ DB
Discovery: Eureka · Config: Spring Cloud Config + Bus(RabbitMQ)
Tracing: Zipkin · Metrics: Micrometer → Prometheus → Grafana
로그인 시 JWT를 발급하고, Gateway 필터에서 토큰을 검증해 각 서비스가 인증 로직을 중복 구현하지 않게 했습니다.
Config 서버로 설정을 모으고 비대칭키로 민감 값을 암호화했으며, Bus로 무중단 갱신했습니다.
Resilience4J CircuitBreaker로 주문 조회 실패가 사용자 서비스 전체 장애로 번지지 않게 했습니다.
Zipkin으로 요청 하나가 여러 서비스를 거치는 경로와 지연 구간을 추적했습니다.
주문 서비스를 여러 인스턴스로 늘리자 각 인스턴스의 DB에 주문이 흩어지는 동기화 문제가 생겼습니다. 주문 이벤트를 Kafka 토픽으로 발행하고 Sink Connector가 단일 DB에 적재하도록 바꿔 인스턴스 수와 무관하게 데이터 일관성을 확보했습니다.
Spring Boot 서비스와 MSA 모듈을 AWS EKS에 배포하고, 코드 푸시부터 배포·확장·모니터링까지 자동화한 운영 환경입니다.
git push
└─ GitHub Actions ── Gradle build ─▶ Docker image ─▶ Container Registry
└─ manifest 갱신 ─▶ ArgoCD sync ─▶ EKS
EKS
├─ Ingress (ALB) + Route53 + HTTPS 인증서
├─ Deployment / Service / ReplicaSet
├─ HPA (Pod 자동 확장) + Cluster Autoscaler (노드 확장)
└─ Prometheus + Grafana 대시보드
GitHub Actions로 빌드와 이미지 푸시를 자동화하고 ArgoCD로 선언형 배포를 구성했습니다.
트래픽에 따라 HPA가 Pod를, Cluster Autoscaler가 노드를 늘리도록 IAM 권한까지 설정했습니다.
Route53 도메인과 인증서를 Ingress에 연결해 외부 트래픽을 HTTPS로 받았습니다.
API Gateway와 각 서비스 모듈을 EKS에 올려 서비스 간 통신을 클러스터 안에서 처리했습니다.
사내 문서를 벡터 DB에 적재하고, 질문에 근거 문서와 함께 답하는 RAG 기반 Q&A 서비스입니다. 응답 품질 평가와 토큰 비용 모니터링까지 운영 관점으로 구성했습니다.
적재 흐름
문서 ─ DocumentReader ─ Chunking ─ Embedding ─▶ pgvector
질의 흐름
질문 ─ 가드레일(입력) ─ 하이브리드 검색 ─ QuestionAnswerAdvisor
─ LLM ─ 가드레일(출력) ─ 근거 포함 응답
└─ Tool Calling: DB 조회 · MCP 서버
관측
Spring AI Observation ─ Actuator ─ Prometheus ─ Grafana (토큰·지연·오류)
청킹 크기와 검색 파라미터를 튜닝하고 하이브리드 검색을 적용해 답변의 근거 정확도를 높였습니다.
Spring AI Evaluator로 평가셋을 단위 테스트처럼 돌려 개선 전후를 리포트로 비교했습니다.
입력 검사, 프롬프트 제약, 출력 검사로 프롬프트 인젝션과 부적절한 응답을 막았습니다.
Spring AI와 Dify를 연동하고, 한쪽 장애 시 대화 연속성을 유지한 채 다른 쪽으로 넘기게 했습니다.
검색 결과 수(topK)를 4에서 20으로 늘리자 컨텍스트가 커지며 요청당 토큰 비용이 급증했습니다. Actuator 메트릭으로 토큰 사용량을 Grafana에 시각화해 원인을 바로 확인했고, topK를 되돌리는 대신 검색 품질 튜닝으로 정확도를 확보하는 방향으로 조정했습니다.
LLM을 백엔드 서비스에 안전하게 붙이는 방법에 관심이 많습니다. 로컬 LLM(Ollama)을 Docker로 띄워 비용 없이 실험하고, 반복되는 일은 작은 도구로 자동화합니다. 최근에는 Spotify 플레이리스트 갱신 결과를 Slack으로 알려주는 개인 도구를 만들었습니다.