전체보기 182

Undertow란? Tomcat, Netty와 비교해 언제 쓰면 좋을까

최근에 Undertow를 다시 다뤄볼 일이 생겼는데, 예전에도 이걸 사용한 적이 있었습니다.그래서 왜 선택했는지 떠올려보면서 정리해보려고 합니다.결론부터 말하면, 빠르고 가볍고 유연해서였고, 당시엔 내부 API 서버 용도로 사용했었습니다. ▶️ Undertow란? Undertow라는 것이 익숙하지 않을 분들이 많을 것 같습니다. (저도 처음에 그랬습니다)Undertow는 Java 기반의 경량 웹 서버로, 논블로킹 비동기 IO를 지원하고, 서블릿 4.0 스펙까지 지원하는 웹 서버입니다.(https://undertow.io/)기본적으로 Netty 위에서 동작하며, Servlet Container로도 사용할 수 있고, JAX-RS, HTTP2, WebSocket 등도 잘 지원하는 꽤 다재다능한 웹 서버입니다...

Backend Engineering 2025.07.03

[Serverless 서비스 개발] #7. CloudWatch 로깅 개선과 운영 전략

오늘은 마지막으로 로깅 개선에 대한 부분을 작성 해보려고 합니다.Serverless 구조에서는 보통 AWS Lambda에서 바로 연결된 CloudWatch를 통해 로깅과 모니터링을 처리합니다. 하지만 기본 로그만으로는 운영/디버깅에 어려움이 많기 때문에 좀 더 고도화된 로깅 전략을 구성해볼 수 있습니다.그 몇가지에 대해서 정리해보겠습니다. ▶️ 일반적인 로깅 형태기존에는 보통 이런 로그를 찍었을 겁니다System.out.println("User login success: userId=abc123");문자열 로그는 누구나 보기에 괜찮고, 편하게 구현할 수 있다는 장점이 있습니다. 다만, CloudWatch에서 특정 로그를 필터링하거나 수집하려면 너무 비효율적입니다.그래서 구조화된 로그(ex. JSON)를 ..

Backend Engineering 2025.06.30

[Serverless 서비스 개발] #6. Lambda 성능 올리기

안녕하세요오늘은 지난번까지 서비스 개발을 마치고 성능 개선을 위한 몇 가지 방법을 정리해보려고 합니다. 아마 기존에도 들어보셨을거고, 이번에 Lambda를 통해 구현하면서 겪으셨던 '콜드 스타트' 문제가 있을텐데요.특히 로그인 등 인증처럼 사용자 경험에 민감한 API를 구성할 때는 이 지연이 체감되기 때문에, 반드시 최적화가 필요합니다.이번 글에서는 Lambda 환경에서 콜드 스타트가 왜 문제인지, 어떤 전략으로 개선할 수 있는지를 정리해보겠습니다. ✅ Warm Start vs Cold StartLambda는 이벤트가 발생할 때만 실행되는 함수입니다.이 함수가 이미 실행된 적이 있으면 기존 컨테이너를 재사용하게 되는데, 이를 Warm Start라고 합니다.반대로 함수가 처음 호출되거나, 일정 시간 동안 ..

Backend Engineering 2025.06.26

[Serverless 서비스 개발] #5. Token Refresh

안녕하세요 오늘은 지난 Login / Logout에 이어서 해당 JWT Token을 Refresh 하는 방법에 대해 작성해보려고 합니다. 아시다시피 JWT 기반 인증을 사용하면 accessToken은 stateless하게 동작해서 서버 부하가 적고, 속도도 빠릅니다.하지만 짧은 유효 시간 때문에 일정 시간이 지나면 다시 로그인해야 하는 번거로움이 생깁니다.이를 해결하기 위해 사용하는 것이 refreshToken입니다. ▶️ Refresh API가 필요한 이유JWT는 자체적으로 만료 시간을 가지기 때문에, accessToken은 일반적으로 15분~30분 정도로 짧게 설정합니다.(저는 지난 개발에서 15분으로 설정 했습니다.)하지만 사용자가 매 15분마다 다시 로그인한다면 UX는 매우 나빠집니다. 그래서 긴..

Backend Engineering 2025.06.23

[Serverless 서비스 개발] #4. 로그인/로그아웃 기능 구현

이번 글에서는 지난 글에 이어 로그인 / 로그아웃 기능을 구현해보겠습니다. 이전 글에서 회원가입 기능을 잘 만들었으니, 새로운 회원정보가 DynamoDB의 User Table에 잘 저장되고 있을겁니다. 로그인을 할 때 회원정보 (email 과 password) 를 확인할 것이고 일치한다면 로그인 시에는 accessToken / refreshToken을 함께 발급하고, 로그아웃 시에는 해당 refreshToken을 무효화 처리할 수 있도록 구성하려 합니다. ☑️ 로그인/로그아웃 구조 개요기본적인 흐름은 아래와 같습니다.[로그인]사용자 요청 → 이메일/비밀번호 검증 → accessToken + refreshToken 발급 → 응답[로그아웃]사용자 요청 → Authorization 헤더 파싱 → 토큰 확인 ..

Backend Engineering 2025.06.22

[Serverless 서비스 개발] #3. 회원가입 기능 구현

오늘은 이제 실제 코드 개발을 진행하려합니다. 가장 먼저 해보려고 하는 것은 '회원가입' 입니다.기존 설계해둔 내용처럼 Lambda와 DynamoDB를 활용해서 진행을 해보겠습니다.▶️ 회원가입 기능 정의먼저 간단하게 회원가입 기능에 대해서 정의를 해보려합니다.회원가입 기능은 다음의 간단한 동작 흐름을 가지고 있습니다. 1. 사용자가 이메일과 비밀번호를 전달2. 해당 이메일이 이미 존재하는지 확인 (중복체크)3. 존재하지 않으면, 비밀번호를 암호화하여 DynamoDB에 저장 ▶️ 회원 테이블 설계그럼 순차적으로 개발하기에 앞서, 테이블 스키마를 정의해보겠습니다. DynamoDB는 NoSQL 기반의 키-값 저장소로, 테이블마다 엄격한 스키마를 정의하지 않아도 되는 구조입니다.하지만 개발 효율성과 유지보수의..

Backend Engineering 2025.06.20

[Serverless 서비스 개발] #2. serverless Framework로 Lambda 배포하기

안녕하세요. 오늘은 지난 글에 이어서 serverless Framework 연동과 관련한 부분을 작성해보겠습니다.아마 이 글에 이어서는 실제 API 개발이 순차적으로 이어질 것 같습니다. ▶️ 왜 Serverless Framework를 사용할까?AWS Lambda로 인증 기능을 개발하면서 가장 먼저 맞닥뜨린 벽은 배포의 불편함이었습니다. 실제로 처음에는 별도 Framework 등의 고민 없이 직접 AWS console에서 코드를 붙여서 진행을 했는데요.함수 내 코드 하나를 바꾸는 것도 너무 번거로웠고, 무엇이 어떻게 바뀌었는데 추적하는 것도 매우 어려웠습니다. (완전 노가다...)그리고 그 외에도 버전 관리나 인프라 설정 등도 수동으로 하다 보면 실수할 여지도 많을 것 같았습니다. 그래서 어떻게 좀 더 ..

Backend Engineering 2025.06.19

[Serverless 서비스 개발] #1. 시스템 설계

안녕하세요. 최근에 인증 방식 등에 대해 정리를 해보았는데요.해당 내용을 바탕으로 간단하게 백엔드 서비스를 하나 만들어보면 좋을 것 같다고 생각이 들었습니다. 그래서 Serverless 인증 서비스 구현하기라는 작은 시리즈를 글로 정리해보려고 합니다.오늘은 그 첫 번째로 어떻게 진행할지 설계하는 내용을 정리해보겠습니다. ▶️ 왜 서버리스로 구현하나요?사이드 프로젝트 등을 진행하더라도 인증 시스템은 필수로 들어가야 합니다.하지만 EC2 환경 구성을 비롯하여 유지관리, 스케일링 등의 서버 관리를 모두 신경 쓰기 어려운 경우가 많은데요.그래서 이번에는 Serverless와 JWT를 이용해서 누구나 쉽게 개발할 수 있는 방법으로 한 번 해보고자 했습니다. 단점 또한 있지만 프로젝트 초기에 매우 유연하게 활용 가..

Backend Engineering 2025.06.18

[Cache] Local Cache vs Redis, 언제 어떤 캐시를 써야 할까?

안녕하세요.오늘은 캐시 (Cache) 에 대해 한 번 정리해보려고 합니다. 캐시는 빠르게 서비스를 만들고, 사용자 경험을 지키는 데 중요한 내용입니다.가장 많이 사용되는 Cache 중 Redis가 있는데요.보통 편하고 쉽게 성능 좋은 캐시를 쓸 수 있으니, 무조건 Redis를 쓰면 되는 것 아닌가 라는 잘못된 생각하는 경우도 있습니다. 하지만 Cache는 보통 Local Cache와 Remote Cache 가 있고,언제 어떻게 사용해야 좋을 지가 각 상호아에 따라 모두 다릅니다. 오늘은 그 성격과 특징을 정리해보겠습니다. ■ Local Cache ?LocalCache는 애플리케이션 인스턴스 안의 메모리에 데이터를 저장하는 방식입니다.이런 구조 덕분에 DB나 외부 Cache까지 갈 필요 없이, 바로 메모..

Backend Engineering 2025.06.16

JPA의 N+1 문제, 왜 생기고 어떻게 해결할까?

오늘은 JPA를 사용한다면 반드시 알아야 하고, 자주 겪을 수 있는 N+1 문제에 대해 정리해보겠습니다. ▶️ N+1 문제란?쉽게 말하면, DB에서 1번만 가져오면 될 데이터를 여러 번에 걸쳐 조회하게 되는 현상입니다. 간단한 예를 들어 게시글 10개를 가져오면서, 각 게시글의 작성자 정보도 함께 조회한다고 해보겠습니다.- 게시글 1번 조회 → 작성자 1번 조회 (10개) → 총 11번 쿼리 실행. 이게 바로 N+1 문제입니다. (N+1은 "1개의 select + N개의 연관 select"의 의미입니다.) ▶️ 왜 발생할까?JPA는 객체지향스럽게 데이터를 가져오고자 지연 로딩(LAZY)을 기본으로 합니다.즉, 연관된 엔티티는 처음에 바로 가져오지 않고, 실제로 접근할 때 추가 쿼리를 날립니다. 게시글과 ..

Database 2025.06.13