이해했습니다. 도메인 객체와 JPA 엔티티를 사용할 때, 도메인 객체가 상태를 변경할 수 있어야 한다는 것을 설명하겠습니다.

도메인 객체와 JPA 엔티티

도메인 객체의 설계

도메인 객체는 비즈니스 로직을 포함하고, 상태 변경을 필요로 하는 경우가 많습니다. 따라서 도메인 객체는 가변 객체로 설계하는 것이 일반적입니다.

가변 도메인 객체

예시

도메인 객체: Member

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 메서드
}

JPA 엔티티: MemberEntity

@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);
    }
}