Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 따배씨
- JavaScript
- String
- C언어
- sorting
- udemy
- DP
- 인프런
- dfs
- php
- BOJ
- C
- server
- BFS
- 생활코딩
- Python
- 종만북
- greedy
- graph
- Algorithm
- 따라하며 배우는 C언어
- programmers
- 따라하면서 배우는 C언어
- web
- Cleancode
- Math
- 백준
- Algospot
- BASIC
- 정수론
Archives
- Today
- Total
몽상실현개발주의
SpringBoot VO 와 DTO 본문
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는 데이터 전송과 수정을 용이하게 합니다. 이 예제는 각 계층의 역할을 명확히 하며, 데이터 처리의 안정성과 효율성을 높이는 데 도움이 됩니다.
'Dev' 카테고리의 다른 글
빌더 패턴의 이해와 Java에서의 적용 (0) | 2024.05.06 |
---|---|
Lombok in Spring Framework (0) | 2024.05.06 |
Rails의 지연 로딩(Lazy Loading) 과 데이터베이스 연결 전환 (0) | 2024.03.26 |
AWS VPN Gateway와 VPN Connection 이해하기 (0) | 2024.03.12 |
HTTP OPTIONS 메소드와 Preflight 요청 이해하기 (0) | 2024.03.03 |
Comments