ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 시리즈 2편 – REST API 설계와 Controller 작성 가이드
    기술과 산업/언어 및 프레임워크 2025. 4. 15. 20:00
    728x90

    Spring Boot에서 REST API를 어떻게 설계하고 컨트롤러를 구성할 수 있는지 실전 예제와 함께 설명합니다. 계층 구조, JSON 응답, REST 컨벤션까지 정리했습니다.


    Spring Boot 시리즈 2편 – REST API 설계와 Controller 작성 가이드

    Spring Boot를 활용한 웹 애플리케이션 개발의 핵심은 RESTful API 설계입니다.
    이번 편에서는 실무에서 가장 많이 사용하는 REST API 구조 설계 패턴, 컨트롤러 구현 방식, 그리고 DTO 사용 전략까지 상세히 다루어 보겠습니다.


    📌 REST API란?

    REST(Representational State Transfer)는 HTTP 기반의 자원 중심 아키텍처 스타일입니다.
    Spring Boot에서는 @RestController를 통해 RESTful API를 쉽게 구현할 수 있습니다.

    키워드: Spring Boot REST API, @RestController, HTTP Method, DTO, Controller 설계


    🧱 1. 프로젝트 디렉토리 기본 구조

    Spring Boot에서 REST API를 구성할 때는 아래와 같은 구조가 가장 일반적입니다:

    src/
    └── main/
        └── java/
            └── com.example.demo/
                ├── controller/
                │   └── UserController.java
                ├── dto/
                │   └── UserDto.java
                ├── service/
                │   └── UserService.java
                ├── repository/
                │   └── UserRepository.java
                └── entity/
                    └── User.java
    

    ✅ 계층별 역할

    • Controller: HTTP 요청/응답 처리
    • Service: 비즈니스 로직 처리
    • Repository: DB 접근 (JPA/Hibernate 등)
    • DTO(Entity): 데이터 전송 객체

    🔧 2. @RestController로 API 설계하기

    @RestController
    @RequestMapping("/api/users")
    public class UserController {
    
        @GetMapping
        public List<UserDto> getAllUsers() {
            return userService.getAllUsers();
        }
    
        @PostMapping
        public ResponseEntity<UserDto> createUser(@RequestBody UserDto userDto) {
            return ResponseEntity.ok(userService.createUser(userDto));
        }
    }
    

    주요 애노테이션

    애노테이션 설명

    @RestController JSON 기반 응답 처리
    @RequestMapping 공통 URL 경로 지정
    @GetMapping, @PostMapping HTTP 메서드 매핑
    @RequestBody 요청 본문을 객체로 매핑
    @ResponseBody 자동 JSON 변환 응답

    📦 3. DTO를 활용한 클린한 데이터 설계

    **DTO(Data Transfer Object)**는 컨트롤러와 서비스 간 역할 분리보안을 위한 핵심 설계 요소입니다.

    public class UserDto {
        private String name;
        private String email;
    }
    

    엔티티(Entity) 그대로 노출하는 것이 아니라, DTO로 래핑하여 필요한 정보만 전달합니다.
    이는 계층 간 결합도를 낮추고, API 응답의 유연성을 확보할 수 있게 해줍니다.


    ⚙️ 4. 예외 처리 – 글로벌 방식 추천

    실무에서는 단순히 try-catch가 아닌, **전역 예외 처리(ControllerAdvice)**를 적용합니다.

    @RestControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(UserNotFoundException.class)
        public ResponseEntity<String> handleUserNotFound(UserNotFoundException e) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());
        }
    }
    

    ✅ REST API 설계 시 주의할 점

    항목 설명

    URL 설계 동사 대신 리소스 기반 명명 (예: /users)
    응답 포맷 JSON 기반 통일, 상태 코드 명확화
    입력 검증 @Valid, @Validated와 함께 BindingResult 사용
    Swagger 활용 API 문서 자동화 및 테스트 툴 적용 권장

    🧠 실무 인사이트

    • 컨트롤러는 "thin", 서비스는 "fat"이 원칙입니다. 컨트롤러는 로직을 담지 말고 서비스에 위임하세요.
    • DTO를 적극 활용하고, 엔티티를 직접 노출하지 마세요. 보안 문제 및 확장성 문제가 생깁니다.
    • 모든 API에는 명확한 응답 구조를 정해두고, 실패 시 예외 메시지도 표준화하세요.

    ✅ 마무리 요약

    항목 정리

    컨트롤러 구성 @RestController, @RequestMapping, @PostMapping 등
    URL 패턴 /api/리소스명 형식 권장
    DTO 전략 Entity 분리, 계층 간 전송 전용 객체
    예외 처리 @ControllerAdvice를 통한 글로벌 처리
    응답 구조 ResponseEntity로 HTTP 상태 명확히 제어

    📌 다음 편 예고

    Spring Boot 시리즈 3편: Spring Data JPA를 활용한 DB 연동 – Repository와 Entity 설계 전략

     

    728x90
Designed by Tistory.