fix(store-service, owner-vue): item 저장 및 수정
- item 조회후 DTO로 변환하는 과정에서 N+1 해결 - Category 조회시 N+1 해결
This commit is contained in:
34
owner-vue/src/api/store.js
Normal file
34
owner-vue/src/api/store.js
Normal 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'
|
||||
})
|
||||
},
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 가져오기
|
||||
|
||||
@@ -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));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user