이해했습니다. 도메인 객체와 JPA 엔티티를 사용할 때, 도메인 객체가 상태를 변경할 수 있어야 한다는 것을 설명하겠습니다.
도메인 객체는 비즈니스 로직을 포함하고, 상태 변경을 필요로 하는 경우가 많습니다. 따라서 도메인 객체는 가변 객체로 설계하는 것이 일반적입니다.
public class Member {
private Long id;
private String name;
private String email;
private LocalDateTime lastLogin;
public Member(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
this.lastLogin = LocalDateTime.now();
}
// 상태 변경 메서드
public void updateEmail(String newEmail) {
if (newEmail.contains("@")) {
this.email = newEmail;
} else {
throw new IllegalArgumentException("Invalid email address");
}
}
public void login() {
this.lastLogin = LocalDateTime.now();
}
// Getter 및 Setter 메서드
}
@Entity
public class MemberEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private LocalDateTime lastLogin;
// Getter 및 Setter 메서드
}
public class MemberAdapter {
private final MemberRepository memberRepository;
public MemberAdapter(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 도메인 객체를 엔티티로 변환하여 저장
public void saveMember(Member member) {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setId(member.getId());
memberEntity.setName(member.getName());
memberEntity.setEmail(member.getEmail());
memberEntity.setLastLogin(member.getLastLogin());
memberRepository.save(memberEntity);
}
// 엔티티를 도메인 객체로 변환하여 조회
public Member findMemberById(Long id) {
return memberRepository.findById(id)
.map(entity -> new Member(entity.getId(), entity.getName(), entity.getEmail()))
.orElse(null);
}
}