fix(store-service, owner-vue): item 저장 및 수정

- item 조회후 DTO로 변환하는 과정에서 N+1 해결
- Category 조회시 N+1 해결
This commit is contained in:
hoon7566
2022-03-01 15:45:12 +09:00
parent ca61356a2d
commit 59f9651924
9 changed files with 126 additions and 68 deletions

View File

@@ -0,0 +1,34 @@
import axios from "axios";
export default {
getCategoryList(){
return axios.get(process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category');
},
putCategoryList(data){
return this.$axios({
method:'put',
url:process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: data,
responseType:'json'
})
},
getItemById(itemId){
return axios.get(process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/item/'+itemId)
},
saveItem(method, itemData){
return axios({
method:method,
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/item',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: itemData,
responseType:'json'
})
},
}

View File

@@ -56,6 +56,7 @@
<script>
import draggable from 'vuedraggable'
import store from "@/api/store";
import {
mdiContentSave, mdiDelete,
mdiPlus,
@@ -114,41 +115,23 @@ export default {
}
data.categoryList.push(category)
})
console.log(data)
this.$axios({
method:'put',
url:process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: data,
responseType:'json'
})
.then(function (response) {
console.log(response)
vm.deletedList=[]
vm.getCategoryList()
store.putCategoryList(data)
.then(function () {
vm.deletedList=[]
vm.getCategoryList()
});
},
getCategoryList:function(){
var vm =this;
console.log(process.env.OWNER_SERVICE_BASEURL)
this.$axios({
method:'get',
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
responseType:'json'
})
store.getCategoryList()
.then(function (response) {
console.log(response.data.data)
vm.categoryList = response.data.data;
});
}
},
mounted() {
alert()
this.getCategoryList();
}
}

View File

