π DTO μ€μ²© μ€κ³!
π― λͺ©ν
νμ μ 보 μλ΅ μ μ 곡 μ 보λ₯Ό μ€μ²© κ°μ²΄λ‘ λ°ννλλ‘ DTO ꡬ쑰λ₯Ό κ°μ ν©λλ€.
λ³κ²½ λͺ©ν JSON ꡬ쑰
{
"name": "Minseong Kang",
"admissionYear": 2010,
"major_info": {
"id": 1,
"majorNumber": "31513162120518",
"name": "Computer"
}
}
π ꡬ쑰 μ€κ³
κΈ°μ‘΄ ꡬ쑰 vs κ°μ ꡬ쑰
κ΅¬λΆ | κΈ°μ‘΄ | κ°μ |
---|---|---|
μλ΅ νλ |
id , studentId , name , major
|
name , admissionYear , major_info
|
μ 곡 νν | String νμ | μ€μ²© κ°μ²΄ (MajorInfoDto) |
μ 보 κΉμ΄ | λ¨μΌ λ 벨 | 2λ 벨 μ€μ²© ꡬ쑰 |
π¨ ꡬν λ¨κ³
Step 1: μ 곡 μ 보 DTO μμ±
μλ‘μ΄ MajorInfoDto
ν΄λμ€λ₯Ό μμ±νμ¬ μ 곡 μμΈ μ 보λ₯Ό λ΄μ΅λλ€.
package com.kobe.schoolmanagement.dto.response;
import com.kobe.schoolmanagement.domain.entity.Major;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class MajorInfoDto {
private Long id;
private String majorNumber;
private String name;
/**
* Major μν°ν°λ₯Ό MajorInfoDtoλ‘ λ³ν
*
* @param major λ³νν Major μν°ν°
* @return MajorInfoDto κ°μ²΄
*/
public static MajorInfoDto fromEntity(Major major) {
return MajorInfoDto.builder()
.id(major.getId())
.majorNumber(major.getMajorNumber())
.name(major.getName())
.build();
}
}
π‘ ν΅μ¬ ν¬μΈνΈ
-
μ μ ν©ν 리 λ©μλ ν¨ν΄ μ¬μ© (
fromEntity
) - μν°ν°λ₯Ό DTOλ‘ λ³ννλ μ± μμ DTOμ μμ
- λΆλ³ κ°μ²΄ μ€κ³ (Getterλ§ μ 곡)
Step 2: νμ μλ΅ DTO μμ
κΈ°μ‘΄ StudentResponseDto
λ₯Ό μμ νμ¬ μ€μ²© ꡬ쑰λ₯Ό λ°μν©λλ€.
Before
@Getter
@Builder
public class StudentResponseDto {
private Long id;
private String studentId;
private String name;
private String major; // β λ¨μ λ¬Έμμ΄
// ...
}
After
package com.kobe.schoolmanagement.dto.response;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.kobe.schoolmanagement.domain.entity.Student;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class StudentResponseDto {
private String name;
private int admissionYear;
@JsonProperty("major_info") // β
JSON ν€λ₯Ό μ€λ€μ΄ν¬ μΌμ΄μ€λ‘ λ³ν
private MajorInfoDto majorInfo;
/**
* Student μν°ν°λ₯Ό StudentResponseDtoλ‘ λ³ν
*
* @param student λ³νν Student μν°ν°
* @return StudentResponseDto κ°μ²΄
*/
public static StudentResponseDto fromEntity(Student student) {
return StudentResponseDto.builder()
.name(student.getName())
.admissionYear(student.getAdmissionYear())
.majorInfo(MajorInfoDto.fromEntity(student.getMajor())) // β
μ€μ²© λ³ν
.build();
}
}
π‘ μ£Όμ λ³κ²½μ¬ν
-
λΆνμν νλ μ κ±°:
id
,studentId
μμ -
νλ νμ
λ³κ²½:
String major
βMajorInfoDto majorInfo
-
JSON νλλͺ
λ§€ν:
@JsonProperty
λ‘ μ€λ€μ΄ν¬ μΌμ΄μ€ μ μ© -
μ€μ²© λ³ν λ‘μ§:
fromEntity
λ©μλ μ²΄μΈ νμ©
π λ°μ΄ν° λ³ν νλ¦
Student Entity
βββ name: "Minseong Kang"
βββ admissionYear: 2010
βββ major: Major Entity
βββ id: 1
βββ majorNumber: "31513162120518"
βββ name: "Computer"
β
StudentResponseDto.fromEntity(student)
β
MajorInfoDto.fromEntity(student.getMajor())
β
StudentResponseDto
βββ name: "Minseong Kang"
βββ admissionYear: 2010
βββ majorInfo: MajorInfoDto
βββ id: 1
βββ majorNumber: "31513162120518"
βββ name: "Computer"
β
JSON Response (μλ μ§λ ¬ν)
β μμ κ²°κ³Ό
API μλ΅ μμ
{
"name": "Minseong Kang",
"admissionYear": 2010,
"major_info": {
"id": 1,
"majorNumber": "31513162120518",
"name": "Computer"
}
}
π μ€κ³ μμΉ
1. κ³μΈ΅ λΆλ¦¬
- Entity βοΈ DTO λ³ν λ‘μ§μ DTOμ μΊ‘μν
- Controllerλ λ³ν λ‘μ§μ μ νμ μμ
2. λͺ νν λ€μ΄λ°
| νλͺ© | Java μ½λ | JSON ν€ |
|ββ|ββββ|βββ|
| μ 곡 μ 보 | majorInfo
(μΉ΄λ© μΌμ΄μ€) | major_info
(μ€λ€μ΄ν¬ μΌμ΄μ€) |
3. μ¬μ¬μ©μ±
-
MajorInfoDto
λ λ€λ₯Έ μλ΅ DTOμμλ μ¬μ¬μ© κ°λ₯ - μ 곡 μ 보 νν λ°©μμ΄ μΌκ΄λ¨
4. νμ₯μ±
// ν₯ν μΆκ° μ λ³΄κ° νμν λ
@JsonProperty("major_info")
private MajorInfoDto majorInfo;
@JsonProperty("course_info") // β
λμΌν ν¨ν΄μΌλ‘ νμ₯
private CourseInfoDto courseInfo;
π μ μ© λ°©λ²
Controllerμμ μ¬μ©
@PostMapping
public ResponseEntity<StudentResponseDto> createStudent(
@RequestBody StudentRequestDto request
) {
Student student = studentService.createStudent(request);
// fromEntity λ©μλλ‘ κ°λ¨ν λ³ν
return ResponseEntity.ok(
StudentResponseDto.fromEntity(student)
);
}
μΆκ° μμ λΆνμ
- Service κ³μΈ΅ μμ νμ μμ
- Repository κ³μΈ΅ μμ νμ μμ
- DTO λ³ν λ‘μ§λ§ μμ νλ©΄ λ!