<aside> 1️⃣ entity 선언
</aside>
User
Entity에서 **UserDto
**를 받아 새로운 User
Entity를 생성하는 메소드는 다음과 같이 만들 수 있다.@Getter
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
public static User fromDto(UserDto dto) {
return new User(dto.getName(), dto.getEmail());
}
}
<aside> 2️⃣ class를 통한 dto생성방식 설명
</aside>
DTO 클래스(UserDto)
내부에서 외부에서 주입한 **엔티티(User)
**를 인자로 받아서 **UserDto
**를 생성하는 static 팩토리 메소드를 만드는 방법
UserDto
클래스에 해당 메소드를 추가하면 된다.UserDto
**에서 User
Entity를 받아 새로운 **UserDto
**를 생성하는 메소드는 다음과 같이 만들 수 있다.@Data
public class UserDto {
private final String name;
private final String email;
private String address;
// 생성자를 이용해서 바로 만들어주는 방식
public static UserDto fromEntity(User user) {
return new UserDto(
user.getName(),
user.getEmail()
)
}
// setter를 이용해서 만들어진 dto 객체에 필요한 값만 세팅해주는 방식
public static UserDto fromEntity(User user) {
UserDto dto = new UserDto();
dto.setName(user.getName());
dto.setEmail(user.getEmail());
return dto;
}
}
<aside> ❓ Setter를 사용하면 왜 불완전한 상태에 놓일 수 있다는 것일까?
</aside>
UserDto
객체를 생성하는 코드를 생각해보자UserDto dto = new UserDto();
dto.setName("John Doe");
setName()
**을 호출한 시점에서는 email
필드가 아직 설정되지 않았다. 따라서 이 시점에서 dto
객체는 불완전한 상태에 있다. 이후에 **setEmail()
**을 호출하여 email
필드를 설정해야 완전한 상태가 된다.UserDto dto = new UserDto("John Doe", "[email protected]");
<aside> ❓ 불완전한 상태의 객체가 위험한 이유
</aside>
null
참조 예외가 발생할 수 있다. 이는 프로그램의 안정성을 해칠 수 있다.