이 글은 데이터베이스를 API 만드는 방법에 대해 정리한 글입니다.
앞선 글에서는 회원정보 데이터베이스를 생성했었다.
[Backend][Spring Boot] JPA(Java Persistence API)와 회원정보 데이터베이스
[Backend][Spring Boot] JPA(Java Persistence API)와 회원정보 데이터베이스
이 글은 회원정보 데이터베이스와 API를 설계하는 방법에 대해 정리한 글입니다.JPA (Java Persistence API)이 글에서 하고자 하는 핵심 작업은 "자바 클래스를 만들어서 데이터베이스 테이블로 변신시
devkuk.tistory.com
이렇게 만든 데이터베이스를 이제 실제 로그인 혹은 회원가입에 사용할 수 있도록 API로 만드는 작업을 진행해보고자 한다.
데이터베이스가 어떻게 생겼는지 궁금하다면, 이전 글을 참고하길 바란다.
회원정보 데이터베이스를 API 만들기
DTO (Data Transfer Object)
🤔 DTO가 뭔가요?
DTO는 쉽게 말해 데이터를 나르는 전용 상자의 역할을 하는 객체이다.
이미 앞서서 만들어둔 엔티티(데이터베이스의 테이블)는 데이터베이스와 1:1로 연결된 중요한 원본 문서이다. 원본 문서를 그대로 외부(프론트엔드 or 클라이언트)에 노출하거나 직접 입력을 받는 것은 보안상 좋지 않다.
👉 따라서! 필요한 기능에 딱 맞는 데이터만 담는 상자를 따로 만들어서 사용하게 되고, 이걸 바로 DTO라고 한다!
회원가입용 DTO 만들기
회원가입에는 Member 엔티티에 있는 정보들 중에서 id는 제외하고 받아야 한다. 가입 당시에 필요한 정보들로는 이름, 나이, 성별, 아이디, 비밀번호 등이 존재하지만, id의 경우 데이터베이스가 자동으로 번호를 부여하는(Auto Increment) 값이기 때문에 사용자가 컨트롤할 필요가 전혀 없다.
com.devkuk.backend 안에 dto라는 새로운 패키지를 생성하고, dto 패키지 안에 MemberSignupRequest.java 파일을 생성해 아래와 같이 코드를 작성했다.
package com.devkuk.backend.dto;
import com.devkuk.backend.constant.Gender;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class MemberSignupRequest {
private String userId;
private String userPw;
private String email;
private String name;
private Short age;
private Gender gender; // JSON으로 "MALE"이라고 보내면 자동으로 Enum으로 변환
private String phoneNumber;
}
DTO는 POJO(Plain Old Java Object)라고 부르는 순수한 자바 객체이기 때문에 별도의 어노테이션(ex. @Entity)이 필요 없다. 정말 가볍게 데이터를 나르는 목적만을 추구하는 객체다.
Service
Service는 DTO를 받아서 내용을 확인하고, 문제가 없다면 실제 원본 문서(Entity)로 만들고 레포지토리로 옮겨주는 역할을 수행한다. 실제 필요한 복잡한 일들은 모두 Service가 처리한다고 보면 된다.
Service를 만들기 위해 com.devkuk.backend 안에 service 패키지를 생성하고, 그 안에 MemberService.java 클래스를 만들었다.
package com.devkuk.backend.service;
import com.devkuk.backend.dto.MemberSignupRequest;
import com.devkuk.backend.entity.Member;
import com.devkuk.backend.repository.MemberRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor // 필수 인자를 자동으로 생성
public class MemberService {
private final MemberRepository memberRepository;
// 회원가입 로직
@Transactional // 도중에 에러가 발생하면 없던 일로 돌리기 (안전장치)
public Long join(MemberSignupRequest dto) {
// DTO -> Entity로 변환
Member member = new Member();
member.setUserId(dto.getUserId());
member.setUserPw(dto.getUserPw());
member.setName(dto.getName());
member.setEmail(dto.getEmail());
member.setAge(dto.getAge());
member.setGender(dto.getGender());
member.setPhoneNumber(dto.getPhoneNumber());
// 레포지토리에 저장
memberRepository.save(member);
return member.getId();
}
}
@RequiredArgsConstructor: 필수 인자를 받는 생성자(Constructor)를 자동으로 만들어 주는 어노테이션 (Lombok)
스프링(Spring)에는 생성자가 딱 하나 있으면 생성자의 파라미터에 들어갈 알맞은 인자를 찾아서 자동으로 넣어주는 기능이 있는데, 이를 의존성 주입(Dependency Injection, DI)라고 한다.
Controller
Controller는 외부(웹 브라우저, 앱, 포스트맨 등)에서 들어오는 요청을 받아서 필요한 DTO를 제공하고, Service로 안내하는 역할을 수행한다.
Controller는 com.devkuk.backend 안에 controller 패키지를 만들고, 그 안에 MemberController.java를 생성해서 코드를 작성하였다.
package com.devkuk.backend.controller;
import com.devkuk.backend.dto.MemberSignupRequest;
import com.devkuk.backend.service.MemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // 웹 요청을 처리하는 컨트롤러
@RequestMapping("/api/members") // 컨트롤러의 기본 주소
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
// 회원가입 요청 받기 (POST)
// 최종 주소: POST http://localhost:8080/api/members/signup
@PostMapping("/signup")
public String signup(@RequestBody MemberSignupRequest request) {
// @RequestBody: JSON 데이터를 DTO로 변환 (필수!!)
memberService.join(request);
return "회원 가입 성공!";
}
}
코드를 살펴보면, 흔히 보던 API 주소 형태가 중간 중간 보이는 것을 확인할 수 있다. Controller가 바로 API 주소를 생성하고 특정 주소로 들어오는 요청들을 누가 처리할지 연결해주는 역할을 수행한다. 이러한 매핑 역시 어노테이션을 통해 이루어지게 된다.
회원가입 테스트
정상적으로 API가 동작하는지 확인하기 위해 프로젝트 루트 폴더(backend/)에 test.http 파일을 생성하고, 아래와 같이 코드를 작성하였다.
### 회원가입 테스트
POST http://localhost:8080/api/members/signup
Content-Type: application/json
{
"userId": "raspberry",
"userPw": "pi1234",
"email": "pi@test.com",
"name": "라즈베리",
"age": 20,
"gender": "FEMALE",
"phoneNumber": "01099998888"
}
POST ...: 이 주소로 POST 요청 보내기Content-Type: application.json: 데이터의 형식 안내 (JSON 데이터){ ... }: 실제 DTO에 담길 데이터
실행하면 아래와 같이 정상적으로 데이터가 보내진 것을 확인할 수 있다!

'🖥️ Dev > Backend' 카테고리의 다른 글
| [Backend][Spring Boot] JPA(Java Persistence API)와 회원정보 데이터베이스 (0) | 2026.01.27 |
|---|---|
| [Backend][Spring Boot] Spring Boot하다가 다시 정리하는 Java 기초: 접근 제어자, static, Annotation (0) | 2026.01.26 |
since 2025.01.27. ~ 개발자를 향해....🔥