[개발]MemberModel의 삭제

Stormi·2022년 5월 26일
0

개발

목록 보기
11/20
post-thumbnail
  • 원래 컨트롤러와 서비스에서 소통할 때, DTO로 소통을하고 DTO를 Entity로 바꾸기 전에 MemberModel을 둬서 Entity로 소통하는 것을 막았었다.
@Getter
@NoArgsConstructor
public class MemberModel {
    private Long id;
    private String nickname;
    private String email;
    private String phone;
    private String socialId;
    private LocalDate birth;
    private String address;
    private MemberStatus status;
    private Membership membership;
    private Provider provider;

    public static MemberModel of(MemberCreateRequest request) {
        MemberModel memberModel = new MemberModel();
        memberModel.nickname = request.getRandomNickname();
        memberModel.email = request.getEmail();
        memberModel.birth = request.getBirth();
        memberModel.phone = request.getPhone();
        memberModel.address = request.getAddress();
        memberModel.status = MemberStatus.ACTIVE;
        memberModel.membership = Membership.SILVER;
        memberModel.socialId = null;
        memberModel.provider = null;

        return memberModel;
    }

    public static MemberModel of(AuthUserProfile profile, String nickname, String phone, LocalDate birth, String address, Provider provider) {
        MemberModel memberModel = new MemberModel();
        memberModel.nickname = nickname;
        memberModel.email = profile.getEmail();
        memberModel.phone = phone;
        memberModel.birth = birth;
        memberModel.address = address;
        memberModel.status = MemberStatus.ACTIVE;
        memberModel.membership = Membership.SILVER;
        memberModel.socialId = profile.getSocialId();
        memberModel.provider = provider;

        return memberModel;

    }

    public static MemberModel of(Member member) {
        MemberModel memberModel = new MemberModel();
        memberModel.id = member.getId();
        memberModel.nickname = member.getNickname();
        memberModel.email = member.getEmail();
        memberModel.birth = member.getBirth();
        memberModel.phone = member.getPhone();
        memberModel.address = member.getAddress();
        memberModel.socialId = member.getSocialId();
        memberModel.provider = member.getProvider();

        return memberModel;
    }

    public MemberResponse toResponse() {
        return MemberResponse.builder()
                .id(id)
                .nickname(nickname)
                .email(email)
                .phone(phone)
                .birth(birth)
                .address(address)
                .membership(membership)
                .socialId(socialId)
                .provider(provider)
                .build();
    }

    public Member toEntity() {
        return Member.builder()
                .id(id)
                .nickname(nickname)
                .email(email)
                .phone(phone)
                .birth(birth)
                .address(address)
                .status(status)
                .membership(membership)
                .socialId(socialId)
                .provider(provider)
                .build();
    }


}
  • 하지만, Social 테이블을 따로 두고 MemberModel로 관리하는 것이 어려워졌다.
List<SocialUser> 이런식으로 두는데 

이것은 List안은 Entity로 받기 때문에 jpa를 사용할 때, 문제가 생기게 된다. MemberModel에서 SocialUser라는 Entity에 접근을하면 SocialUser는 Member Entity와 연관관계가 있어서 SocialUser를 저장할때 Member에 중복되는 유저가 생길 수 있기 때문이다.

  • 따라서 MemberModel을 없애고 DTO를 바로 Entity로 바꾸게했고, Member entity에 메소드들을 추가해줬다.
@Getter
@Entity(name = "member")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Member extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
    private List<SocialMember> socialMembers = new ArrayList<>();

    @Column(name = "nickname")
    private String nickname;

    @Column(name = "email")
    private String email;

    @Column(name = "phone")
    private String phone;

    @DateTimeFormat(pattern = "yyyy/MM/dd")
    @Column(name = "birth")
    private LocalDate birth;

    @Column(name = "address")
    private String address;

    @Column(name = "password")
    private String password;

    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private MemberStatus status;

    @Enumerated(EnumType.STRING)
    @Column(name = "membership")
    private Membership membership;

    public void changeNickname(String newNickname) {
        this.nickname = newNickname;
    }

    public void deleteMember() {
        this.status = MemberStatus.DELETED;
    }

    public void linkExistSocialMember(SocialMemberRepository repository, String social) {
        SocialMember exist = repository.findBySocialAndMember_Email(social, email);
        exist.setMember(this);
        socialMembers.add(exist);
        repository.save(exist);
    }

    public MemberResponse toResponse() {
        MemberResponse memberResponse = MemberResponse
                .builder()
                .id(this.id)
                .nickname(this.nickname)
                .email(this.email)
                .phone(this.phone)
                .birth(this.birth)
                .address(this.address)
                .membership(this.membership)
                .socialMembers(this.socialMembers)
                .build();
        return memberResponse;
    }


    public static Member of(AuthSignupRequest request, AuthUserProfile userProfile) {
        Member member = Member
                .builder()
                .nickname(request.getRandomNickname())
                .email(userProfile.getEmail())
                .phone(request.getPhone())
                .birth(request.getBirth())
                .address(request.getAddress())
                .password(request.getPassword())
                .status(MemberStatus.ACTIVE)
                .membership(Membership.BRONZE)
                .socialMembers(new ArrayList<>())
                .build();
        SocialMember socialMember = SocialMember.of(userProfile.getSocialId(), request.getProvider(), member);
        member.getSocialMembers().add(socialMember);
        return member;
    }

    public static Member of(MemberCreateRequest request) {
        return Member
                .builder()
                .nickname(request.getRandomNickname())
                .email(request.getEmail())
                .phone(request.getPhone())
                .birth(request.getBirth())
                .address(request.getAddress())
                .status(MemberStatus.ACTIVE)
                .membership(Membership.BRONZE)
                .password(request.getPassword())
                .build();

    }

}

0개의 댓글