From 19447e1a42361e371e489bbd3bf8e04f210cce57 Mon Sep 17 00:00:00 2001 From: Minuooooo Date: Wed, 26 Jul 2023 08:40:49 +0900 Subject: [PATCH 1/6] [ feat ] Store initial data in dev env --- src/main/resources/application-dev.yml | 10 +- src/main/resources/sql/data.sql | 195 +++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/sql/data.sql diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 693b509..9f8f497 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -14,10 +14,10 @@ spring: # check-location: false # baseline-on-migration: true -# sql: -# init: -# mode: always -# data-locations: classpath:sql/data.sql + sql: + init: + mode: always + data-locations: classpath:sql/data.sql jpa: open-in-view: false @@ -31,7 +31,7 @@ spring: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl database: mysql database-platform: org.hibernate.dialect.MySQL8Dialect -# defer-datasource-initialization: true + defer-datasource-initialization: true logging: level: diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql new file mode 100644 index 0000000..929b145 --- /dev/null +++ b/src/main/resources/sql/data.sql @@ -0,0 +1,195 @@ +insert into store(created_at, updated_at, category, name, web_url, location, phone, image_url, running_time) +values + ('2023-07-24', '2023-07-24', 'REFILL', '알맹상점 리스테이션', null, '서울특별시 중구 한강대로 405', '070-7777-1925', null, '매일 14:00-20:00 / 월요일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(종로점)', null, '서울특별시 종로구 필운대로 23', '02-735-7161', null, '월-토 10:00-21:00 일 10:00-19:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '북촌감성', 'https://bukchonfeel.modoo.at', '서울특별시 종로구 계동길 60', '010-2781-1217', null, '수~월 11:00~19:00, 화 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '아토모스', 'https://www.atomos-store.kr/', '서울특별시 성북구 성북로8길 11', '02-6012-2102', null, '11:00-21:00 수 / 2,4번째주 화 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '셉틱탱크', 'https://septic-tank.co.kr/', '서울특별시 서대문구 간호대로3길 24-8', '0507-1343-4174', null, '예약제'), + ('2023-07-24', '2023-07-24', 'REFILL', '늘보따리', null, '서울특별시 서대문구 연희로4길 24', '02-2658-0561', 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395_zerowaste_20230309163613_1.png', + '월~일 13:00~20:00 (목요일 휴무)'), + ('2023-07-24', '2023-07-24', 'REFILL', '퍼즐리', null, '서울특별시 마포구 신수로 46', '02-1544-4253', null, '월-금 2:00-18:00 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '코스메틱미아', null, '서울특별시 서대문구 명지대7길 13', null, null, '월-토 14:00-21:00 화 14:00-18:00 일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(녹번역점)', null, '서울특별시 은평구 은평로 245', '02-6010-6233', null, '월-토 10:00-21:00 일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '일상공감_길음', null, '서울특별시 성북구 삼양로 27', '0507-1346-1190', null, '월~금 11:00~20:00, 토일 13:00~20:00, 변동휴무(인스타참조)'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(백련산점)', null, '서울특별시 은평구 응암로22길 21', '02-6748-6233', null, '월-금 10:00-21:00 토-일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(북가좌점)', null, '서울특별시 서대문구 수색로 100', '02-305-0518', null, '월-금 10:00-21:00 토-일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(성산점)', 'https://woollimcoop.org/', '서울특별시 마포구 성미산로 27', '02-3141-0518', null, '월-금 10:00-21:00 토-일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '알맹상점', 'https://almang.net/', '서울특별시 마포구 월드컵로 49', '0507-1393-8913', null, '매일 14:00-20:00 / 월요일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(종암점)', null, '서울특별시 성북구 종암로21길 124', '02-924-0450', null, '월-금 9:00-20:00 토 10:00-19:00 일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '제로웨이스트 공방 꽃삼월', null, '서울특별시 동대문구 답십리로30길 22-1', '0507-1380-5365', null, '화수목 13시~19시/ 금,토,일 11시~19시(원데이클래스)/ 매주 월 & 법정공휴일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '아로마티카 제로스테이션', 'https://aromatica.co.kr/brand/zero_station.html', '서울특별시 강남구 도산대로1길 62', '02-1600-3689', null, '매일 11:00 - 20:00 추석 전일,당일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '르라보 가로수길점', 'https://www.lelabofragrances.com/', '서울특별시 강남구 압구정로10길 28', '02-541-7945', null, '매일 11:00 - 20:00, 2째 월요일 정기휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '에코스토어(ecostore) 더현대서울', 'https://korea.ecostore.com/', '서울특별시 영등포구 여의대로 108', '02-767-2233', null, '평일10:30~20:00, 금토일 10:30~20:30'), + ('2023-07-24', '2023-07-24', 'REFILL', '햇빛상점', null, '서울특별시 은평구 연서로 16', '02-3157-2649', null, '월~토 10:00~20:00 일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(응암역점)', null, '서울특별시 은평구 연서로 9', '02-356-6233', null, '월-토 10:00-21:00 일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(미아점)', null, '서울특별시 강북구 삼양로27길 46', '02-980-0450', null, '월-금 9:00-20:00, 토 10:00-19:00 일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(상도점)', null, '서울특별시 동작구 상도로 217-4', '02-826-3385', null, '월-금 10:00-21:00 토-일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(구산점)', null, '서울특별시 은평구 서오릉로 175', '02-385-6233', null, '월-토 10:00-21:00 일 12:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '덕분애', null, '서울특별시 서초구 서운로26길 11', '02-6959-4479', null, '월~토 12~8시, 일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '어쩌다에코', null, '서울특별시 영등포구 양평로28마길 7', '0507-1353-1547', null, '월-금 10:00-20:00 토, 일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '더바디샵 강남대로점', 'https://www.thebodyshop.co.kr/', '서울특별시 서초구 강남대로 449', '02-3482-4526', null, '매일 11:00~22:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '탄탄제로', null, '서울특별시 동작구 사당로16다길 56', '070-4035-3318', null, '월-토 11:00-19:00 일,공휴일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '지구살림터', 'https://jigusallimter.modoo.at/', '서울특별시 양천구 목동중앙북로16길 41', '070-7670-1004', + 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395_zerowaste_20230309143130_1.jpg', '화-토 11:00-20:00, / 일 13:00-17:00 / 월휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(진관점)', null, '서울특별시 은평구 진관3로 67', '02-352-6233', null, '월-토 10:00-21:00 일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '보탬상점', null, '서울특별시 중랑구 봉화산로22길 2', '010-2175-2026', null, '매일11:00~20:00, 일휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '행복한나눔', null, '서울특별시 강서구 공항대로 543', '02-3861-8306', null, '월-금 10:00-19:00 Break Time 12:30-13:30 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '다숲', 'https://dasoopin.modoo.at/', '서울특별시 관악구 관악로 140', '02-877-0110', null, null), + ('2023-07-24', '2023-07-24', 'REFILL', '카페535', 'https://smartstore.naver.com/cafe535', '서울특별시 중랑구 공릉로2길 23', '02-971-5351', null, '월-일 9:30-21:00 (수 9:30-18:00)'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(도곡점)', null, '서울특별시 강남구 남부순환로365길 22', '02-3462-7117', null, '월-토 10:00-21:00 일 10:00-19:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '1.5도씨', null, '서울특별시 관악구 조원로18길 15', '0507-1355-9173', null, '10:00-20:00 / 월요일 휴무'), + ('2023-07-24', '2023-07-24', 'REFILL', '바느질하는 바리스타', null, '서울특별시 양천구 은행정로5길 12', null, null, '월~토 9시~21시'), + ('2023-07-24', '2023-07-24', 'REFILL', '두레생협(남구로점)', null, '서울특별시 구로구 도림로12길 27', '02-838-5615', null, '월-금 10:00-21:00 토-일 10:00-18:00'), + ('2023-07-24', '2023-07-24', 'REFILL', '놀자샵', null, '서울특별시 강서구 강서로29길 27', '02-6339-0979', null, '월~금 10:00~17:30(주말 불규칙적 오픈)'), + ('2023-07-25', '2023-07-25', 'REFILL', '숨공춤공', null, '서울특별시 양천구 신월로 220', '070-7576-4977', null, '월~금 10:00-16:00 토,일 휴무'), + ('2023-07-25', '2023-07-25', 'REFILL', '공기(대안생활 1호점)', null, '서울특별시 강동구 상암로 10', '010-9948-0716', null, '월~금 09:00~18:00/ 토, 일, 공휴일 휴무'), + ('2023-07-25', '2023-07-25', 'REFILL', '큐클리프', 'https://cueclyp.com/', '서울특별시 송파구 올림픽로57길 2', '070-8712-0324', null, '월-금 10:00-18:00'), + ('2023-07-25', '2023-07-25', 'REFILL', '송포어스', null, '서울특별시 강동구 풍성로35길 34', '070-8095-3534', null, '화, 수, 목, 금, 토, 일 11:00~20:00/ 휴무 월요일'), + ('2023-07-25', '2023-07-25', 'REFILL', '제로웨이스트샵 선택지', 'https://smartstore.naver.com/suntackz', '서울특별시 강동구 천호옛12길 47', '070-4141-1724', null, '월~금 11:00~19:00, 주말 휴무'), + ('2023-07-25', '2023-07-25', 'REFILL', '동네방네', null, '서울특별시 노원구 한글비석로24라길 87', '02-938-3583', null, '월~금 09:30~20:00 토 10:00~18:00'), + ('2023-07-25', '2023-07-25', 'REFILL', '올가홀푸드(방이점)', 'https://shop.pulmuone.co.kr/orga', '서울특별시 송파구 양재대로71길 4', '02-418-6255', null, '월-일 10:00-22:00'), + ('2023-07-25', '2023-07-25', 'REFILL', '지미프로젝트', 'https://smartstore.naver.com/aboutyuri', '서울특별시 송파구 오금로36길 66', '070-8065-7655', null, '월-금 14:00-18:00 토,일 휴무'), + ('2023-07-25', '2023-07-25', 'REFILL', '빛과소금', null, '서울특별시 송파구 오금로35길 17', null, null, '월-금 9:00-19:00 토,일 휴무'), + ('2023-07-25', '2023-07-25', 'REFILL', '더금하제로마켓', null, '서울특별시 금천구 금하로1다길 16', null, null, null), + ('2023-07-25', '2023-07-25', 'REFILL', '지구손길 제로샵', null, '서울특별시 구로구 천왕로 21', '02-2619-1106', null, '월-금 10:00-18:00 토 14:00-18:00 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '곰냥콩냥드루와', null, '서울특별시 강서구 강서로 24', '0507-1326-7939', null, '화~일 10:00 ~ 22:00, 월 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '공상온도', null, '서울특별시 마포구 동교로 40', '0507-1404-0247', null, '월~목,일 12:30 ~ 20:00, 금 12:30 ~ 18:00, 토 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '광진구청', null, '서울특별시 광진구 자양로 117', '02-450-1114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '구로구청', null, '서울특별시 구로구 가마산로 245', '02-860-2114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '구로구청 카페_카페95', null, '서울특별시 구로구 가마산로 245', '02-860-2146', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '국민대학교 교내카페 (카페나무)', null, '서울특별시 성북구 정릉로 119-39', '02-910-4114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '금천구청', null, '서울특별시 금천구 시흥대로73길 70', '02-2627-2114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '꿈꾸는 고래', null, '서울특별시 은평구 갈현로9길 5-16', '070-7809-7482', null, null), + ('2023-07-24', '2023-07-24', 'CAFE', '노들섬(블루메쯔)', null, '서울특별시 용산구 양녕로 445', '0507-1375-6658', null, '화~일 11:00 ~ 21:00, 월 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '노들섬A(노들펍)', null, '서울특별시 용산구 양녕로 445', '0507-1343-7951', null, '매일 12:00 ~ 21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '노들섬B', null, '서울특별시 용산구 양녕로 445', null, null, '월~금 07:00 ~ 22:00, 토-일 09:00-21:30'), + ('2023-07-24', '2023-07-24', 'CAFE', '노들섬C(올두바이)', null, '서울특별시 용산구 양녕로 445', '0507-1372-1986', null, '매일 10:00 ~ 21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '노들섬D', null, '서울특별시 용산구 양녕로 445', null, null, '월~금 07:00 ~ 22:00, 토-일 09:00-21:30'), + ('2023-07-24', '2023-07-24', 'CAFE', '노원구청', null, '서울특별시 노원구 노해로 437', '02-2116-3114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '노원구청 카페_노원437', null, '서울특별시 노원구 노해로 437', '02-2116-3510', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '니트앤커피', null, '서울특별시 중구 청계천로 208', '0507-1393-3413', null, '월~금 07:00 ~ 18:00, 토 07:00-17:00. 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '다-용도실', null, '서울특별시 중구 청계천로 208', '0507-1393-3413', null, '월~금 07:00 ~ 18:00, 토 07:00-17:00. 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '대신증권A,B,C_사내카페', null, '서울특별시 중구 삼일대로 343', '0507-1393-3413', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '댄싱컵', null, '서울특별시 강서구 마곡동로 61', '02-3663-7588', null, '월~금 07:00 ~ 22:00, 토,일 10:30-21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '더데일리카페인을지로', null, '서울특별시 중구 마른내로2길 6', '0507-1334-6928', null, '월~금 08:00 ~ 19:00, 토 12:00-19:00. 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '더라운지', null, '서울특별시 중구 을지로 65', null, null, null), + ('2023-07-24', '2023-07-24', 'CAFE', '더테이블', null, '서울특별시 중구 을지로 65', null, null, null), + ('2023-07-24', '2023-07-24', 'CAFE', '드롭탑 서여의도점', null, '서울특별시 영등포구 국회대로70길 7', '02-3775-3230', null, '매일 00:00 - 24:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '디벙크', null, '서울특별시 마포구 성지1길 30', '02-6930-5598', null, '매일 10:00 ~ 23:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '라데팡스', null, '서울특별시 강서구 마곡중앙6로 45', '0507-1346-6585', null, '월~금 10:20 ~ 21:00, 토,일 12:00-21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '라라당', null, '서울특별시 중구 남대문로9길 51', null, null, '월~금 07:30 ~ 17:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '로담', null, '서울특별시 강북구 도봉로89길 9', '02-999-15830', null, '평일 07:30~23:00 토요일 10:00~23:00 일요일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '로코랩', null, '서울특별시 종로구 율곡로4길 51', '02-3210-3258', null, '월~금 08:30 ~ 21:00, 토 11:00 ~ 20:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '리트리트 커피 로스터즈', null, '서울특별시 강북구 한천로139길 11', '0507-1362-7847', null, '평일 08:00~20:00, 주말, 공휴일 10:00~19:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '마을과마디_새록', null, '서울특별시 노원구 화랑로 464', '02-977-1318', null, '화~토 10시~22시, 일 12시~21시'), + ('2023-07-24', '2023-07-24', 'CAFE', '마포구청', null, '서울특별시 마포구 월드컵로 212', '02-3153-8114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '마포구청 카페_티타임', null, '서울특별시 마포구 월드컵로 212', '070-4237-6538', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '매듭달', null, '서울특별시 양천구 목동중앙북로 68', '010-9310-1507', null, '매일 10:00 ~ 22:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '모카리아', null, '서울특별시 마포구 월드컵북로44길 76-12', '02-372-9990', null, '매일 09:00 ~ 22:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '목카페', null, '서울특별시 강서구 금낭화로24길 29-5', '02-2661-8265', null, '월~금 10:00 ~ 20:00, 토,일 12:00 ~ 20:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '몽슈크레', null, '서울특별시 강서구 마곡중앙6로 45', null, null, '매일 09:30 ~ 22:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '민박컾', null, '서울특별시 강북구 노해로14길 24', '070-7779-5219', null, '평일 08:00~20:00, 주말 12:00~20:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '보틀라운지', null, '서울특별시 서대문구 홍연길 26', '02-3144-0703', null, '매일 11:00~22:00(월요일 휴무)'), + ('2023-07-24', '2023-07-24', 'CAFE', '브로큰템퍼', null, '서울특별시 서대문구 불광천길 170', '0507-1419-3250', null, '월~토 12:00 ~ 23:00, 일 13:00 ~ 23:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '비안빈', null, '서울특별시 마포구 상암산로 76', '070-7551-5840', null, '매일 07:30 ~ 22:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '빵아커피 김포공항점', null, '서울특별시 강서구 하늘길 233', '02-2665-0805', null, '매일 08:00 ~ 21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '서강대학교', null, '서울특별시 마포구 백범로 35', '02-705-8114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '서대문구청', null, '서울특별시 서대문구 연희로 248', '02-330-1301', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '서대문구청내 카페_하이천사', null, '서울특별시 서대문구 연희로 248', '02-3144-3231', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '서소문청사 1동', null, '서울특별시 중구 덕수궁길 15', null, null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '서소문청사 후생동 (네스카페)', null, '서울특별시 중구 덕수궁길 15', '02-120', null, '월~금 09:00 ~ 18:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '서울시의회 의원회관', null, '서울특별시 중구 덕수궁길 15', null, null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '서울시청 본청', null, '서울특별시 중구 세종대로 110', '02-120', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '서초구청', null, '서울특별시 서초구 남부순환로 2584', '02-2155-6114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '소나카페테라', null, '서울특별시 강서구 강서로 45', '02-2065-1810', null, '수~토 09:00 ~ 20:00, 일~화 09:00 ~ 18:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '숭의여대 본관_교내카페', null, '서울특별시 중구 소파로2길 10', null, null, '월~금 07:00 ~ 23:00, 토-일 11:00-21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '숭의여대 음악당_드림스퀘어(카페)', null, '서울특별시 중구 소파로2길 10', null, null, '월~금 08:00 ~ 22:00, 토-일 09:00-21:30'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 무교동점', null, '서울특별시 중구 무교로 21', '1522-3234', null, '월~금 07:00~20:00, 토 09:00~19:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 무교로점', null, '서울특별시 중구 무교로 21', '1522-3234', null, '월~금 07:00~20:00, 토 09:00~19:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 별다방점', null, '서울특별시 중구 퇴계로 100', '1522-3234', null, '월~일 07:00~21:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 서소문로점', null, '서울특별시 중구 서소문로 120', '1522-3232', null, '월~금 07:00~21:00, 토,일 08:00~19:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 시청 플러스점', null, '서울특별시 중구 을지로 19', '1522-3243', null, '월~금 07:30~17:30, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 시청점', null, '서울특별시 중구 을지로 19', '1522-3236', null, '월~금 07:00~19:00, 토 09:00~20:00, 일09:00~17:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 을지로경기빌딩점', null, '서울특별시 중구 남대문로10길 9', '1522-3238', null, '월~금 07:00~20:00, 토 09:00~19:00, 일09:00~18:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 을지로국제빌딩점', null, '서울특별시 중구 남대문로 109', '1522-3237', null, '월~금 07:00~20:00, 토,일 10:00~19:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 을지로내외빌딩R점', null, '서울특별시 중구 을지로 51', '1522-3239', null, '월~금 07:00~20:00, 토 09:00~18:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 을지로삼화타워점', null, '서울특별시 중구 을지로5길 16', '1522-3240', null, '월~금 07:00~21:00, 토 09:00~20:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스 한국프레스센터점', null, '서울특별시 중구 세종대로 124', '1522-3232', null, '월~금 07:00~20:00, 토, 일 09:00~18:00'), + ('2023-07-24', '2023-07-24', 'CAFE', '스타벅스서소문배재점', null, '서울특별시 중구 서소문로 99', '1522-3241', null, '월~금 07:00~18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '애니원FNC _사내카페', null, '서울특별시 강남구 논현로99길 24', '02-470-2801', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '애니원FNC 서울세관', null, '서울특별시 강남구 언주로 721', null, null, '월~금 08:00 ~ 17:30'), + ('2023-07-24', '2023-07-24', 'CAFE', '양천구청', null, '서울특별시 양천구 목동동로 105', '02-2620-3114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '양천구청 카페_도담', null, '서울특별시 양천구 목동동로 105', null, null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '얼스어스', null, '서울특별시 마포구 성미산로 150', '010-7105-9413', null, '월~일 12:00~21:30, 화 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '얼스어스 서촌점', null, '서울특별시 종로구 자하문로28가길 1', '010-6686-8413', null, '평일12:00~21:00, 주말12:00~21:30'), + ('2023-07-24', '2023-07-24', 'CAFE', '용두문화복지센터 (북카페)', null, '서울특별시 동대문구 고산자로28길 13', '02-6929-2652', null, '월~금 06:00 ~ 22:00, 토 09:00-18:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '은평구청', null, '서울특별시 은평구 은평로 195', '02-351-6114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '은평구청내 카페_은마루', null, '서울특별시 은평구 은평로 195', '02-351-6133', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '이화여대 학생문화관', null, '서울특별시 서대문구 이화여대길 54', '02-3277-211', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '일리고카페자스', null, '서울특별시 종로구 율곡로4길 9', '0507-1402-9318', null, '월~금 07:00 ~ 22:00, 토 12:00-19:00, 일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '잠실야구장 01~20', null, '서울특별시 송파구 올림픽로 19-2', '02-2240-8800', null, '야구경기 운영시간 참조'), + ('2023-07-24', '2023-07-24', 'CAFE', '종로노인종합복지관', null, '서울특별시 종로구 율곡로19길 17-8', '02-742-9500', null, '시설별 상이 + - 경로식당 : 월~금 11:00 ~ 12:50 + - 목욕탕 : 월,화,목,금 09:30 ~ 11:30, 13:30 ~ 16:00, 토 09:30 ~ 11:00 + - 별★별한옥도서관 : 월~금 09:00 ~ 18:00 + - 기능회복실 : 월~금 09:10, 10:10, 11:10, 13:30, 14:30'), + ('2023-07-24', '2023-07-24', 'CAFE', '중구청', null, '서울특별시 중구 창경궁로 17', '02-3396-4114', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '진서의정원', null, '서울특별시 관악구 남부순환로176길 16', '02-876-2525', null, '화~일 10:00 ~ 22:30, 월 휴무'), + ('2023-07-24', '2023-07-24', 'CAFE', '충무아트센터_피스커피', null, '서울특별시 중구 퇴계로 387', '0507-1354-8173', null, '매일 10:00 ~ 21:30'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페 샘', null, '서울특별시 서대문구 홍제천로 86-1', '010-3646-4135', null, '매일 12:00~17:00 (일요일 휴무)'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페 쓸', null, '서울특별시 은평구 통일로 684', '010-4054-4804', null, '월-토 / 11:00-18:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페겸', null, '서울특별시 서대문구 증가로 264', '0507-1410-1401', null, '월~화,목~일 10:30 ~ 22:00, 수 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페루시', null, '서울특별시 강서구 공항대로 213', '0507-1323-5609', null, '월~금 09:00 ~ 23:00, 토,일 10:00-23:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페블럭', null, '서울특별시 광진구 자양로11길 10', '02-457-0416', null, 'https://www.makeus.net/44076'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페일마지오', null, '서울특별시 영등포구 선유로 165', null, null, null), + ('2023-07-25', '2023-07-25', 'CAFE', '카페자스 광화문', null, '서울특별시 종로구 새문안로5가길 3-1', '02-733-7071', null, '월~금 07:00 ~ 22:00, 토,일 09:00-22:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페조제', null, '서울특별시 강서구 마곡중앙4로 22', '010-3019-9772', null, '월~토 07:00 ~ 19:00, 일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '칸틴커피대치', null, '서울특별시 강남구 테헤란로114길 38', '02-568-1066', null, '월~토 08:00 ~ 17:30, 일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '커피수공업', null, '서울특별시 성북구 고려대로 51', '070-8724-9384', null, '월~금 08:00 ~ 22:00, 토 10:00-21:00, 일 11:00-21:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '커피에반하다 강북구청점', null, '서울특별시 강북구 한천로139길 10', '02-999-6753', null, '평일 07:30~22:30 토요일 10:30~23:00 일요일, 공휴일 10:30~21:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '커피에이엠', null, '서울특별시 강서구 화곡로 296', '02-2605-7708', null, '매일 09:00 ~ 21:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '커피한약방', null, '서울특별시 중구 삼일대로12길 16-6', '070-4148-4242', null, '월~금 10:00 ~ 22:00, 토 11:00-22:00, 일 11:00-20:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '쿠아레비 구산점', null, '서울특별시 은평구 서오릉로 149', '02-356-7885', null, null), + ('2023-07-25', '2023-07-25', 'CAFE', '타셋커피 로스터즈', null, '서울특별시 마포구 월드컵북로 396', '0507-1328-7270', null, '월~금 07:30 ~ 18:00, 토, 일 09:00 ~ 17:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '토프레소(호서 발산점)', null, '서울특별시 강서구 강서로 63', '0507-1322-2162', null, '월~금 08:00 ~ 18:00, 토,일 08:00 ~ 15:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '투썸플레이스 예금보험공사점', null, '서울특별시 중구 청계천로 30', '02-776-2388', null, '월~금 07:00 ~ 23:00, 토-일 11:00-21:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '파리바게뜨 서소문점', null, '서울특별시 중구 서소문로 129', '02-730-8288', null, '매일 06:00 - 23:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '파머스빈 마곡나루점', null, '서울특별시 강서구 마곡중앙5로1길 20', '0507-1401-6520', null, '월~금 07:00 ~ 22:00, 토 10:00 ~ 22:00, 일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '페이퍼넛츠', null, '서울특별시 서대문구 거북골로24길 37-8', '02-6408-7799', null, '월,일10:30-18:00/화,수,목,금10:00-20:30/둘째주넷째주월요일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '폴바셋 서소문점', null, '서울특별시 중구 서소문로 124', '02-779-9489', null, '월~금 07:00 ~ 21:00, 토,일 09:00-16:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '플립커피로스터스', null, '서울특별시 강서구 마곡중앙6로 45', '070-7543-6545', null, '월~금 07:30 ~ 22:00, 토,일 11:00 ~ 22:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '한스바이오매드', null, '서울특별시 송파구 정의로8길 7', '02-466-2266', null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '행복커넥트 성수빌딩', null, '서울특별시 성동구 연무장5가길 25', null, null, '월~금 09:00 ~ 18:00, 토,일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '행복플러스', null, '서울특별시 중구 세종대로 110', '02-733-1245', null, '월~금 07:30 ~ 18:00'), + ('2023-07-25', '2023-07-25', 'CAFE', '협동플랫폼 카페이웃', null, '서울특별시 서대문구 가좌로 77', '070-8118-0326', null, '매일 10:00~20:00, 토요일 11:00~18:00 (일요일 휴무)'), + ('2023-07-25', '2023-07-25', 'CAFE', '휘카페', null, '서울특별시 동대문구 서울시립대로 117', '070-8667-6332', null, null), + ('2023-07-25', '2023-07-25', 'CAFE', '휘펍', null, '서울특별시 강서구 강서로56가길 63', '02-3662-8558', null, '화~일 10:00 ~ 22:00, 월 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', 'CSJ COFFEE', null, '서울특별시 성동구 자동차시장길 49', null, null, '월~금 09:00 ~ 18:00, 일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', 'GS25 DX LAB점', null, '서울특별시 강남구 테헤란로 223', null, null, '연중 24시간 운영'), + ('2023-07-25', '2023-07-25', 'CAFE', 'THE YOUNG(더영)', null, '서울특별시 마포구 매봉산로 75', '0507-1493-5556', null, '월~금 07:00 ~ 20:00, 토 09:00 ~ 17:00, 일 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', 'Walking on Sunshine', null, '서울특별시 성북구 보문로30가길 17', '02-6012-5931', null, '화~토 11:30 ~ 20:30/ 월 휴무'), + ('2023-07-25', '2023-07-25', 'CAFE', '카페 그뢴', null, '서울특별시 강동구 풍성로37길 41', '0507-1348-6068', 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395_minseo92_20211220163428_1.jpg', + '월~금 08:00~19:00, 토 10:00~17:00, 일 휴무'), + ('2023-07-25', '2023-07-25', 'RESTAURANT', '비건카페 달냥', null, '서울특별시 종로구 혜화로 45', '010-5069-0919', null, null), + ('2023-07-26', '2023-07-26', 'ETC', '감탄상회', null, '서울특별시 동작구 양녕로29길 16', '0507-1312-9324', null, '월-일 10:00-20:00 연중무휴'), + ('2023-07-26', '2023-07-26', 'ETC', '스토어36.5노원점', null, '서울특별시 노원구 동일로 1411-2', '02-3391-3650', null, '월~토 10시~19시 법정공휴일 롯데백화점정기휴무일에 휴무'), + ('2023-07-26', '2023-07-26', 'ETC', '어몽트리 그림공간', null, '서울특별시 서초구 방배천로6길 33-1', '02-582-0553', null, '평일 11:30~21:30, 일 11:00~17:00, 토요일 휴무'), + ('2023-07-26', '2023-07-26', 'ETC', '오색오미', null, '서울특별시 마포구 월드컵로26길 39', '0507-1309-6441', null, '월-금 10:00-18:00 토,일 휴무'), + ('2023-07-26', '2023-07-26', 'ETC', '유카플라워&가든', null, '서울특별시 중랑구 공릉로2길 28', '0507-1348-1774', null, '월-일 11:00-21:00 (유동적) 연중무휴'), + ('2023-07-26', '2023-07-26', 'ETC', '음밥', null, '서울특별시 강북구 솔매로50길 78', '02-992-2048', null, '월-금 9:00-21:00 토 11:00-18:00 일 휴무'), + ('2023-07-26', '2023-07-26', 'ETC', '키퍼스마켓 (Keepers Market)', null, '서울특별시 강남구 언주로30길 21', '02-6080-4007', null, '월-토 11:00~20:00'), + ('2023-07-26', '2023-07-26', 'ETC', '플라워에이블', null, '서울특별시 강남구 테헤란로52길 6', '0507-1320-4517', 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395_zerowaste_20230309163006_1.png', + '월~금 08:00~17:00, 예약제'), + ('2023-07-26', '2023-07-26', 'ETC', '해피플', null, '서울특별시 관악구 조원로2길 14', null, null, '월,화,목,금 13:00 - 20:00 토 12:00 - 17:00 / 일,수 휴무'), + ('2023-07-26', '2023-07-26', 'ETC', '㈜리싸이클시티', null, '서울특별시 강동구 동남로 930', '1588-8425', null, '월~일 09:00~18:00'), + ('2023-07-26', '2023-07-26', 'DAILY', '굿바이마켓', null, '서울특별시 용산구 서빙고로 17', '070-4369-5982', null, '월~금 10:30~19:30, 토 11:00~17:00, 일요일 정기휴무'), + ('2023-07-26', '2023-07-26', 'DAILY', '원점', null, '서울특별시 성동구 아차산로7길 42', '010-8783-4947', 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395__20230308174316_1.jpg', + '월~일 10:00~20:00 (둘째주, 넷째주 화요일 휴무)'), + ('2023-07-26', '2023-07-26', 'DAILY', '자연상점', 'https://www.onlyeco.co.kr', '서울특별시 은평구 통일로 684', '02-2039-9631', + 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395_leekey78_20230407134220_1.png', '평일 12시 ~ 18시 30분, (토,일,공휴일 휴무)'), + ('2023-07-26', '2023-07-26', 'DAILY', '제로띵스', 'http://zerothings.co.kr', '서울특별시 중구 수표로 32-1', '02-2263-6148', null, '월~토 12:00~19:30, 일 12:00~18:00'), + ('2023-07-26', '2023-07-26', 'DAILY', '주식회사 샘크래프트', 'https://www.samcraft.co.kr', '서울특별시 송파구 삼전로4길 3-11', '02-6203-6430', null, '월~금 9:00~17:00'), + ('2023-07-26', '2023-07-26', 'DAILY', '타이거릴리', 'https://tigerlily.kr/', '서울특별시 마포구 포은로 119', '0507-1361-5372', null, '매일 12:00-20:00/휴무 사전공지'), + ('2023-07-26', '2023-07-26', 'DAILY', '해달별 제로웨이스트 샵', null, '서울특별시 강남구 자곡로 191', '02-6969-0748', + 'https://map.seoul.go.kr/smgis/ucimgs/conts/11103395/11103395_zerowaste_20230309153911_1.png', '화~금 12:00~19:00, 토 09:00~18:00, 일, 월, 공휴일 휴무'), + ('2023-07-26', '2023-07-26', 'DAILY', '허그어웨일', null, '서울특별시 강서구 화곡로55길 23', '02-2038-7209', null, '월~금 10:30~18:30, 토 11:00~17:00, 일 휴무'); \ No newline at end of file From 3ec4ece2a6528a1af9ff3cbdd4345f7ef55c2c07 Mon Sep 17 00:00:00 2001 From: Minuooooo Date: Wed, 26 Jul 2023 11:41:47 +0900 Subject: [PATCH 2/6] [ feat ] Get simple store infos API --- .../config/security/SecurityConfig.java | 5 +-- .../store/controller/StoreController.java | 35 +++++++++++++++++++ .../dto/GetSimpleStoreInfosResponseDto.java | 35 +++++++++++++++++++ .../backend/domain/store/entity/Store.java | 5 ++- .../store/repository/StoreRepository.java | 8 +++++ .../domain/store/service/StoreService.java | 27 ++++++++++++++ .../backend/response/SuccessMessage.java | 4 ++- src/main/resources/application-dev.yml | 1 + 8 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 src/main/java/greeny/backend/domain/store/controller/StoreController.java create mode 100644 src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java create mode 100644 src/main/java/greeny/backend/domain/store/service/StoreService.java diff --git a/src/main/java/greeny/backend/config/security/SecurityConfig.java b/src/main/java/greeny/backend/config/security/SecurityConfig.java index f9554f3..9da7cd3 100644 --- a/src/main/java/greeny/backend/config/security/SecurityConfig.java +++ b/src/main/java/greeny/backend/config/security/SecurityConfig.java @@ -36,7 +36,8 @@ public class SecurityConfig { "/api/auth/reissue" }; - private static final String[] AUTH_WHITELIST_WITH_BOARD = { + private static final String[] AUTH_WHITELIST_WITH_GET_METHOD = { + "/api/stores/**", "/api/posts/**", "/api/comments/**" }; @@ -66,7 +67,7 @@ protected SecurityFilterChain config(HttpSecurity http) throws Exception { .authorizeRequests(authorize -> authorize .antMatchers(AUTH_WHITELIST_WITH_MEMBER_AUTH) .permitAll() - .antMatchers(HttpMethod.GET, AUTH_WHITELIST_WITH_BOARD) + .antMatchers(HttpMethod.GET, AUTH_WHITELIST_WITH_GET_METHOD) // 인증 없이 조회 가능한 API 목록 .permitAll() .anyRequest() .authenticated() diff --git a/src/main/java/greeny/backend/domain/store/controller/StoreController.java b/src/main/java/greeny/backend/domain/store/controller/StoreController.java new file mode 100644 index 0000000..f22c5a4 --- /dev/null +++ b/src/main/java/greeny/backend/domain/store/controller/StoreController.java @@ -0,0 +1,35 @@ +package greeny.backend.domain.store.controller; + +import greeny.backend.domain.store.service.StoreService; +import greeny.backend.response.Response; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import static greeny.backend.response.Response.*; +import static greeny.backend.response.SuccessMessage.*; +import static org.springframework.http.HttpStatus.*; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/stores") +@Tag(name = "Store", description = "Store API Document") +public class StoreController { + + private final StoreService storeService; + + @Operation(summary = "Get simple store infos API", description = "please get simple store infos.") + @ResponseStatus(OK) + @GetMapping("/simple") + public Response getSimpleStoreInfosWithReview() { + return success(SUCCESS_TO_GET_SIMPLE_STORE_INFOS, storeService.getSimpleStoreInfosWithReview()); + } + + +} diff --git a/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java b/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java new file mode 100644 index 0000000..eef0049 --- /dev/null +++ b/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java @@ -0,0 +1,35 @@ +package greeny.backend.domain.store.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import greeny.backend.domain.store.entity.Store; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GetSimpleStoreInfosResponseDto { // 스토어 목록에 보여주는 정보 + + private Long id; + private String category; + private String name; + private String imageUrl; + private String location; + private int bookmarks; // 찜한 사람들의 수 + private int reviews; // 리뷰 수 + + public static GetSimpleStoreInfosResponseDto from(Store store, int bookmarks, int reviews) { + return GetSimpleStoreInfosResponseDto.builder() + .id(store.getId()) + .category(store.getCategory().getName()) + .name(store.getName()) + .imageUrl(store.getImageUrl()) + .location(store.getLocation()) + .bookmarks(bookmarks) + .reviews(reviews) + .build(); + } +} diff --git a/src/main/java/greeny/backend/domain/store/entity/Store.java b/src/main/java/greeny/backend/domain/store/entity/Store.java index f86ef00..2c0dd9c 100644 --- a/src/main/java/greeny/backend/domain/store/entity/Store.java +++ b/src/main/java/greeny/backend/domain/store/entity/Store.java @@ -9,10 +9,13 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.BatchSize; import javax.persistence.*; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import static javax.persistence.CascadeType.ALL; @@ -32,7 +35,7 @@ public class Store extends AuditEntity { @OneToMany(mappedBy = "store", cascade = ALL, orphanRemoval = true) private List storeReviews = new ArrayList<>(); @OneToMany(mappedBy = "store", cascade = ALL, orphanRemoval = true) - private List storeBookmarks = new ArrayList<>(); + private Set storeBookmarks = new HashSet<>(); @Enumerated(EnumType.STRING) @Column(nullable = false) diff --git a/src/main/java/greeny/backend/domain/store/repository/StoreRepository.java b/src/main/java/greeny/backend/domain/store/repository/StoreRepository.java index 61655bd..37b8db7 100644 --- a/src/main/java/greeny/backend/domain/store/repository/StoreRepository.java +++ b/src/main/java/greeny/backend/domain/store/repository/StoreRepository.java @@ -1,7 +1,15 @@ package greeny.backend.domain.store.repository; import greeny.backend.domain.store.entity.Store; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; public interface StoreRepository extends JpaRepository { + @EntityGraph(attributePaths = {"storeReviews", "storeBookmarks"}) // Collection fetch join -> DB 과부하 방지를 위해 batch size 설정 + @NotNull + List findAll(); } diff --git a/src/main/java/greeny/backend/domain/store/service/StoreService.java b/src/main/java/greeny/backend/domain/store/service/StoreService.java new file mode 100644 index 0000000..1fcfe35 --- /dev/null +++ b/src/main/java/greeny/backend/domain/store/service/StoreService.java @@ -0,0 +1,27 @@ +package greeny.backend.domain.store.service; + +import greeny.backend.domain.store.dto.GetSimpleStoreInfosResponseDto; +import greeny.backend.domain.store.repository.StoreRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class StoreService { + + private final StoreRepository storeRepository; + + public List getSimpleStoreInfosWithReview() { + return storeRepository.findAll().stream() + .map(store -> GetSimpleStoreInfosResponseDto.from(store, store.getStoreBookmarks().size(), store.getStoreReviews().size())) + .collect(Collectors.toList()); + } + + +} diff --git a/src/main/java/greeny/backend/response/SuccessMessage.java b/src/main/java/greeny/backend/response/SuccessMessage.java index 497cb02..369e79b 100644 --- a/src/main/java/greeny/backend/response/SuccessMessage.java +++ b/src/main/java/greeny/backend/response/SuccessMessage.java @@ -14,9 +14,11 @@ public class SuccessMessage { public static final String SUCCESS_TO_FIND_PASSWORD = "비밀번호를 찾는데 성공했습니다."; public static final String SUCCESS_TO_REISSUE = "토큰 재발급에 성공했습니다."; - public static final String SUCCESS_TO_GET_CURRENT_MEMBER_INFO = "현재 회원의 정보를 가져오는데 성공했습니다."; public static final String SUCCESS_TO_DELETE_MEMBER = "회원을 삭제하는데 성공했습니다."; + public static final String SUCCESS_TO_GET_SIMPLE_STORE_INFOS = "스토어 목록을 불러오는데 성공했습니다."; + public static final String SUCCESS_TO_GET_STORE_INFO = "스토어 상세 정보를 불러오는데 성공했습니다."; + public static final String SUCCESS_TO_WRITE_POST = "게시글을 작성하는데 성공하였습니다."; public static final String SUCCESS_TO_GET_POST_LIST = "게시글 목록을 불러오는데 성공하였습니다."; public static final String SUCCESS_TO_SEARCH_POST_LIST = "게시글 목록을 검색하는데 성공하였습니다."; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 9f8f497..3b891b9 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -27,6 +27,7 @@ spring: properties: hibernate: format_sql: true + default_batch_fetch_size: 100 # Collection fetch join 시 100개씩 순차적으로 리스트를 불러옴 (DB 과부하 방지) naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl database: mysql From 84e07c6346295492c7467561ad39cdacd96de746 Mon Sep 17 00:00:00 2001 From: Minuooooo Date: Wed, 26 Jul 2023 16:48:11 +0900 Subject: [PATCH 3/6] [ feat ] Get Store detail info API --- .../config/security/SecurityConfig.java | 2 +- .../repository/StoreBookmarkRepository.java | 10 ++++++ .../bookmark/service/BookmarkService.java | 22 ++++++++++++ .../store/controller/StoreController.java | 25 ++++++++++--- .../dto/GetSimpleStoreInfosResponseDto.java | 1 - .../store/dto/GetStoreInfoResponseDto.java | 35 +++++++++++++++++++ .../domain/store/service/StoreService.java | 23 ++++++++++-- .../backend/exception/ExceptionAdvice.java | 8 +++++ .../situation/StoreNotFoundException.java | 4 +++ 9 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java create mode 100644 src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java create mode 100644 src/main/java/greeny/backend/exception/situation/StoreNotFoundException.java diff --git a/src/main/java/greeny/backend/config/security/SecurityConfig.java b/src/main/java/greeny/backend/config/security/SecurityConfig.java index 9da7cd3..7e13ad1 100644 --- a/src/main/java/greeny/backend/config/security/SecurityConfig.java +++ b/src/main/java/greeny/backend/config/security/SecurityConfig.java @@ -37,7 +37,7 @@ public class SecurityConfig { }; private static final String[] AUTH_WHITELIST_WITH_GET_METHOD = { - "/api/stores/**", + "/api/stores/simple", "/api/posts/**", "/api/comments/**" }; diff --git a/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java b/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java index ab29f5a..1090d6f 100644 --- a/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java +++ b/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java @@ -1,7 +1,17 @@ package greeny.backend.domain.bookmark.repository; import greeny.backend.domain.bookmark.entity.StoreBookmark; +import greeny.backend.domain.member.entity.Member; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface StoreBookmarkRepository extends JpaRepository { + @EntityGraph(attributePaths = {"store"}) + List findStoreBookmarksByLiker(Member liker); + @EntityGraph(attributePaths = {"store"}) + Page findStoreBookmarksByLiker(Pageable pageable, Member liker); } diff --git a/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java b/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java new file mode 100644 index 0000000..79dc9cc --- /dev/null +++ b/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java @@ -0,0 +1,22 @@ +package greeny.backend.domain.bookmark.service; + +import greeny.backend.domain.bookmark.entity.StoreBookmark; +import greeny.backend.domain.bookmark.repository.StoreBookmarkRepository; +import greeny.backend.domain.member.entity.Member; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class BookmarkService { + + private final StoreBookmarkRepository storeBookmarkRepository; + + public List getMyStoreBookmarkInfos(Member liker) { + return storeBookmarkRepository.findStoreBookmarksByLiker(liker); + } +} diff --git a/src/main/java/greeny/backend/domain/store/controller/StoreController.java b/src/main/java/greeny/backend/domain/store/controller/StoreController.java index f22c5a4..54d7d44 100644 --- a/src/main/java/greeny/backend/domain/store/controller/StoreController.java +++ b/src/main/java/greeny/backend/domain/store/controller/StoreController.java @@ -1,5 +1,7 @@ package greeny.backend.domain.store.controller; +import greeny.backend.domain.bookmark.service.BookmarkService; +import greeny.backend.domain.member.service.MemberService; import greeny.backend.domain.store.service.StoreService; import greeny.backend.response.Response; import io.swagger.v3.oas.annotations.Operation; @@ -11,9 +13,10 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import static greeny.backend.response.Response.*; -import static greeny.backend.response.SuccessMessage.*; -import static org.springframework.http.HttpStatus.*; +import static greeny.backend.response.Response.success; +import static greeny.backend.response.SuccessMessage.SUCCESS_TO_GET_SIMPLE_STORE_INFOS; +import static greeny.backend.response.SuccessMessage.SUCCESS_TO_GET_STORE_INFO; +import static org.springframework.http.HttpStatus.OK; @Slf4j @RestController @@ -23,12 +26,24 @@ public class StoreController { private final StoreService storeService; + private final BookmarkService bookmarkService; + private final MemberService memberService; @Operation(summary = "Get simple store infos API", description = "please get simple store infos.") @ResponseStatus(OK) @GetMapping("/simple") - public Response getSimpleStoreInfosWithReview() { - return success(SUCCESS_TO_GET_SIMPLE_STORE_INFOS, storeService.getSimpleStoreInfosWithReview()); + public Response getSimpleStoreInfos() { + return success(SUCCESS_TO_GET_SIMPLE_STORE_INFOS, storeService.getSimpleStoreInfos()); + } + + @Operation(summary = "Get store info API", description = "put store id what you want to see.") + @ResponseStatus(OK) + @GetMapping() + public Response getStoreInfo(Long storeId) { + return success( + SUCCESS_TO_GET_STORE_INFO, + storeService.getStoreInfo(storeId, bookmarkService.getMyStoreBookmarkInfos(memberService.getCurrentMember())) + ); } diff --git a/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java b/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java index eef0049..02c65c0 100644 --- a/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java +++ b/src/main/java/greeny/backend/domain/store/dto/GetSimpleStoreInfosResponseDto.java @@ -12,7 +12,6 @@ @NoArgsConstructor @Builder public class GetSimpleStoreInfosResponseDto { // 스토어 목록에 보여주는 정보 - private Long id; private String category; private String name; diff --git a/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java b/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java new file mode 100644 index 0000000..e16ffba --- /dev/null +++ b/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java @@ -0,0 +1,35 @@ +package greeny.backend.domain.store.dto; + +import greeny.backend.domain.store.entity.Store; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GetStoreInfoResponseDto { // 스토어 상세 정보 + private Long id; + private String category; + private String name; + private String webUrl; + private String imageUrl; + private String location; + private String phone; + private boolean isBookmarked; + + public static GetStoreInfoResponseDto from(Store store, boolean isBookmarked) { + return GetStoreInfoResponseDto.builder() + .id(store.getId()) + .category(store.getCategory().getName()) + .name(store.getName()) + .webUrl(store.getWebUrl()) + .imageUrl(store.getImageUrl()) + .location(store.getLocation()) + .phone(store.getPhone()) + .isBookmarked(isBookmarked) + .build(); + } +} diff --git a/src/main/java/greeny/backend/domain/store/service/StoreService.java b/src/main/java/greeny/backend/domain/store/service/StoreService.java index 1fcfe35..d8d4277 100644 --- a/src/main/java/greeny/backend/domain/store/service/StoreService.java +++ b/src/main/java/greeny/backend/domain/store/service/StoreService.java @@ -1,11 +1,14 @@ package greeny.backend.domain.store.service; +import greeny.backend.domain.bookmark.entity.StoreBookmark; import greeny.backend.domain.store.dto.GetSimpleStoreInfosResponseDto; +import greeny.backend.domain.store.dto.GetStoreInfoResponseDto; +import greeny.backend.domain.store.entity.Store; import greeny.backend.domain.store.repository.StoreRepository; +import greeny.backend.exception.situation.StoreNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; @@ -17,11 +20,27 @@ public class StoreService { private final StoreRepository storeRepository; - public List getSimpleStoreInfosWithReview() { + public Store getStore(Long storeId) { + return storeRepository.findById(storeId) + .orElseThrow(StoreNotFoundException::new); + } + + public List getSimpleStoreInfos() { return storeRepository.findAll().stream() .map(store -> GetSimpleStoreInfosResponseDto.from(store, store.getStoreBookmarks().size(), store.getStoreReviews().size())) .collect(Collectors.toList()); } + public GetStoreInfoResponseDto getStoreInfo(Long storeId, List myStoreBookmarks) { + + Store foundStore = getStore(storeId); + for(StoreBookmark myStoreBookmark : myStoreBookmarks) { + if(storeId.equals(myStoreBookmark.getStore().getId())) { + return GetStoreInfoResponseDto.from(foundStore, true); + } + } + + return GetStoreInfoResponseDto.from(foundStore, false); + } } diff --git a/src/main/java/greeny/backend/exception/ExceptionAdvice.java b/src/main/java/greeny/backend/exception/ExceptionAdvice.java index e2b1448..d5838b5 100644 --- a/src/main/java/greeny/backend/exception/ExceptionAdvice.java +++ b/src/main/java/greeny/backend/exception/ExceptionAdvice.java @@ -154,6 +154,14 @@ public Response emptySocialTokenInfoException() { return failure(BAD_REQUEST, "소셜에서 제공한 토큰 정보가 비어있습니다."); } + // 404 응답 + // 요청한 스토어를 찾을 수 없음 + @ExceptionHandler(StoreNotFoundException.class) + @ResponseStatus(NOT_FOUND) + public Response storeNotFoundException() { + return failure(NOT_FOUND, "요청한 스토어를 찾을 수 없습니다."); + } + // 404 응답 // 요청한 게시글을 찾을 수 없음 @ExceptionHandler(PostNotFoundException.class) diff --git a/src/main/java/greeny/backend/exception/situation/StoreNotFoundException.java b/src/main/java/greeny/backend/exception/situation/StoreNotFoundException.java new file mode 100644 index 0000000..eefe262 --- /dev/null +++ b/src/main/java/greeny/backend/exception/situation/StoreNotFoundException.java @@ -0,0 +1,4 @@ +package greeny.backend.exception.situation; + +public class StoreNotFoundException extends RuntimeException { +} From 27b73cc4b9978a876a925311444f8b8d3c36ee91 Mon Sep 17 00:00:00 2001 From: Minuooooo Date: Wed, 26 Jul 2023 16:57:19 +0900 Subject: [PATCH 4/6] [ refactor ] Variable naming --- .../java/greeny/backend/domain/product/entity/Product.java | 4 ++-- src/main/java/greeny/backend/domain/store/entity/Store.java | 5 ++--- .../greeny/backend/domain/store/service/StoreService.java | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/greeny/backend/domain/product/entity/Product.java b/src/main/java/greeny/backend/domain/product/entity/Product.java index 882fe05..4a73392 100644 --- a/src/main/java/greeny/backend/domain/product/entity/Product.java +++ b/src/main/java/greeny/backend/domain/product/entity/Product.java @@ -31,9 +31,9 @@ public class Product extends AuditEntity { @JoinColumn(name = "store_id") private Store store; @OneToMany(mappedBy = "product", cascade = ALL, orphanRemoval = true) - private List productReviews = new ArrayList<>(); + private List reviews = new ArrayList<>(); @OneToMany(mappedBy = "product", cascade = ALL, orphanRemoval = true) - private List productBookmarks = new ArrayList<>(); + private List bookmarks = new ArrayList<>(); @Column(nullable = false) private String name; diff --git a/src/main/java/greeny/backend/domain/store/entity/Store.java b/src/main/java/greeny/backend/domain/store/entity/Store.java index 2c0dd9c..4f6e448 100644 --- a/src/main/java/greeny/backend/domain/store/entity/Store.java +++ b/src/main/java/greeny/backend/domain/store/entity/Store.java @@ -9,7 +9,6 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.BatchSize; import javax.persistence.*; import java.util.ArrayList; @@ -33,9 +32,9 @@ public class Store extends AuditEntity { @OneToMany(mappedBy = "store", cascade = ALL, orphanRemoval = true) private List products = new ArrayList<>(); @OneToMany(mappedBy = "store", cascade = ALL, orphanRemoval = true) - private List storeReviews = new ArrayList<>(); + private List reviews = new ArrayList<>(); @OneToMany(mappedBy = "store", cascade = ALL, orphanRemoval = true) - private Set storeBookmarks = new HashSet<>(); + private Set bookmarks = new HashSet<>(); @Enumerated(EnumType.STRING) @Column(nullable = false) diff --git a/src/main/java/greeny/backend/domain/store/service/StoreService.java b/src/main/java/greeny/backend/domain/store/service/StoreService.java index d8d4277..78bd793 100644 --- a/src/main/java/greeny/backend/domain/store/service/StoreService.java +++ b/src/main/java/greeny/backend/domain/store/service/StoreService.java @@ -27,7 +27,7 @@ public Store getStore(Long storeId) { public List getSimpleStoreInfos() { return storeRepository.findAll().stream() - .map(store -> GetSimpleStoreInfosResponseDto.from(store, store.getStoreBookmarks().size(), store.getStoreReviews().size())) + .map(store -> GetSimpleStoreInfosResponseDto.from(store, store.getBookmarks().size(), store.getReviews().size())) .collect(Collectors.toList()); } From d9b2493eef647c21a52d95ea1ae91c53764a1bc9 Mon Sep 17 00:00:00 2001 From: Minuooooo Date: Wed, 26 Jul 2023 17:04:14 +0900 Subject: [PATCH 5/6] [ etc ] Comment --- .../bookmark/repository/StoreBookmarkRepository.java | 2 +- .../domain/bookmark/service/BookmarkService.java | 2 +- .../domain/store/controller/StoreController.java | 2 ++ .../domain/store/dto/GetStoreInfoResponseDto.java | 2 +- .../backend/domain/store/service/StoreService.java | 10 +++++----- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java b/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java index 1090d6f..b5b1b71 100644 --- a/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java +++ b/src/main/java/greeny/backend/domain/bookmark/repository/StoreBookmarkRepository.java @@ -10,7 +10,7 @@ import java.util.List; public interface StoreBookmarkRepository extends JpaRepository { - @EntityGraph(attributePaths = {"store"}) + @EntityGraph(attributePaths = {"store"}) // fetch join 을 통해 StoreBookmark 객체를 가져옴과 동시에 프로퍼티인 Store 객체도 가져오기 List findStoreBookmarksByLiker(Member liker); @EntityGraph(attributePaths = {"store"}) Page findStoreBookmarksByLiker(Pageable pageable, Member liker); diff --git a/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java b/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java index 79dc9cc..a9b2474 100644 --- a/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java +++ b/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java @@ -16,7 +16,7 @@ public class BookmarkService { private final StoreBookmarkRepository storeBookmarkRepository; - public List getMyStoreBookmarkInfos(Member liker) { + public List getMyStoreBookmarkInfos(Member liker) { // 현재 사용자의 찜한 스토어 목록 가져오기 return storeBookmarkRepository.findStoreBookmarksByLiker(liker); } } diff --git a/src/main/java/greeny/backend/domain/store/controller/StoreController.java b/src/main/java/greeny/backend/domain/store/controller/StoreController.java index 54d7d44..4723bd3 100644 --- a/src/main/java/greeny/backend/domain/store/controller/StoreController.java +++ b/src/main/java/greeny/backend/domain/store/controller/StoreController.java @@ -29,6 +29,7 @@ public class StoreController { private final BookmarkService bookmarkService; private final MemberService memberService; + // 스토어 목록 API @Operation(summary = "Get simple store infos API", description = "please get simple store infos.") @ResponseStatus(OK) @GetMapping("/simple") @@ -36,6 +37,7 @@ public Response getSimpleStoreInfos() { return success(SUCCESS_TO_GET_SIMPLE_STORE_INFOS, storeService.getSimpleStoreInfos()); } + // 스토어 상세 정보 API @Operation(summary = "Get store info API", description = "put store id what you want to see.") @ResponseStatus(OK) @GetMapping() diff --git a/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java b/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java index e16ffba..c79a7f2 100644 --- a/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java +++ b/src/main/java/greeny/backend/domain/store/dto/GetStoreInfoResponseDto.java @@ -18,7 +18,7 @@ public class GetStoreInfoResponseDto { // 스토어 상세 정보 private String imageUrl; private String location; private String phone; - private boolean isBookmarked; + private boolean isBookmarked; // 현재 사용자가 찜을 했는지 여부 public static GetStoreInfoResponseDto from(Store store, boolean isBookmarked) { return GetStoreInfoResponseDto.builder() diff --git a/src/main/java/greeny/backend/domain/store/service/StoreService.java b/src/main/java/greeny/backend/domain/store/service/StoreService.java index 78bd793..54fff91 100644 --- a/src/main/java/greeny/backend/domain/store/service/StoreService.java +++ b/src/main/java/greeny/backend/domain/store/service/StoreService.java @@ -20,22 +20,22 @@ public class StoreService { private final StoreRepository storeRepository; - public Store getStore(Long storeId) { + public Store getStore(Long storeId) { // Id 값을 통해 Store 객체 가져오기 return storeRepository.findById(storeId) .orElseThrow(StoreNotFoundException::new); } - public List getSimpleStoreInfos() { + public List getSimpleStoreInfos() { // Store 목록 가져오기 return storeRepository.findAll().stream() .map(store -> GetSimpleStoreInfosResponseDto.from(store, store.getBookmarks().size(), store.getReviews().size())) - .collect(Collectors.toList()); + .collect(Collectors.toList()); // List 에서 하나의 store 마다 GetSimpleStoreInfosResponseDto 객체로 변환 후 List 에 담아서 반환 } - public GetStoreInfoResponseDto getStoreInfo(Long storeId, List myStoreBookmarks) { + public GetStoreInfoResponseDto getStoreInfo(Long storeId, List myStoreBookmarks) { // Store 상세 정보 가져오기 Store foundStore = getStore(storeId); - for(StoreBookmark myStoreBookmark : myStoreBookmarks) { + for(StoreBookmark myStoreBookmark : myStoreBookmarks) { // 현재 사용자의 찜한 스토어 목록과 현재 스토어 id 값 비교를 통해 찜한 여부 판단 if(storeId.equals(myStoreBookmark.getStore().getId())) { return GetStoreInfoResponseDto.from(foundStore, true); } From 789b295335e3b8e77dc8c71c55bb55028ebe5962 Mon Sep 17 00:00:00 2001 From: Minuooooo Date: Wed, 26 Jul 2023 17:46:07 +0900 Subject: [PATCH 6/6] [ feat ] Add store or product bookmark API --- .../controller/BookmarkController.java | 41 +++++++++++++++++++ .../bookmark/service/BookmarkService.java | 39 ++++++++++++++++++ .../product/service/ProductService.java | 23 +++++++++++ .../backend/exception/ExceptionAdvice.java | 16 ++++++++ .../situation/ProductNotFoundException.java | 4 ++ .../situation/TypeDoesntExistsException.java | 4 ++ .../backend/response/SuccessMessage.java | 2 + 7 files changed, 129 insertions(+) create mode 100644 src/main/java/greeny/backend/domain/bookmark/controller/BookmarkController.java create mode 100644 src/main/java/greeny/backend/domain/product/service/ProductService.java create mode 100644 src/main/java/greeny/backend/exception/situation/ProductNotFoundException.java create mode 100644 src/main/java/greeny/backend/exception/situation/TypeDoesntExistsException.java diff --git a/src/main/java/greeny/backend/domain/bookmark/controller/BookmarkController.java b/src/main/java/greeny/backend/domain/bookmark/controller/BookmarkController.java new file mode 100644 index 0000000..52e5302 --- /dev/null +++ b/src/main/java/greeny/backend/domain/bookmark/controller/BookmarkController.java @@ -0,0 +1,41 @@ +package greeny.backend.domain.bookmark.controller; + +import greeny.backend.domain.bookmark.service.BookmarkService; +import greeny.backend.domain.member.service.MemberService; +import greeny.backend.domain.product.service.ProductService; +import greeny.backend.domain.store.service.StoreService; +import greeny.backend.response.Response; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import static greeny.backend.response.Response.success; +import static greeny.backend.response.SuccessMessage.SUCCESS_TO_ADD_BOOKMARK; +import static greeny.backend.response.SuccessMessage.SUCCESS_TO_GET_SIMPLE_STORE_INFOS; +import static org.springframework.http.HttpStatus.OK; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/bookmarks") +@Tag(name = "Bookmark", description = "Bookmark API Document") +public class BookmarkController { + + private final MemberService memberService; + private final StoreService storeService; + private final ProductService productService; + private final BookmarkService bookmarkService; + + // 스토어 or 제품 찜하기 API + @Operation(summary = "Add store or product bookmark API", description = "put type info and store or product id what you want to bookmark.") + @ResponseStatus(OK) + @PostMapping() + public Response addBookmark(String type, Long id) { + bookmarkService.addBookmark(type, storeService.getStore(id), productService.getProduct(id), memberService.getCurrentMember()); + return success(SUCCESS_TO_ADD_BOOKMARK); + } + + +} diff --git a/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java b/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java index a9b2474..a83c2b7 100644 --- a/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java +++ b/src/main/java/greeny/backend/domain/bookmark/service/BookmarkService.java @@ -1,8 +1,13 @@ package greeny.backend.domain.bookmark.service; +import greeny.backend.domain.bookmark.entity.ProductBookmark; import greeny.backend.domain.bookmark.entity.StoreBookmark; +import greeny.backend.domain.bookmark.repository.ProductBookmarkRepository; import greeny.backend.domain.bookmark.repository.StoreBookmarkRepository; import greeny.backend.domain.member.entity.Member; +import greeny.backend.domain.product.entity.Product; +import greeny.backend.domain.store.entity.Store; +import greeny.backend.exception.situation.TypeDoesntExistsException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -15,8 +20,42 @@ public class BookmarkService { private final StoreBookmarkRepository storeBookmarkRepository; + private final ProductBookmarkRepository productBookmarkRepository; public List getMyStoreBookmarkInfos(Member liker) { // 현재 사용자의 찜한 스토어 목록 가져오기 return storeBookmarkRepository.findStoreBookmarksByLiker(liker); } + + public void addBookmark(String type, Store store, Product product, Member liker) { // 타입에 따라 찜하기 + + if(type.equals("s")) { // 스토어 찜하기 + addStoreBookmark(store, liker); + } else if(type.equals("p")) { // 제품 찜하기 + addProductBookmark(product, liker); + } else { + throw new TypeDoesntExistsException(); + } + } + + private void addStoreBookmark(Store store, Member liker) { // 찜한 정보 DB에 저장 + storeBookmarkRepository.save(toEntity(store, liker)); + } + + private void addProductBookmark(Product product, Member liker) { // 찜한 정보 DB에 저장 + productBookmarkRepository.save(toEntity(product, liker)); + } + + private StoreBookmark toEntity(Store store, Member liker) { + return StoreBookmark.builder() + .store(store) + .liker(liker) + .build(); + } + + private ProductBookmark toEntity(Product product, Member liker) { + return ProductBookmark.builder() + .product(product) + .liker(liker) + .build(); + } } diff --git a/src/main/java/greeny/backend/domain/product/service/ProductService.java b/src/main/java/greeny/backend/domain/product/service/ProductService.java new file mode 100644 index 0000000..a26b5d4 --- /dev/null +++ b/src/main/java/greeny/backend/domain/product/service/ProductService.java @@ -0,0 +1,23 @@ +package greeny.backend.domain.product.service; + +import greeny.backend.domain.product.entity.Product; +import greeny.backend.domain.product.repository.ProductRepository; +import greeny.backend.exception.situation.ProductNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class ProductService { + + private final ProductRepository productRepository; + + public Product getProduct(Long productId) { + return productRepository.findById(productId) + .orElseThrow(ProductNotFoundException::new); + } + + +} diff --git a/src/main/java/greeny/backend/exception/ExceptionAdvice.java b/src/main/java/greeny/backend/exception/ExceptionAdvice.java index d5838b5..dcbfeb9 100644 --- a/src/main/java/greeny/backend/exception/ExceptionAdvice.java +++ b/src/main/java/greeny/backend/exception/ExceptionAdvice.java @@ -162,6 +162,22 @@ public Response storeNotFoundException() { return failure(NOT_FOUND, "요청한 스토어를 찾을 수 없습니다."); } + // 404 응답 + // 요청한 제품을 찾을 수 없음 + @ExceptionHandler(ProductNotFoundException.class) + @ResponseStatus(NOT_FOUND) + public Response productNotFoundException() { + return failure(NOT_FOUND, "요청한 제품을 찾을 수 없습니다."); + } + + // 400 응답 + // 타입이 존재하지 않음 + @ExceptionHandler(TypeDoesntExistsException.class) + @ResponseStatus(BAD_REQUEST) + public Response typeDoesntExistsException() { + return failure(BAD_REQUEST, "타입이 존재하지 않습니다."); + } + // 404 응답 // 요청한 게시글을 찾을 수 없음 @ExceptionHandler(PostNotFoundException.class) diff --git a/src/main/java/greeny/backend/exception/situation/ProductNotFoundException.java b/src/main/java/greeny/backend/exception/situation/ProductNotFoundException.java new file mode 100644 index 0000000..167421f --- /dev/null +++ b/src/main/java/greeny/backend/exception/situation/ProductNotFoundException.java @@ -0,0 +1,4 @@ +package greeny.backend.exception.situation; + +public class ProductNotFoundException extends RuntimeException { +} diff --git a/src/main/java/greeny/backend/exception/situation/TypeDoesntExistsException.java b/src/main/java/greeny/backend/exception/situation/TypeDoesntExistsException.java new file mode 100644 index 0000000..5471f5d --- /dev/null +++ b/src/main/java/greeny/backend/exception/situation/TypeDoesntExistsException.java @@ -0,0 +1,4 @@ +package greeny.backend.exception.situation; + +public class TypeDoesntExistsException extends RuntimeException { +} diff --git a/src/main/java/greeny/backend/response/SuccessMessage.java b/src/main/java/greeny/backend/response/SuccessMessage.java index 369e79b..594780d 100644 --- a/src/main/java/greeny/backend/response/SuccessMessage.java +++ b/src/main/java/greeny/backend/response/SuccessMessage.java @@ -19,6 +19,8 @@ public class SuccessMessage { public static final String SUCCESS_TO_GET_SIMPLE_STORE_INFOS = "스토어 목록을 불러오는데 성공했습니다."; public static final String SUCCESS_TO_GET_STORE_INFO = "스토어 상세 정보를 불러오는데 성공했습니다."; + public static final String SUCCESS_TO_ADD_BOOKMARK = "찜하기에 성공했습니다."; + public static final String SUCCESS_TO_WRITE_POST = "게시글을 작성하는데 성공하였습니다."; public static final String SUCCESS_TO_GET_POST_LIST = "게시글 목록을 불러오는데 성공하였습니다."; public static final String SUCCESS_TO_SEARCH_POST_LIST = "게시글 목록을 검색하는데 성공하였습니다.";