오늘은 이제 실제 코드 개발을 진행하려합니다. 가장 먼저 해보려고 하는 것은 '회원가입' 입니다.
기존 설계해둔 내용처럼 Lambda와 DynamoDB를 활용해서 진행을 해보겠습니다.
▶️ 회원가입 기능 정의
먼저 간단하게 회원가입 기능에 대해서 정의를 해보려합니다.
회원가입 기능은 다음의 간단한 동작 흐름을 가지고 있습니다.
1. 사용자가 이메일과 비밀번호를 전달
2. 해당 이메일이 이미 존재하는지 확인 (중복체크)
3. 존재하지 않으면, 비밀번호를 암호화하여 DynamoDB에 저장
▶️ 회원 테이블 설계
그럼 순차적으로 개발하기에 앞서, 테이블 스키마를 정의해보겠습니다.
DynamoDB는 NoSQL 기반의 키-값 저장소로, 테이블마다 엄격한 스키마를 정의하지 않아도 되는 구조입니다.
하지만 개발 효율성과 유지보수의 일관성을 위해 아래와 같이 필드를 정리해두고 사용했습니다.
User 테이블 스키마
PK: email (String)
├── password (String, 암호화 저장)
├── createdDt (ISO timestamp)
└── updatedDt (ISO timestamp)
▶️ 회원 가입 로직 개발
다음으로는 실제 회원가입 Handler를 개발하려하는데요.
먼저 DynamoDB 연결을 위한 Config를 만들어줍니다.
public class DynamoDbConfig {
private static final DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
.region(Region.AP_NORTHEAST_2)
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
public static DynamoDbClient getClient() {
return dynamoDbClient;
}
}
여기서 한 가지 주의해야 할 점은 credentialsProvider 부분 인데요.
Lambda에서 연결하기 위해서는 DefaultProvider 사용해야 합니다.
이제 실제 회원가입 코드를 써보겠습니다. 여기서는 SignUpHandler.java 라는 이름으로 만들어보겠습니다.
간단한 Flow만 작성을 했고, 실제 상세 코드는 생략하겠습니다.
public class SignupHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final DynamoDbClient dynamoDbClient = DynamoDbClient.create();
private static final String TABLE_NAME = "User";
@Override
public Map<String, Object> handleRequest(Map<String, Object> event, Context context) {
Map<String, String> body = parseRequest(event);
String email = body.get("email");
String rawPassword = body.get("password");
// 중복 검사
if (isEmailExists(email)) {
return error(409, "Email already exists");
}
// 암호화
String encryptedPw = PasswordUtil.encrypt(rawPassword);
// 저장
saveUser(email, encryptedPw);
return success(200, "User created");
}
}
간단하게 Email 중복검사를 마치고, Password 암호화를 진행합니다.
그리고 이를 DynamoDB의 User 테이블에 저장하는 코드입니다.
❓ 그럼 암호화는 어떻게 할까요
암호화를 위해서 일방향 암호화 기법인 BCryptPasswordEncoder를 사용했습니다.
해시된 결과는 복호화가 불가능하니 안전함은 물론, 가볍고 의존성이 적어 서버리스 환경에 적합하다고 생각을 했습니다.
간단한 설정은 아래 코드와 같습니다.
public class PasswordUtil {
private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
public static String encrypt(String plainText) {
return encoder.encode(plainText);
}
public static boolean matches(String plain, String encrypted) {
return encoder.matches(plain, encrypted);
}
}
▶️ 배포 & 테스트
지난 글에서 serverless Framework를 통한 배포에 대해서 정리했었죠.
그래서 위와 같이 개발이 완료되면 쉽고 빠르게 배포가 가능하고, Postman을 통한 API 테스트 또한 매우 편리하게 가능해졌습니다.
이번 글에서는 DynamoDB 연동과 더불어 회원가입 API를 구현했습니다.
단순히 데이터 저장만이 아니라, 중복 체크 → 암호화 → 저장이라는 실제 서비스에서 자주 쓰이는 흐름을 구성했습니다.
다음 글에서는 로그인 및 로그아웃 기능 구현과 함께 각 token을 어떻게 관리할 지에 대해 작성을 해볼 예정입니다.
감사합니다.
'Backend Engineering' 카테고리의 다른 글
[Serverless 서비스 개발] #5. Token Refresh (4) | 2025.06.23 |
---|---|
[Serverless 서비스 개발] #4. 로그인/로그아웃 기능 구현 (2) | 2025.06.22 |
[Serverless 서비스 개발] #2. serverless Framework로 Lambda 배포하기 (2) | 2025.06.19 |
[Serverless 서비스 개발] #1. 시스템 설계 (1) | 2025.06.18 |
[Cache] Local Cache vs Redis, 언제 어떤 캐시를 써야 할까? (1) | 2025.06.16 |