Skip to content

Commit

Permalink
GETP-203 fix: Mapper에서 source가 null임에도 내부 필드가 null인 target으로 매핑하는 오류 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
scv1702 committed Aug 21, 2024
1 parent 04ce1c3 commit 6bdfc8f
Show file tree
Hide file tree
Showing 11 changed files with 165 additions and 44 deletions.
10 changes: 10 additions & 0 deletions src/main/java/es/princip/getp/domain/BaseEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,14 @@ public abstract class BaseEntity extends BaseModel {

protected LocalDateTime createdAt;
protected LocalDateTime updatedAt;

protected BaseEntity() {
this.createdAt = null;
this.updatedAt = null;
}

protected BaseEntity(final LocalDateTime createdAt, final LocalDateTime updatedAt) {
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
}
12 changes: 9 additions & 3 deletions src/main/java/es/princip/getp/domain/client/model/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import es.princip.getp.domain.like.command.domain.Likeable;
import es.princip.getp.domain.member.model.Email;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@AllArgsConstructor
public class Client extends BaseEntity implements Likeable {

private Long clientId;
Expand All @@ -20,11 +20,17 @@ public class Client extends BaseEntity implements Likeable {

@Builder
public Client(
final Long clientId,
final Email email,
final Address address,
final BankAccount bankAccount,
final Long memberId
final Long memberId,
final LocalDateTime createdAt,
final LocalDateTime updatedAt
) {
super(createdAt, updatedAt);

this.clientId = clientId;
this.email = email;
this.address = address;
this.bankAccount = bankAccount;
Expand Down
47 changes: 37 additions & 10 deletions src/main/java/es/princip/getp/domain/member/model/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,67 @@
import es.princip.getp.domain.BaseEntity;
import es.princip.getp.domain.member.exception.NotAgreedAllRequiredServiceTermException;
import es.princip.getp.domain.serviceTerm.model.ServiceTermTag;
import lombok.AllArgsConstructor;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

@Getter
@AllArgsConstructor
public class Member extends BaseEntity {

private Long memberId;
private Email email;
private Password password;
private MemberType memberType;
@NotNull private Email email;
@NotNull private Password password;
@NotNull private MemberType memberType;
private Nickname nickname;
private PhoneNumber phoneNumber;
private ProfileImage profileImage;
private Set<ServiceTermAgreement> serviceTermAgreements = new HashSet<>();

@Builder
public Member(
final Long memberId,
final Email email,
final Password password,
final MemberType memberType,
final Nickname nickname,
final PhoneNumber phoneNumber,
final ProfileImage profileImage,
final Set<ServiceTermAgreement> serviceTermAgreements,
final LocalDateTime createdAt,
final LocalDateTime updatedAt
) {
super(createdAt, updatedAt);

this.memberId = memberId;
this.email = email;
this.password = password;
this.memberType = memberType;
this.nickname = nickname;
this.phoneNumber = phoneNumber;
this.profileImage = profileImage;
this.serviceTermAgreements = serviceTermAgreements;

validate();
}

private Member(
final Email email,
final Password password,
final MemberType memberType
) {
Objects.requireNonNull(email);
Objects.requireNonNull(password);

this.email = email;
setPassword(password);
this.password = password;
this.memberType = memberType;

validate();
}

public static Member of(
Expand Down Expand Up @@ -124,7 +151,7 @@ public void encodePassword(final PasswordEncoder encoder) {
if (password.isEncoded()) {
return;
}
this.password = password.encode(encoder);
setPassword(password.encode(encoder));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public class PeopleQueryDslDao extends QueryDslSupport implements PeopleDao {
private Map<Long, Tuple> findMemberAndPeopleByPeopleId(final Long... peopleId) {
return queryFactory.select(
member.nickname,
member.profileImageUrl,
member.profileImage,
people.peopleId,
people.info.peopleType
)
Expand All @@ -60,7 +60,7 @@ private Optional<Tuple> findMemberAndPeopleByPeopleId(final Long peopleId) {
return Optional.ofNullable(
queryFactory.select(
member.nickname,
member.profileImageUrl,
member.profileImage,
people.peopleId,
people.info.peopleType
)
Expand Down Expand Up @@ -90,7 +90,7 @@ private List<CardPeopleResponse> getCardPeopleContent(final Pageable pageable) {
return new CardPeopleResponse(
peopleId,
memberAndPeople.get(peopleId).get(member.nickname),
memberAndPeople.get(peopleId).get(member.profileImageUrl),
memberAndPeople.get(peopleId).get(member.profileImage),
memberAndPeople.get(peopleId).get(qPeople.info.peopleType),
0,
likesCounts.get(peopleId),
Expand Down Expand Up @@ -126,7 +126,7 @@ public DetailPeopleResponse findDetailPeopleById(final Long peopleId) {
return new DetailPeopleResponse(
peopleId,
memberAndPeople.get(member.nickname),
memberAndPeople.get(member.profileImageUrl),
memberAndPeople.get(member.profileImage),
memberAndPeople.get(people.info.peopleType),
0,
peopleLikeDao.countByLikedId(peopleId),
Expand All @@ -152,7 +152,7 @@ public PublicDetailPeopleResponse findPublicDetailPeopleById(final Long peopleId
return new PublicDetailPeopleResponse(
peopleId,
memberAndPeople.get(member.nickname),
memberAndPeople.get(member.profileImageUrl),
memberAndPeople.get(member.profileImage),
memberAndPeople.get(people.info.peopleType),
0,
peopleLikeDao.countByLikedId(peopleId),
Expand All @@ -170,7 +170,7 @@ public MyPeopleResponse findByMemberId(final Long memberId) {
people.info.email.value,
member.nickname,
member.phoneNumber,
member.profileImageUrl,
member.profileImage,
people.info.peopleType,
Expressions.asNumber(0).as("completedProjectsCount"),
Expressions.asNumber(0).as("likesCount"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class ProjectApplicantQueryDslDao extends QueryDslSupport implements Proj
private Map<Long, Tuple> findMemberAndPeopleByPeopleId(final Long... peopleId) {
return queryFactory.select(
member.nickname,
member.profileImageUrl,
member.profileImage,
people.peopleId,
people.info.peopleType
)
Expand Down Expand Up @@ -80,7 +80,7 @@ private List<DetailPeopleResponse> assemble(
return new DetailPeopleResponse(
peopleId,
memberAndPeople.get(peopleId).get(member.nickname),
memberAndPeople.get(peopleId).get(member.profileImageUrl),
memberAndPeople.get(peopleId).get(member.profileImage),
memberAndPeople.get(peopleId).get(qPeople.info.peopleType),
0,
likesCounts.get(peopleId),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,14 @@ public abstract class BaseTimeJpaEntity {
@LastModifiedDate
@Column(columnDefinition = "TIMESTAMP")
protected LocalDateTime updatedAt;

protected BaseTimeJpaEntity() {
this.createdAt = null;
this.updatedAt = null;
}

protected BaseTimeJpaEntity(final LocalDateTime createdAt, final LocalDateTime updatedAt) {
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

import es.princip.getp.persistence.adapter.BaseTimeJpaEntity;
import jakarta.persistence.*;
import lombok.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Entity
@Getter
@Builder
@AllArgsConstructor
@Table(name = "client")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
class ClientJpaEntity extends BaseTimeJpaEntity {
Expand All @@ -28,4 +31,23 @@ class ClientJpaEntity extends BaseTimeJpaEntity {

@Column(name = "member_id")
private Long memberId;

@Builder
public ClientJpaEntity(
final Long clientId,
final String email,
final AddressJpaVO address,
final BankAccountJpaVO bankAccount,
final Long memberId,
final LocalDateTime createdAt,
final LocalDateTime updatedAt
) {
super(createdAt, updatedAt);

this.clientId = clientId;
this.email = email;
this.address = address;
this.bankAccount = bankAccount;
this.memberId = memberId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ private ClientResponse mapToClientResponse(final Tuple result) {
result.get(member.nickname),
result.get(member.phoneNumber),
result.get(client.email),
result.get(member.profileImageUrl),
result.get(member.profileImage),
mapper.mapToDomain(result.get(client.address)),
mapper.mapToDomain(result.get(client.bankAccount)),
result.get(client.createdAt),
Expand All @@ -45,7 +45,7 @@ public ClientResponse findClientById(final Long clientId) {
member.nickname,
member.phoneNumber,
client.email,
member.profileImageUrl,
member.profileImage,
client.address,
client.bankAccount,
client.createdAt,
Expand All @@ -66,7 +66,7 @@ public ClientResponse findClientByMemberId(final Long memberId) {
member.nickname,
member.phoneNumber,
client.email,
member.profileImageUrl,
member.profileImage,
client.address,
client.bankAccount,
client.createdAt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@
import es.princip.getp.domain.member.model.MemberType;
import es.princip.getp.persistence.adapter.BaseTimeJpaEntity;
import jakarta.persistence.*;
import lombok.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;

@Getter
@Entity
@Builder
@AllArgsConstructor
@Table(name = "member",
uniqueConstraints = {
@UniqueConstraint(name = "uq_email", columnNames = {"email"}),
Expand Down Expand Up @@ -43,13 +45,37 @@ public class MemberJpaEntity extends BaseTimeJpaEntity {
private String phoneNumber;

@Column(name = "profile_image_url")
private String profileImageUrl;
private String profileImage;

@Builder.Default
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
name = "member_service_term_agreement",
joinColumns = @JoinColumn(name = "member_id")
)
private Set<ServiceTermAgreementJpaVO> serviceTermAgreements = new HashSet<>();

@Builder
public MemberJpaEntity(
final Long memberId,
final String email,
final String password,
final MemberType memberType,
final String nickname,
final String phoneNumber,
final String profileImage,
final Set<ServiceTermAgreementJpaVO> serviceTermAgreements,
final LocalDateTime createdAt,
final LocalDateTime updatedAt
) {
super(createdAt, updatedAt);

this.memberId = memberId;
this.email = email;
this.password = password;
this.memberType = memberType;
this.nickname = nickname;
this.phoneNumber = phoneNumber;
this.profileImage = profileImage;
this.serviceTermAgreements = serviceTermAgreements;
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,36 @@
package es.princip.getp.persistence.adapter.member;

import es.princip.getp.domain.member.model.Member;
import es.princip.getp.domain.member.model.ServiceTermAgreement;
import es.princip.getp.domain.member.model.*;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;

@Mapper(componentModel = "spring")
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface MemberPersistenceMapper {

@Mapping(source = "email", target = "email.value")
@Mapping(source = "password", target = "password.value")
@Mapping(source = "nickname", target = "nickname.value")
@Mapping(source = "phoneNumber", target = "phoneNumber.value")
@Mapping(source = "profileImageUrl", target = "profileImage.url")
Member mapToDomain(MemberJpaEntity memberJpaEntity);

@Mapping(target = "email", source = "email.value")
@Mapping(target = "password", source = "password.value")
@Mapping(target = "nickname", source = "nickname.value")
@Mapping(target = "phoneNumber", source = "phoneNumber.value")
@Mapping(target = "profileImageUrl", source = "profileImage.url")
@Mapping(target = "profileImage", source = "profileImage.url")
MemberJpaEntity mapToJpa(Member member);

@Mapping(source = "tag", target = "tag.value")
ServiceTermAgreement mapToDomain(ServiceTermAgreementJpaVO serviceTermAgreementJpaVO);

@Mapping(target = "tag", source = "tag.value")
ServiceTermAgreementJpaVO mapToJpa(ServiceTermAgreement serviceTermAgreement);

@Mapping(source = "value", target = "value")
PhoneNumber mapToPhoneNumber(String value);

@Mapping(source = "value", target = "value")
Nickname mapToNickname(String value);

@Mapping(source = "value", target = "url")
ProfileImage mapToProfileImage(String value);
}
Loading

0 comments on commit 6bdfc8f

Please sign in to comment.