• jpa dto와 entity 빌더 패턴으로 변환하기

    2023. 3. 11.

    by. Sohyun

    변환이 필요한 이유


    dto는 데이터를 운반시켜주고, entity는 데이터베이스의 실제 데이터에 접근하고
    각자의 역할대로 실행해 주는 것이 어떻게 보면 번거로울 수 있지만
    원치 않는 값 변경이나 테이블 이외의 값을 처리하기에도 용이하기 때문이다.
     
     
    방법은 빌더패턴으로 사용할 수도 있고 ModelMapper를 사용할 수도 있는데

    빌더패턴을 사용해서 변환해 보았다.
     

    값이 있는 생성자에 빌더어노테이션을 붙이고
    서로 변환해주는 메서드를 넣었다.
    도메인은 소스코드가 길어지지만 서비스 단에는 코드가 단순해졌다.


    dto를 → entity로 바꾸기

    • 기존
    private final MemberRepository memberRepository;
        public Member joinMember(MemberVO memberVO) {
            Member member = Member.builder()
                    .memberName(memberVO.getMemberName())
                    .loginType("Y")
                    .loginId(memberVO.getLoginId())
                    .loginPwd(memberVO.getLoginPwd())
                    .HpNo(memberVO.getHpNo())
                    .email(memberVO.getEmail())
                    .leaveYn("N")
                    .joinDate(LocalDateTime.now())
                    .build();
            return memberRepository.save(member);
        }
    

    사용 : memberDto.toEntity();

    @Builder
        public MemberDto(Long memberSeq, String memberName, String loginType, String loginId, String loginPwd, String hpNo, String email, String leaveYn, LocalDateTime joinDate) {
            this.memberSeq = memberSeq;
            this.memberName = memberName;
            this.loginType = loginType;
            this.loginId = loginId;
            this.loginPwd = loginPwd;
            this.hpNo = hpNo;
            this.email = email;
            this.leaveYn = leaveYn;
            this.joinDate = joinDate;
        }
        
        public Member toEntity() {
            return Member.builder()
                    .memberName(memberName)
                    .loginType("Y")
                    .loginId(loginId)
                    .loginPwd(loginPwd)
                    .hpNo(hpNo)
                    .email(email)
                    .leaveYn("N")
                    .joinDate(LocalDateTime.now())
                    .build();
        }
    

     

    entity를 → dto로 바꾸기

    • 기존
    public MemberDto getMember(Long memberSeq) {
        Member member = memberRepository.findById(memberSeq).orElse(null);
        MemberDto memberDto = MemberDto.builder()
                .memberSeq(member.getMemberSeq())
                .memberName(member.getMemberName())
                .loginId(member.getLoginId())
                .loginType(member.getLoginType())
                .build();
        return memberDto;
    }

     
    사용 : member.toDto();

    @Builder
        public Member(Long memberSeq, String memberName, String loginType, String loginId, String loginPwd, String hpNo, String email, String leaveYn, LocalDateTime joinDate) {
            this.memberSeq = memberSeq;
            this.memberName = memberName;
            this.loginType = loginType;
            this.loginId = loginId;
            this.loginPwd = loginPwd;
            this.hpNo = hpNo;
            this.email = email;
            this.leaveYn = leaveYn;
            this.joinDate = joinDate;
        }
        public MemberDto toDto() {
            return MemberDto.builder()
                    .memberSeq(memberSeq)
                    .memberName(memberName)
                    .loginId(loginId)
                    .loginType(loginType)
                    .build();
        }
    

     

    뭐든 정답은 아니기 때문에 상황에 맞춰서 사용하기! 

    댓글