몽상실현개발주의

SpringBoot VO 와 DTO 본문

Dev

SpringBoot VO 와 DTO

migrationArc 2024. 5. 5. 16:56

VO와 DTO의 정의와 사용 목적

Value Object (VO)

  • 불변성: VO는 객체가 생성된 이후 내부 상태가 변경되지 않도록 설계된 불변 객체입니다.
  • 용도: VO는 주로 도메인 모델 내에서 비즈니스 로직을 수행하며, 도메인의 핵심 개념을 표현합니다.

 

Data Transfer Object (DTO)

  • 가변성: DTO는 필요에 따라 속성을 변경할 수 있으며, 데이터 전송을 최적화하기 위해 설계되었습니다.
  • 용도: 주로 계층 간 데이터 전송을 최적화하고, 사용자 인터페이스와 비즈니스 로직 사이에서 데이터를 운반합니다.

 


 

예제: 사용자 정보 관리 애플리케이션

사용자의 정보를 관리하는 간단한 CRUD 애플리케이션을 구현하여 각 CRUD 작업에 VO와 DTO를 어떻게 활용하는지 설명합니다.

(Mybatis 를 사용하는 환경)

 

 

도메인 클래스 (VO)

사용자 정보를 나타내는 불변 객체 UserVO를 정의합니다.

public class UserVO {
    private final int id;
    private final String username;
    private final String email;

    public UserVO(int id, String username, String email) {
        this.id = id;
        this.username = username;
        this.email = email;
    }

    // Getters
    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getEmail() {
        return email;
    }
}

 

 

 

DTO 정의

데이터 전송을 위해 사용되는 UserDTO 클래스입니다.

public class UserDTO {
    private int id;
    private String username;
    private String email;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

 

 

 

MyBatis Mapper 설정

CRUD 작업을 위한 SQL 쿼리를 정의합니다.

<!-- src/main/resources/mappers/UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 조회: VO 사용 -->
    <select id="findUserById" resultType="com.example.domain.UserVO">
        SELECT id, username, email FROM users WHERE id = #{id}
    </select>
    <!-- 생성: DTO 사용 -->
    <insert id="insertUser" parameterType="com.example.dto.UserDTO">
        INSERT INTO users (username, email) VALUES (#{username}, #{email})
    </insert>
    <!-- 업데이트: DTO 사용 -->
    <update id="updateUser" parameterType="com.example.dto.UserDTO">
        UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}
    </update>
    <!-- 삭제: ID 사용 -->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

 

 

 

서비스 계층

각 CRUD 작업을 수행하는 메소드를 포함합니다.

public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public UserVO getUserById(int id) {
        return userMapper.findUserById(id);
    }

    public void createUser(UserDTO userDTO) {
        userMapper.insertUser(userDTO);
    }

    public void updateUser(UserDTO userDTO) {
        userMapper.updateUser(userDTO);
    }

    public void deleteUser(int id) {
        userMapper.deleteUser(id);
    }
}

 

 

 

컨트롤러

클라이언트 요청을 처리하고 서비스 계층을 통해 결과를 반환합니다.

@RestController
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users/{id}")
    public ResponseEntity<UserVO> getUserById(@PathVariable int id) {
        return ResponseEntity.ok(userService.getUserById(id));
    }

    @PostMapping("/users")
    public ResponseEntity<Void> createUser(@RequestBody UserDTO userDTO) {
        userService.createUser(userDTO);
        return ResponseEntity.ok().build();
    }

    @PutMapping("/users")
    public ResponseEntity<Void> updateUser(@RequestBody UserDTO userDTO) {
        userService.updateUser(userDTO);
        return ResponseEntity.ok().build();
    }

    @DeleteMapping("/users/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable int id) {
        userService.deleteUser(id);
        return ResponseEntity.ok().build();
    }
}

 

 

 

이 코드는 각각의 CRUD 작업에 대해 VO 또는 DTO를 적절히 사용하여 데이터를 처리합니다. VO는 데이터의 불변성을 보장하고, DTO는 데이터 전송과 수정을 용이하게 합니다. 이 예제는 각 계층의 역할을 명확히 하며, 데이터 처리의 안정성과 효율성을 높이는 데 도움이 됩니다.

Comments