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>
|
<script>
|
||||||
import draggable from 'vuedraggable'
|
import draggable from 'vuedraggable'
|
||||||
|
import store from "@/api/store";
|
||||||
import {
|
import {
|
||||||
mdiContentSave, mdiDelete,
|
mdiContentSave, mdiDelete,
|
||||||
mdiPlus,
|
mdiPlus,
|
||||||
@@ -114,41 +115,23 @@ export default {
|
|||||||
}
|
}
|
||||||
data.categoryList.push(category)
|
data.categoryList.push(category)
|
||||||
})
|
})
|
||||||
console.log(data)
|
|
||||||
|
|
||||||
this.$axios({
|
store.putCategoryList(data)
|
||||||
method:'put',
|
.then(function () {
|
||||||
url:process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
|
vm.deletedList=[]
|
||||||
headers: {
|
vm.getCategoryList()
|
||||||
'Accept': 'application/json',
|
|
||||||
'Content-Type': 'application/json;charset=UTF-8'
|
|
||||||
},
|
|
||||||
data: data,
|
|
||||||
responseType:'json'
|
|
||||||
})
|
|
||||||
.then(function (response) {
|
|
||||||
console.log(response)
|
|
||||||
vm.deletedList=[]
|
|
||||||
vm.getCategoryList()
|
|
||||||
});
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
getCategoryList:function(){
|
getCategoryList:function(){
|
||||||
var vm =this;
|
var vm =this;
|
||||||
console.log(process.env.OWNER_SERVICE_BASEURL)
|
store.getCategoryList()
|
||||||
this.$axios({
|
|
||||||
method:'get',
|
|
||||||
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
|
|
||||||
responseType:'json'
|
|
||||||
})
|
|
||||||
.then(function (response) {
|
.then(function (response) {
|
||||||
console.log(response.data.data)
|
|
||||||
vm.categoryList = response.data.data;
|
vm.categoryList = response.data.data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
alert()
|
|
||||||
this.getCategoryList();
|
this.getCategoryList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ import {
|
|||||||
} from '@mdi/js'
|
} from '@mdi/js'
|
||||||
// import axios from "axios";
|
// import axios from "axios";
|
||||||
import MenuItem from "@/views/MenuItem";
|
import MenuItem from "@/views/MenuItem";
|
||||||
|
import store from "@/api/store";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Menu",
|
name: "Menu",
|
||||||
@@ -170,41 +171,31 @@ export default {
|
|||||||
otherOption : []
|
otherOption : []
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$axios({
|
store.getCategoryList()
|
||||||
method:'get',
|
.then(function (response) {
|
||||||
url: process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/category',
|
response.data.data.forEach(function (ele){
|
||||||
responseType:'json'
|
vm.modalData.categoryList.push(ele)
|
||||||
})
|
})
|
||||||
.then(function (response) {
|
});
|
||||||
response.data.data.forEach(function (ele){
|
|
||||||
vm.modalData.categoryList.push(ele)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
editModalOpen:function(item){
|
editModalOpen:function(item){
|
||||||
var vm = this
|
var vm = this
|
||||||
this.getModalData();
|
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)
|
store.getItemById(item.id)
|
||||||
if(ele.optionType === "REQUIRED")
|
.then(function (response) {
|
||||||
vm.modalData.requiredOption.push(ele)
|
var item = response.data.data;
|
||||||
else
|
vm.modalData.itemId = item.id;
|
||||||
vm.modalData.otherOption.push(ele)
|
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(){
|
itemSave:function(){
|
||||||
var method =''
|
var method =''
|
||||||
@@ -214,16 +205,7 @@ export default {
|
|||||||
else
|
else
|
||||||
method='post'
|
method='post'
|
||||||
|
|
||||||
this.$axios({
|
store.saveItem(method,itemData)
|
||||||
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'
|
|
||||||
})
|
|
||||||
.then(response => console.log(response))
|
.then(response => console.log(response))
|
||||||
.catch(reason => console.log(reason))
|
.catch(reason => console.log(reason))
|
||||||
|
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ public class CategoryDto {
|
|||||||
private Store store;
|
private Store store;
|
||||||
private List<ItemDto> items;
|
private List<ItemDto> items;
|
||||||
|
|
||||||
|
|
||||||
public CategoryDto(Category category) {
|
public CategoryDto(Category category) {
|
||||||
this.id = category.getId();
|
this.id = category.getId();
|
||||||
this.name = category.getName();
|
this.name = category.getName();
|
||||||
this.order = category.getOrder();
|
this.order = category.getOrder();
|
||||||
this.store = category.getStore();
|
|
||||||
this.items = category.getItems().stream()
|
this.items = category.getItems().stream()
|
||||||
.map(ItemDto::createItemDto)
|
.map(ItemDto::createItemDto)
|
||||||
.collect(Collectors.toList());
|
.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.entity.Category;
|
||||||
import com.justpickup.storeservice.domain.category.exception.NotFoundStoreException;
|
import com.justpickup.storeservice.domain.category.exception.NotFoundStoreException;
|
||||||
import com.justpickup.storeservice.domain.category.repository.CategoryRepository;
|
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.entity.Store;
|
||||||
import com.justpickup.storeservice.domain.store.repository.StoreRepository;
|
import com.justpickup.storeservice.domain.store.repository.StoreRepository;
|
||||||
import com.justpickup.storeservice.global.exception.CustomException;
|
import com.justpickup.storeservice.global.exception.CustomException;
|
||||||
@@ -23,17 +24,18 @@ import java.util.stream.Collectors;
|
|||||||
public class CategoryService {
|
public class CategoryService {
|
||||||
|
|
||||||
private final CategoryRepository categoryRepository;
|
private final CategoryRepository categoryRepository;
|
||||||
|
private final CategoryRepositoryCustom categoryRepositoryCustom;
|
||||||
private final StoreRepository storeRepository;
|
private final StoreRepository storeRepository;
|
||||||
|
|
||||||
public List<CategoryDto> getCategoryList(Long storeId){
|
public List<CategoryDto> getCategoryList(Long storeId){
|
||||||
|
|
||||||
return categoryRepository.findAllByStoreIdOrderByOrder(storeId)
|
return categoryRepositoryCustom.getCategoryList(storeId)
|
||||||
.stream()
|
.stream()
|
||||||
.map(CategoryDto::new)
|
.map(CategoryDto::new)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = false)
|
@Transactional
|
||||||
public void putCategoryList(Long storeId , List<CategoryDto> categoryDtoList , List<CategoryDto> deletedCategoryDtoList ){
|
public void putCategoryList(Long storeId , List<CategoryDto> categoryDtoList , List<CategoryDto> deletedCategoryDtoList ){
|
||||||
|
|
||||||
Store store = storeRepository.findById(storeId)
|
Store store = storeRepository.findById(storeId)
|
||||||
|
|||||||
@@ -66,7 +66,11 @@ public class ItemDto {
|
|||||||
return ItemDto.builder()
|
return ItemDto.builder()
|
||||||
.id(item.getId())
|
.id(item.getId())
|
||||||
.name(item.getName())
|
.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())
|
.price(item.getPrice())
|
||||||
.salesYn(item.getSalesYn())
|
.salesYn(item.getSalesYn())
|
||||||
.itemOptions(item.getItemOptions()
|
.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.category.entity.QCategory;
|
||||||
import com.justpickup.storeservice.domain.item.entity.Item;
|
import com.justpickup.storeservice.domain.item.entity.Item;
|
||||||
import com.justpickup.storeservice.domain.item.entity.QItem;
|
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.justpickup.storeservice.domain.store.entity.QStore;
|
||||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -12,6 +14,7 @@ import org.springframework.data.support.PageableExecutionUtils;
|
|||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@@ -19,6 +22,16 @@ public class ItemRepositoryCustom {
|
|||||||
|
|
||||||
private final JPAQueryFactory queryFactory;
|
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){
|
public Page<Item> findItem(Long storeId,String word, Pageable pageable){
|
||||||
|
|
||||||
//count 가져오기
|
//count 가져오기
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -40,12 +41,13 @@ public class ItemServiceImpl implements ItemService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemDto findItemByItemId(Long itemId) {
|
public ItemDto findItemByItemId(Long itemId) {
|
||||||
Item findItem = itemRepository.findById(itemId)
|
Item findItem = itemRepositoryCustom.findById(itemId)
|
||||||
.orElseThrow(() -> new NotExistItemException("존재하지 않는 아이템 입니다."));
|
.orElseThrow(() -> new NotExistItemException("존재하지 않는 아이템 입니다."));
|
||||||
|
|
||||||
return ItemDto.createWithCategoryItemDtoAndItemOption(findItem);
|
return ItemDto.createWithCategoryItemDtoAndItemOption(findItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<ItemDto> findItemList( Long storeId,String word, Pageable pageable) {
|
public Page<ItemDto> findItemList( Long storeId,String word, Pageable pageable) {
|
||||||
|
|
||||||
@@ -73,6 +75,7 @@ public class ItemServiceImpl implements ItemService {
|
|||||||
|
|
||||||
itemOptionDtos
|
itemOptionDtos
|
||||||
.forEach(itemOptionDto -> {
|
.forEach(itemOptionDto -> {
|
||||||
|
if(itemOptionDto.getId()==null) return;
|
||||||
if (itemOptionRepository.existsById(itemOptionDto.getId()))
|
if (itemOptionRepository.existsById(itemOptionDto.getId()))
|
||||||
itemOptionRepository.save(ItemOptionDto.createItemOption(itemOptionDto, item));
|
itemOptionRepository.save(ItemOptionDto.createItemOption(itemOptionDto, item));
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user