[Spring Boot] Spring 프로젝트 설계 및 구조

근이의 개발일기·2024년 11월 5일

[Spring Boot]

목록 보기
3/4
post-thumbnail

Spring에서의 DTO와 계층 구조 설계

Spring 프레임워크에서 DTO(Data Transfer Object)는 계층 간의 데이터 전달을 위해 사용되는 객체입니다. 일반적으로 서비스 계층과 컨트롤러 계층, 혹은 서비스와 외부 클라이언트 간의 데이터 교환 시에 활용됩니다. DTO는 보통 비즈니스 로직을 포함하지 않으며, 데이터를 단순히 담아 전달하는 용도로 사용됩니다.

DTO의 주요 목적은 데이터 전달의 효율성을 높이는 것입니다. 이를 통해 모델(엔티티) 객체를 그대로 노출하는 것을 방지하여 보안성을 강화하고, 필요한 데이터만 선택적으로 전달할 수 있도록 합니다. 또한, DTO는 서비스 계층에서 처리된 데이터를 클라이언트에 맞게 가공할 수 있어 데이터 포맷팅데이터 구조의 유연성을 제공합니다.

예를 들어, Spring 애플리케이션에서 User 엔티티가 데이터베이스와의 상호작용을 위해 전체 정보를 포함하고 있다면, 클라이언트가 필요한 몇 가지 정보(예: 이름, 이메일)만 포함된 UserDTO를 만들어 전달하는 방식으로 사용됩니다. 이를 통해 계층 간에 불필요한 데이터가 오가는 것을 줄이고, API 응답의 크기도 최적화할 수 있습니다.

또한, 데이터 검증이나 API 문서화를 쉽게 할 수 있는 장점이 있어, 클린 코드와 명확한 API 설계를 위해 널리 사용됩니다.


Spring 프로젝트의 패키지 구조와 역할

다음은 Spring에서 흔히 사용하는 패키지 구조와 각 패키지의 역할입니다.

  • domain 패키지: JPA에서 사용하기 위한 엔티티 클래스를 저장하는 패키지입니다. 엔티티는 데이터베이스와 직접적으로 매핑되며, 주로 서비스 계층에서 사용됩니다.
  • repository 패키지: 데이터베이스와 통신하는 계층으로, Spring Data JPA를 통해 생성된 리포지토리를 포함합니다. 주로 엔티티를 저장하거나 조회하는 메소드를 정의하고, 서비스 계층에서 호출됩니다.
  • converter 패키지: 데이터 형식 간 변환을 수행하는 클래스를 포함합니다. 주로 엔티티 객체를 DTO로 변환하거나 그 반대 작업을 수행하며, 이를 통해 데이터가 정확한 형태로 전송될 수 있도록 합니다. 필요에 따라 새로운 엔티티 객체를 생성하기도 합니다.
  • controller 패키지: HTTP 요청을 받아 해당 요청에 대한 응답을 처리하는 클래스의 모음입니다. 보통 요청에 대한 실제 처리는 서비스 계층에서 수행하며, 컨트롤러는 단순히 서비스의 메소드를 호출하고 응답 결과를 반환합니다.
  • service 패키지: 비즈니스 로직을 담당하는 클래스들이 포함된 패키지로, 가장 복잡한 코드가 들어갑니다. 컨트롤러는 서비스의 메소드를 호출하여 데이터를 가져오며, 서비스 계층은 리포지토리 계층의 메소드를 호출하여 데이터베이스와 상호작용을 합니다.
  • dto 패키지: 클라이언트가 요청 본문에 담아 보내는 데이터를 받기 위한 클래스나, 데이터베이스에서 받아온 데이터를 클라이언트에게 보여주기 위한 클래스를 포함합니다. 데이터베이스 구조가 변경되더라도 DTO만 수정하면 되므로 프론트엔드 개발자에게 미치는 영향을 최소화할 수 있습니다.

converter 패키지의 사용 위치

converterDTOEntity 간의 변환을 담당합니다. 컨버터 사용 위치에 따라 프로젝트 구조 및 보안성 측면에서 다른 장점이 있습니다.

  1. Service에서 DTO 생성
    • 서비스 계층에서 컨버터를 통해 DTO를 생성한 후, 이를 컨트롤러로 반환합니다. 컨트롤러는 단순히 DTO를 응답으로 제공하는 방식입니다.
    • 장점:
      • 컨트롤러에 엔티티가 노출되지 않아 보안적인 측면에서 도움이 됩니다.
      • 엔티티에 민감한 정보가 포함된 경우, 권한이 있는 개발자만 엔티티의 데이터를 접근하고, DTO로 필요한 정보만 걸러 컨트롤러에 전달하여 민감 정보의 노출을 방지할 수 있습니다.
  2. Controller에서 DTO 생성
    • 서비스 계층에서 엔티티를 반환하고, 컨트롤러에서 컨버터를 통해 DTO로 변환하여 응답을 제공합니다.
    • 장점:
      • 서비스 메소드의 범용성을 증가시켜 유지보수가 쉬워집니다.
      • 동일한 엔티티가 여러 컨트롤러에서 필요하거나 검증을 위한 어노테이션에서 재사용될 수 있어 개발 편의성이 높아집니다.
  3. converter의 위치 결정
    • converter에서 entity를 생성한다면, 해당 패키지를 web 패키지 내부에 두지 않는 것이 좋습니다. 반면, converter를 이용해 DTO를 만드는 경우에는 web 패키지 내부에 배치할 수 있습니다.

이러한 구조와 역할을 통해 Spring 프로젝트에서는 각 계층이 독립적으로 관리될 수 있으며, 특히 엔티티의 민감 정보 보호와 코드의 가독성을 높일 수 있습니다. DTO와 Converter를 적절히 사용함으로써 Spring 애플리케이션에서 효율적이고 보안성이 높은 데이터 전달을 구현할 수 있습니다.


이와 같은 구조와 원칙을 통해 Spring Boot 프로젝트에서 체계적이고 유지보수 가능한 애플리케이션을 설계할 수 있습니다.

0개의 댓글