들어가며
6편에 내용에서는 Port와 Adapter의 createMembership 메서드를 통해 DB에 회원정보를 저장하려고 했다.
createMembership 메서드에 앞서서 이번편에서는 JPA를 활용해서 도메인 객체와 데이터베이스 테이블 간의 매핑하고, Adapter로 DB와 상호작용하는 방식은 SpringDataJpaRepository를 통해 CRUD를 간단하게 조작할 수 있도록 한다.
또한, Mapper를 통해 DB로부터 반환된 객체를 도메인 객체로 변환해 Service에서 사용하기도 할 것이다.
도메인 객체와 데이터베이스 테이블 간의 매핑
JpaEntity는 매핑을 관리하는 JPA 기술로, 여기서는 Membership 도메인 객체를 DB에 테이블로 매핑한다.
@Entity
@Table(name = "membership")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MembershipJpaEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long membershipId;
private String name;
private String address;
private String email;
private boolean isValid;
private boolean isCorp;
@Override
public String toString() {
return "MembershipJpaEntity{" +
"membershipId=" + membershipId +
", name='" + name + '\'' +
", address='" + address + '\'' +
", email='" + email + '\'' +
", isValid=" + isValid +
", isCorp=" + isCorp +
'}';
}
}
구성은 필드값, 생성자, toString으로 구현된다.
먼저 필드는 DB의 테이블 컬럼과 매핑되며, toString으로 메서드를 구현하면서 가독성을 높였다.
Spring Data JPA 기술로 CRUD 자동 조작하기
public interface SpringDataJpaRepository extends JpaRepository<MembershipJpaEntity, Long> {
}
SpringDataJpaMembershipRepository는 기본적으로 Spring Data JPA에서 제공하는 JpaRepository 인터페이스를 확장하면서 기본 메서드를 통해 CRUD를 조작할 수 있게 되었다.
이때, MembershipJpaEntity와 Long을 파라미터로 받아 해당 엔터티를 다루는데 간편하다.
SpringDataJpaMembershipRepository를 구현하기
@RequiredArgsConstructor
public class RegisterMembershipAdapter implements RegisterMembershipPort {
private final SpringDataJpaRepository membershipRepository;
@Override
public MembershipJpaEntity createMember(
Membership.MembershipName membershipName,
Membership.MembershipAddress membershipAddress,
Membership.MembershipEmail membershipEmail,
Membership.MembershipIsValid membershipIsValid,
Membership.MembershipIsCorp membershipIsCorp
) {
return membershipRepository.save(
new MembershipJpaEntity(
membershipName.getNameValue(),
membershipAddress.getAddressValue(),
membershipEmail.getEmailValue(),
membershipIsValid.isValidValue(),
membershipIsCorp.isCorpValue())
);
다시 Port를 구현한 Adapter로 돌아와서 DB에 저장하는 기능을 수행하기 위해 DDD원칙에 따라 createMember메서드를 정의해야 한다.
createMember 메서드를 호출할 때, 도메인 객체 Membership를 파라미터로 전달 받아 Spring Data JPA의 save 메서드를 통해 새로운 엔터티를 DB에 저장하는 것이다.
public MembershipJpaEntity(String name, String address, String email, boolean isValid, boolean isCorp) {
this.name = name;
this.address = address;
this.email = email;
this.isValid = isValid;
this.isCorp = isCorp;
}
여기서 createMember의 비즈니스 로직에서 new 엔터티를 생성하기 위해 따로 객체를 초기화할 필요가 있다. 기본 값들은 private으로 불변하며, 외부에서 사용하기 위해 생성자를 둔다.
이렇게 함으로써 DDD 원칙에 따라 도메인 객체를 사용하여 비즈니스 로직을 수행하고, 그 결과로 엔터티를 생성하여 저장하는 구조를 가진다.