@@ -72,6 +72,7 @@ import {
} from '@mdi/js'
// import axios from "axios";
import MenuItem from "@/views/MenuItem";
import store from "@/api/store";
export default {
name: "Menu",
@@ -170,41 +171,31 @@ export default {
otherOption : []
}
this.$axios({
method:'get',
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
responseType:'json'
})
.then(function (response) {
response.data.data.forEach(function (ele){
vm.modalData.categoryList.push(ele)
})
});
store.getCategoryList()
.then(function (response) {
response.data.data.forEach(function (ele){
vm.modalData.categoryList.push(ele)
})
});
},
editModalOpen:function(item){
var vm = this
this.getModalData();
// var vm =this;
this.$axios({
method:'get',
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/item/'+item.id,
responseType:'json'
})
.then(function (response) {
var item = response.data.data;
vm.modalData.itemId = item.id;
vm.modalData.itemName = item.name;
vm.modalData.itemPrice = item.price;
vm.modalData.categoryId = item.categoryId;
item.itemOptions.forEach(function(ele){
console.log(ele)
if(ele.optionType === "REQUIRED")
vm.modalData.requiredOption.push(ele)
else
vm.modalData.otherOption.push(ele)
})
});
store.getItemById(item.id)
.then(function (response) {
var item = response.data.data;
vm.modalData.itemId = item.id;
vm.modalData.itemName = item.name;
vm.modalData.itemPrice = item.price;
vm.modalData.categoryId = item.categoryId;
item.itemOptions.forEach(function(ele){
if(ele.optionType === "REQUIRED")
vm.modalData.requiredOption.push(ele)
else
vm.modalData.otherOption.push(ele)
})
});
},
itemSave:function(){
var method =''
@@ -214,16 +205,7 @@ export default {
else
method='post'
this.$axios({
method:method,
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/item',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: itemData,
responseType:'json'
})
store.saveItem(method,itemData)
.then(response => console.log(response))
.catch(reason => console.log(reason))

View File

@@ -22,11 +22,11 @@ public class CategoryDto {
private Store store;
private List<ItemDto> items;
public CategoryDto(Category category) {
this.id = category.getId();
this.name = category.getName();
this.order = category.getOrder();
this.store = category.getStore();
this.items = category.getItems().stream()
.map(ItemDto::createItemDto)
.collect(Collectors.toList());

View File

@@ -0,0 +1,37 @@
package com.justpickup.storeservice.domain.category.repository;
import com.justpickup.storeservice.domain.category.entity.Category;
import com.justpickup.storeservice.domain.category.entity.QCategory;
import com.justpickup.storeservice.domain.item.entity.QItem;
import com.justpickup.storeservice.domain.store.entity.QStore;
import com.querydsl.core.QueryFactory;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class CategoryRepositoryCustom {
private final JPAQueryFactory jpaQueryFactory;
public List<Category> getCategoryList(Long storeId){
List<Category> categoryList = jpaQueryFactory.selectFrom(QCategory.category)
.leftJoin(QCategory.category.items, QItem.item).fetchJoin()
.join(QCategory.category.store, QStore.store).fetchJoin()
.where(QCategory.category.store.id.eq(storeId))
.orderBy(QCategory.category.order.asc())
.distinct()
.fetch();
return categoryList;
}
}

View File

@@ -4,6 +4,7 @@ import com.justpickup.storeservice.domain.category.dto.CategoryDto;
import com.justpickup.storeservice.domain.category.entity.Category;
import com.justpickup.storeservice.domain.category.exception.NotFoundStoreException;
import com.justpickup.storeservice.domain.category.repository.CategoryRepository;
import com.justpickup.storeservice.domain.category.repository.CategoryRepositoryCustom;
import com.justpickup.storeservice.domain.store.entity.Store;
import com.justpickup.storeservice.domain.store.repository.StoreRepository;
import com.justpickup.storeservice.global.exception.CustomException;
@@ -23,17 +24,18 @@ import java.util.stream.Collectors;
public class CategoryService {
private final CategoryRepository categoryRepository;
private final CategoryRepositoryCustom categoryRepositoryCustom;
private final StoreRepository storeRepository;
public List<CategoryDto> getCategoryList(Long storeId){
return categoryRepository.findAllByStoreIdOrderByOrder(storeId)
return categoryRepositoryCustom.getCategoryList(storeId)
.stream()
.map(CategoryDto::new)
.collect(Collectors.toList());
}
@Transactional(readOnly = false)
@Transactional
public void putCategoryList(Long storeId , List<CategoryDto> categoryDtoList , List<CategoryDto> deletedCategoryDtoList ){
Store store = storeRepository.findById(storeId)

View File

@@ -66,7 +66,11 @@ public class ItemDto {
return ItemDto.builder()
.id(item.getId())
.name(item.getName())
.categoryDto(new CategoryDto(item.getCategory()))
.categoryDto(CategoryDto.builder()
.id(item.getCategory().getId())
.name(item.getCategory().getName())
.order(item.getCategory().getOrder())
.build())
.price(item.getPrice())
.salesYn(item.getSalesYn())
.itemOptions(item.getItemOptions()

View File

@@ -3,6 +3,8 @@ package com.justpickup.storeservice.domain.item.repository;
import com.justpickup.storeservice.domain.category.entity.QCategory;
import com.justpickup.storeservice.domain.item.entity.Item;
import com.justpickup.storeservice.domain.item.entity.QItem;
import com.justpickup.storeservice.domain.itemoption.entity.ItemOption;
import com.justpickup.storeservice.domain.itemoption.entity.QItemOption;
import com.justpickup.storeservice.domain.store.entity.QStore;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
@@ -12,6 +14,7 @@ import org.springframework.data.support.PageableExecutionUtils;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
@RequiredArgsConstructor
@@ -19,6 +22,16 @@ public class ItemRepositoryCustom {
private final JPAQueryFactory queryFactory;
public Optional<Item> findById(Long itemId){
Item item = queryFactory.selectFrom(QItem.item)
.join(QItem.item.itemOptions, QItemOption.itemOption).fetchJoin()
.join(QItem.item.category,QCategory.category).fetchJoin()
.where(QItem.item.id.eq(itemId))
.fetchOne();
return Optional.ofNullable(item);
}
public Page<Item> findItem(Long storeId,String word, Pageable pageable){
//count 가져오기

View File

@@ -22,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
@@ -40,12 +41,13 @@ public class ItemServiceImpl implements ItemService {
@Override
public ItemDto findItemByItemId(Long itemId) {
Item findItem = itemRepository.findById(itemId)
Item findItem = itemRepositoryCustom.findById(itemId)
.orElseThrow(() -> new NotExistItemException("존재하지 않는 아이템 입니다."));
return ItemDto.createWithCategoryItemDtoAndItemOption(findItem);
}
@Override
public Page<ItemDto> findItemList( Long storeId,String word, Pageable pageable) {
@@ -73,6 +75,7 @@ public class ItemServiceImpl implements ItemService {
itemOptionDtos
.forEach(itemOptionDto -> {
if(itemOptionDto.getId()==null) return;
if (itemOptionRepository.existsById(itemOptionDto.getId()))
itemOptionRepository.save(ItemOptionDto.createItemOption(itemOptionDto, item));
});