Chewing 리뷰 & 예약 쿼리 리팩토링

Crow·2022년 12월 27일
0

현재 Review등록 로직은 다음과같음

Review.Java

package io.web.chewing.Entity;

import io.web.chewing.config.security.dto.AuthMemberDTO;
import lombok.*;
import org.apache.ibatis.javassist.NotFoundException;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Objects;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Table
@EntityListeners(value = {AuditingEntityListener.class})
public class Review implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "store_name", referencedColumnName = "name")
    private Store store_name;

    @NonNull
    private double rate;

    @OneToOne
    @JoinColumn(name = "member_nickname", referencedColumnName = "nickname")
    private Member member_id;

    @Column(length = 500)
    private String content;

    @CreatedDate
    @Column(name = "creat_time", updatable = false)
    private String created_at;

    @LastModifiedDate
    @Column(name = "modify_time")
    private String modified_at;

    public void change(String content) {
        this.content = content;
    }

    public void assignUser(Member member) {

        this.member_id = member;
    }
}

리뷰를 등록할때 @OneToOne관계인 Member Entity와
@ManyToOne관계인 Store Entity가 필요한대

지금은 저 두개를 select할때 Jpa에 Entity를 사용하지만 이걸 개선해서 dto를 사용해서 id값이나 스토어명 or 닉네임만을 반환하는 구조로 개선할까함

id 값만 서치하고 Review Entity를 build할때도 지금의 Entity 전부를 스캔해서 주입하고 Store는 주입하지만 Member는 따로 메서드를 따서 주입하는 구조인대 한번에 빌드할때 주입하게 만들 예정임
Service.java

Optional<Store> getStore = storeRepository.findByName(store_name);
        Store findStore = getStore.orElseThrow();

이렇게 전부 검색할 필요 없이 id값만 dto를 통해서 서치해오면 저렴한 비용으로 원하는 효과를 낼 수 있음

ReviewDto.java

    public Review toEntity(Store store){

        return Review.builder()
                .store_name(store)
                .rate(rate)
                .content(content).build();
    }

멤버를 따로빌드해서 set과 같은 메서드를 만들어서 주입하는 방식임

Member loadMember = getBuild(principalUser);

    private static Member getBuild(PrincipalUser principalUser) {
        return Member.builder()
                .id(0L)
                .nickname(principalUser.providerUser().getNickName())
                .password(principalUser.providerUser().getPassword())
                .delete_yn('0')
                .email(principalUser.providerUser().getEmail())
                .provider(principalUser.providerUser().getProvider())
                .build();
    }

이것 역시 Member의 NickName만 dto를 통해서 서치해오면 저렴한 비용으로 원하는 효과를 낼 수 있음


이 구조 자체도 id값이 아니고 nickname값으로 검색하기 때문에 문제가 됨

지금 store는 id값으로 검색파라미터를 사용 하고 리뷰와 예약은 회원 닉네임 값으로 검색 파라미터를 사용함

별도의 이유가 없으면 id값으로 검색하는게 맞지만
내가 id값을 파라미터로 사용시 닉네임이나 가게 이름이 필요할때 마다 select 쿼리를 돌려야 한다고 생각이 들어서
닉네임 & 가게 이름으로 서치를 하는 쿼리를 만들었음

id값을 가져와서 통일성을 줘야할꺼 같기도 하고
id값으로 스토어명이 필요할때마다 검색하는게 비효율적인거 같기도함..

일단 woowacon 2020 수십억건에서 Querydsl 영상에서 본 대로
review를 빌드할때
.store(New Store(StoreId)) 이 구조를 해보려면 id값이 필요하니 그렇게 잠정 결론을 낼 생각임

profile
어제보다 개발 더 잘하기 / 많이 듣고 핵심만 정리해서 말하기 / 도망가지 말기 / 깃허브 위키 내용 가져오기

0개의 댓글