diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a9774a4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,92 @@
+
+
+# ๐์ผํ๋ชฐ ํ๋ก์ ํธ
+## ๐ฉ๐ปโ๐ป์ฐธ์ฌ
+- ์ ํ์ฃผ
+
+## โ๏ธ๊ธฐ์ ์คํ
+- **SpringBoot**
+
+## ๐งํ์
๋๊ตฌ
+- **Git**
+- **GitHub**
+
+## ๐๏ธ๋ฐ์ดํฐ๋ฒ ์ด์ค
+- **H2**
+
+## โ์์กด์ฑ
+```java
+dependencies {
+ implementation group: 'com.auth0', name: 'java-jwt', version: '4.3.0'
+ implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+ implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-validation'
+ implementation 'junit:junit:4.13.1'
+ compileOnly 'org.projectlombok:lombok'
+ developmentOnly 'org.springframework.boot:spring-boot-devtools'
+ runtimeOnly 'com.h2database:h2'
+ annotationProcessor 'org.projectlombok:lombok'
+ testImplementation 'org.springframework.boot:spring-boot-starter-test'
+ }
+```
+
+## ๐๏ธ๊ตฌํ ์์ฒญ ์ฌํญ
+- ๊ณ ๊ฐ์ ๋ค์์ด๋ค.
+- ํ๋งค์๋ ํ๋ช
์ด๋ค.
+- ๊ณ ๊ฐ์ ์ฌ๋ฌ๊ฑด์ ์ฃผ๋ฌธ์ ํ ์ ์๋ค.
+- ๊ณ ๊ฐ์ ํ๋ฒ์ ์ฌ๋ฌ๊ฐ์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
+- ๊ณ ๊ฐ์ ์ํ ์ฃผ๋ฌธ์์ ๊ฐ์๋ฅผ ์ ํํ ์ ์๋ค.
+
+## ๐ก๊ตฌํ๋ ๊ธฐ๋ฅ
+
+### ๐๐ปโโ๏ธ์ฌ์ฉ์ ๊ธฐ๋ฅ
+ - ํ์๊ฐ์
+ - ๋ก๊ทธ์ธ
+
+### ๐์ํ ๊ด๋ จ ๊ธฐ๋ฅ
+ - ํ๋งค์์ ์ํ ๋ฑ๋ก
+ - ๋ฑ๋ก๋ ์ํ๋ค ๋ชฉ๋ก ๋ณด๊ธฐ
+ - ์ํ ์์ธ๋ณด๊ธฐ
+ - ํ๋งค์์ ์ํ ์์
+ - ํ๋งค์์ ์ํ ์ญ์
+
+### ๐ฉ๐ปโ๐ป์ฃผ๋ฌธ ๊ด๋ จ ๊ธฐ๋ฅ
+ - ์ํ ์ฃผ๋ฌธ
+ - ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ
+ - ํ๋งค์์ ์ ์ฒด ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ
+
+**์์ธํ ์์ฒญ๊ณผ ์๋ต์ [api๋ฌธ์](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/main/java/shop/mtcoding/metamall/api)๋ฅผ ํ์ธ**
+
+## ๐ER-Diagram
+
+
+
+## ๐ฉ๐ปโ๐ง์์ฑํ ํ
์คํธ ์ฝ๋
+- ๋ ํฌ์งํ ๋ฆฌ ์ฟผ๋ฆฌ ํ
์คํธ ์ฝ๋
+
+ [๊ณ ๊ฐ ์ฟผ๋ฆฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java)
+
+ [์ ํ ์ฟผ๋ฆฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java)
+
+ [์ฃผ๋ฌธ์ ์ฟผ๋ฆฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java)
+
+- ์ปจํธ๋กค๋ฌ ํ
์คํธ ์ฝ๋
+
+ [๊ณ ๊ฐ ์ปจํธ๋กค๋ฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java)
+
+ [์ํ ์ปจํธ๋กค๋ฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java)
+
+ [์ฃผ๋ฌธ ์ปจํธ๋กค๋ฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java)
+
+## ๐ง๋ณด์ํ ์
+- ์์ฒญ์ ๋ํด Dto๋ก ๋ฐ์ง ๋ชปํ ๊ฒ๋ค์ด ๋ช ๊ฐ์ง ์์๋ค. ์๋ก Dto๋ฅผ ์ถ๊ฐํด์ ์์ฒญ์ ๋ง๋ Dto๋ก ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ ์์ ์ด๋ค.
+- ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ. ํ์ฌ null, "" ์ฒดํฌ ์ ๋๋ง ๊ตฌํ๋์ด ์๋ค.
+- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ด๊ด๊ณ๋ฅผ ์ข ๋ ๊ณต๋ถํด์ ์๋ต์ด ๋ ๊น๋ํ๊ฒ ๋์ฌ ์ ์๋๋ก ๋ณ๊ฒฝํ ์์ . ๋ถํ์ํ๊ฒ ๋ง์ ์ ๋ณด์ ์๋ต์ด ๋์จ๋ค๊ณ ๋๊ผ๋ค.
+- ER-Diagram์ ๋ณด์ํ๊ธฐ
+- AOP ์ ์ฉ ํ์
+- JWT๋ฅผ ํค๋์์ ๊ฐ์ ธ์์ ์ธ์ฆํ๋ ๋ถ๋ถ์ด ๊ณ์ํด์ ๋ฐ๋ณต๋๋ ๊ฒ์ ๋๊ปด ์ด๋
ธํ
์ด์
์ผ๋ก ๋ง๋ค์์ง๋ง ๊ธฐ์กด ๋ฉ์๋์ ์ฐ๊ฒฐ์์ ์ด๋ ค์์ด ์์ด์ ์ ์ฉ์ ํ์ง๋ ๋ชปํ๋ค.
+
+## ๐๋๋ ์
+- ํผ์ ํ๋ ํ๋ก์ ํธ์ฌ์ ํ์
์ ํฐ ์ด๋ ค์์ด ์์์ง๋ง, ๋ค๋ฅธ ํ์๋ค๊ณผ ํจ๊ป ํ๊ฒ ๋๋ฉด ๋ฒ์ ๊ด๋ฆฌ์ ์ ๊ฒฝ์ ๋ง์ด ์จ์ผํ ๊ฒ ๊ฐ๋ค.
+- ๋ชจ๋ฅด๊ณ ์๋(๋ฐฐ์ ์ผ๋ ๊น๋จน์..?) ๋ถ๋ถ๋ ์ค์ค๋ก ๊ฒ์ํ๊ณ ๋ค์ ๊ณต๋ถํ๋ฉฐ ๋น ๋ถ๋ถ์ด ๋ง์ด ์ฑ์์ก๋ค๊ณ ๋๊ผ๋ค.
+- ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ด ๋ค ๋ค์ด์์ด์ ๋ฟ๋ฏํ๋ค!
diff --git a/build.gradle b/build.gradle
index 4943187..31d3826 100644
--- a/build.gradle
+++ b/build.gradle
@@ -22,12 +22,14 @@ dependencies {
implementation group: 'com.auth0', name: 'java-jwt', version: '4.3.0'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-validation'
+ implementation 'junit:junit:4.13.1'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
-}
+ }
tasks.named('test') {
useJUnitPlatform()
diff --git a/src/main/java/shop/mtcoding/metamall/MetamallApplication.java b/src/main/java/shop/mtcoding/metamall/MetamallApplication.java
index 487bb62..03bd70b 100644
--- a/src/main/java/shop/mtcoding/metamall/MetamallApplication.java
+++ b/src/main/java/shop/mtcoding/metamall/MetamallApplication.java
@@ -4,24 +4,41 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
+import shop.mtcoding.metamall.model.log.login.LoginLogRepository;
import shop.mtcoding.metamall.model.orderproduct.OrderProduct;
import shop.mtcoding.metamall.model.orderproduct.OrderProductRepository;
import shop.mtcoding.metamall.model.ordersheet.OrderSheet;
import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository;
+import shop.mtcoding.metamall.model.product.Product;
import shop.mtcoding.metamall.model.product.ProductRepository;
+import shop.mtcoding.metamall.model.user.Role;
import shop.mtcoding.metamall.model.user.User;
import shop.mtcoding.metamall.model.user.UserRepository;
+import java.time.LocalDateTime;
+
@SpringBootApplication
public class MetamallApplication {
@Bean
- CommandLineRunner initData(UserRepository userRepository, ProductRepository productRepository, OrderProductRepository orderProductRepository, OrderSheetRepository orderSheetRepository){
+ CommandLineRunner initData(UserRepository userRepository, ProductRepository productRepository, OrderProductRepository orderProductRepository, OrderSheetRepository orderSheetRepository, ErrorLogRepository errorLogRepository, LoginLogRepository loginLogRepository){
return (args)->{
// ์ฌ๊ธฐ์์ save ํ๋ฉด ๋จ.
// bulk Collector๋ saveAll ํ๋ฉด ๋จ.
- User ssar = User.builder().username("ssar").password("1234").email("ssar@nate.com").role("USER").build();
+ User seller = User.builder().username("seller").password("1234").email("seller@nate.com").role(Role.SELLER).build();
+ userRepository.save(seller);
+
+ User ssar = User.builder().username("ssar").password("1234").email("ssar@nate.com").role(Role.USER).build();
userRepository.save(ssar);
+ OrderSheet orderSheet = OrderSheet.builder().user(ssar).totalPrice(0).build();
+ orderSheetRepository.save(orderSheet); // ํ ๊ณ ๊ฐ ๋น ์ฃผ๋ฌธ ์ํธ ์์ฑ
+
+ Product book = Product.builder().productname("book1").price(10000).qty(100).build();
+ productRepository.save(book);
+
+ Product book2 = Product.builder().productname("book2").price(15000).qty(100).build();
+ productRepository.save(book2);
};
}
diff --git a/src/main/java/shop/mtcoding/metamall/api b/src/main/java/shop/mtcoding/metamall/api
new file mode 100644
index 0000000..9a3521f
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/api
@@ -0,0 +1,327 @@
+1. ํ์๊ฐ์
(POST)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/join
+ ์์ฒญ ํ๋ผ๋ฏธํฐ
+ - application/json
+ {
+ "username" : "jju",
+ "password" : "1234",
+ "email" : "yoo@a,a"
+ }
+ ์๋ต ๋ฐ๋
+ - application/json
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": {
+ "id": 4,
+ "username": "jju",
+ "email": "yoo@a,a",
+ "role": "USER",
+ "createdAt": "2023-04-09T22:37:00.4652234",
+ "updatedAt": null
+ }
+ }
+
+2. ๋ก๊ทธ์ธ (POST)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/login
+ ์์ฒญ ํ๋ผ๋ฏธํฐ
+ - application/json
+ {
+ "username" : "jju",
+ "password" : "1234"
+ }
+
+ ์๋ต ๋ฐ๋
+ - application/json
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": {
+ "id": 3,
+ "username": "jju",
+ "email": "yoo@a,a",
+ "role": "USER",
+ "createdAt": "2023-04-09T22:38:19.389678",
+ "updatedAt": "2023-04-09T22:38:22.6968692"
+ }
+ }
+
+3. ์ํ๋ฑ๋ก (POST)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/upload
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~ ์์ฒญ ํ๋ผ๋ฏธํฐ
+ -
+ {
+ "productname" : "phone",
+ "price" : "500000",
+ "qty" : "100"
+ }
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": {
+ "id": 3,
+ "productname": "phone",
+ "price": 500000,
+ "qty": 100,
+ "createdAt": "2023-04-09T22:40:20.4367407",
+ "updatedAt": null
+ }
+ }
+
+4. ์ํ๋ชฉ๋ก๋ณด๊ธฐ (GET)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/findAll
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": [
+ {
+ "id": 1,
+ "productname": "book1",
+ "price": 10000,
+ "qty": 100,
+ "createdAt": "2023-04-09T22:38:10.774707",
+ "updatedAt": null
+ },
+ {
+ "id": 2,
+ "productname": "book2",
+ "price": 15000,
+ "qty": 100,
+ "createdAt": "2023-04-09T22:38:10.777716",
+ "updatedAt": null
+ },
+ {
+ "id": 3,
+ "productname": "phone",
+ "price": 500000,
+ "qty": 100,
+ "createdAt": "2023-04-09T22:40:20.436741",
+ "updatedAt": null
+ }
+ ]
+ }
+
+5. ์ํ์์ธ๋ณด๊ธฐ (POST)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/find
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์์ฒญ ํ๋ผ๋ฏธํฐ
+ -
+ {
+ "productname" : "phone"
+ }
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": {
+ "id": 3,
+ "productname": "phone",
+ "price": 500000,
+ "qty": 100,
+ "createdAt": "2023-04-09T22:40:20.436741",
+ "updatedAt": null
+ }
+ }
+
+6. ์ํ์์ ํ๊ธฐ (PUT)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/update
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์์ฒญ ํ๋ผ๋ฏธํฐ
+ -
+ {
+ "productname":"phone",
+ "price" : "11111",
+ "qty" : "1010"
+ }
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": {
+ "id": 3,
+ "productname": "phone",
+ "price": 11111,
+ "qty": 1010,
+ "createdAt": "2023-04-09T22:52:36.532541",
+ "updatedAt": null
+ }
+ }
+
+7. ์ํ์ญ์ ํ๊ธฐ (DELETE)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/delete/phone
+ ์์ฒญ ํค๋
+ -
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": "Delete Success!"
+ }
+
+8. ์ฃผ๋ฌธํ๊ธฐ (POST) - OrderProduct๋ฅผ ์์ฑํ์ฌ, OrderSheet์ ์ถ๊ฐํ์ธ์
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/order
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์์ฒญ ํ๋ผ๋ฏธํฐ
+ -
+ {
+ "name" : "book1",
+ "count" : "3"
+ }
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": {
+ "id": 1,
+ "user": {
+ "id": 2,
+ "username": "ssar",
+ "email": "ssar@nate.com",
+ "role": "USER",
+ "createdAt": "2023-04-09T22:50:25.430306",
+ "updatedAt": "2023-04-09T22:54:36.025102"
+ },
+ "orderProductList": [
+ {
+ "id": 1,
+ "product": {
+ "id": 1,
+ "productname": "book1",
+ "price": 10000,
+ "qty": 97,
+ "createdAt": "2023-04-09T22:50:25.450303",
+ "updatedAt": "2023-04-09T22:54:47.5028385"
+ },
+ "count": 3,
+ "orderPrice": 30000,
+ "createdAt": "2023-04-09T22:54:47.4436669",
+ "orderSheet": 1
+ }
+ ],
+ "totalPrice": 30000,
+ "createdAt": "2023-04-09T22:50:25.434301",
+ "updatedAt": "2023-04-09T22:54:47.5028385"
+ }
+ }
+
+9. ๊ณ ๊ฐ์
์ฅ - ์ฃผ๋ฌธ๋ชฉ๋ก๋ณด๊ธฐ (GET)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/findAllOrder
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": [
+ {
+ "id": 1,
+ "product": {
+ "id": 1,
+ "productname": "book1",
+ "price": 10000,
+ "qty": 97,
+ "createdAt": "2023-04-09T22:50:25.450303",
+ "updatedAt": "2023-04-09T22:54:47.502839"
+ },
+ "count": 3,
+ "orderPrice": 30000,
+ "createdAt": "2023-04-09T22:54:47.443667",
+ "orderSheet": 1
+ }
+ ]
+ }
+
+10. ํ๋งค์์
์ฅ - ์ฃผ๋ฌธ๋ชฉ๋ก๋ณด๊ธฐ (GET)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/findAllOrder
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": [
+ {
+ "id": 1,
+ "user": {
+ "id": 2,
+ "username": "ssar",
+ "email": "ssar@nate.com",
+ "role": "USER",
+ "createdAt": "2023-04-09T22:50:25.430306",
+ "updatedAt": "2023-04-09T22:54:36.025102"
+ },
+ "orderProductList": [
+ {
+ "id": 1,
+ "product": {
+ "id": 1,
+ "productname": "book1",
+ "price": 10000,
+ "qty": 97,
+ "createdAt": "2023-04-09T22:50:25.450303",
+ "updatedAt": "2023-04-09T22:54:47.502839"
+ },
+ "count": 3,
+ "orderPrice": 30000,
+ "createdAt": "2023-04-09T22:54:47.443667",
+ "orderSheet": 1
+ }
+ ],
+ "totalPrice": 30000,
+ "createdAt": "2023-04-09T22:50:25.434301",
+ "updatedAt": "2023-04-09T22:54:47.502839"
+ }
+ ]
+ }
+
+11. ๊ณ ๊ฐ์
์ฅ - ์ฃผ๋ฌธ์ทจ์ํ๊ธฐ (DELETE) - Casecade ์ต์
์ ํ์ฉํ์ธ์. (์๋ฐฉํฅ ๋งคํ)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/cancel
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": "์ฃผ๋ฌธ์ด ์ ์์ ์ผ๋ก ์ทจ์๋์์ต๋๋ค. "
+ }
+
+12. ํ๋งค์์
์ฅ - ์ฃผ๋ฌธ์ทจ์ํ๊ธฐ (DELETE) - Casecade ์ต์
์ ํ์ฉํ์ธ์. (์๋ฐฉํฅ ๋งคํ)
+ ์์ฒญ ์ฃผ์
+ - http://localhost:8080/cancel/2
+ ์์ฒญ ํค๋
+ - Authorization : Bearer ~
+ ์๋ต ๋ฐ๋
+ -
+ {
+ "status": 200,
+ "msg": "์ฑ๊ณต",
+ "data": "2๋ฒ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ์ด ์ ์์ ์ผ๋ก ์ทจ์๋์์ต๋๋ค. "
+ }
diff --git a/src/main/java/shop/mtcoding/metamall/controller/OrderController.java b/src/main/java/shop/mtcoding/metamall/controller/OrderController.java
new file mode 100644
index 0000000..bf60e96
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/controller/OrderController.java
@@ -0,0 +1,159 @@
+package shop.mtcoding.metamall.controller;
+
+import com.auth0.jwt.interfaces.DecodedJWT;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import shop.mtcoding.metamall.core.exception.Exception400;
+import shop.mtcoding.metamall.core.exception.Exception401;
+import shop.mtcoding.metamall.core.exception.Exception403;
+import shop.mtcoding.metamall.core.exception.Exception404;
+import shop.mtcoding.metamall.core.jwt.JwtProvider;
+import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.dto.order.OrderRequest;
+import shop.mtcoding.metamall.model.orderproduct.OrderProduct;
+import shop.mtcoding.metamall.model.orderproduct.OrderProductRepository;
+import shop.mtcoding.metamall.model.ordersheet.OrderSheet;
+import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository;
+import shop.mtcoding.metamall.model.product.Product;
+import shop.mtcoding.metamall.model.product.ProductRepository;
+import shop.mtcoding.metamall.model.user.Role;
+import shop.mtcoding.metamall.model.user.User;
+import shop.mtcoding.metamall.model.user.UserRepository;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Optional;
+
+@RequiredArgsConstructor
+@RestController
+public class OrderController {
+
+ private final ProductRepository productRepository;
+ private final HttpSession session;
+ private final OrderProductRepository orderProductRepository;
+ private final OrderSheetRepository orderSheetRepository;
+ private final UserRepository userRepository;
+
+ @PostMapping("/order")
+ @Transactional
+ public ResponseEntity> order(@Valid @RequestBody OrderRequest.OrderDto orderDto, HttpServletRequest request) {
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ String name = orderDto.getName();
+ Integer count = orderDto.getCount();
+
+ // ์ฌ์ฉ์์ ๊ถํ ํ์ธ USER
+ String role = decodedJWT.getClaim("role").asString();
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+
+ if(role.equals(Role.USER.toString())){ //USER ์ฌ์ผ ์ฃผ๋ฌธ๊ฐ๋ฅ
+ Product productPS = productRepository.findByName(name).orElseThrow(() -> {
+ return new Exception404("์ ํ์ ์ด๋ฆ์ ์ฐพ์ ์ ์์ต๋๋ค. ");
+ });
+
+ if(productPS.getQty() - count< 0){
+ throw new Exception400("์ ํ์ ์๋์ด ๋ถ์กฑํฉ๋๋ค. ");
+ }
+ productPS.setQty(productPS.getQty() - count); //์๋ ์
๋ฐ์ดํธ
+ OrderProduct orderProduct = OrderProduct.builder().product(productPS).count(count).orderPrice(productPS.getPrice() * count).build();
+ orderProductRepository.save(orderProduct);
+
+ OrderSheet orderSheetPS = orderSheetRepository.findByUserId(userId).get();
+ List orderProductList = orderSheetPS.getOrderProductList();
+ orderProductList.add(orderProduct);
+ orderSheetPS.setOrderProductList(orderProductList); //orderProduct ์ถ๊ฐ๋ ๋ฆฌ์คํธ๋ก ์
๋ฐ์ดํธ
+
+ Integer totalPrice = orderSheetPS.getTotalPrice();
+ totalPrice = totalPrice + orderProduct.getOrderPrice();
+ orderSheetPS.setTotalPrice(totalPrice);
+
+ orderProduct.setOrderSheet(orderSheetPS.getId());
+
+ ResponseDto> responseDto = new ResponseDto<>().data(orderSheetPS);
+ return ResponseEntity.ok().body(responseDto);
+ }else {
+ throw new Exception403("์๋ชป๋ ์ ๊ทผ์
๋๋ค. ");
+ }
+ }
+
+ @GetMapping("/findAllOrder")
+ public ResponseEntity> findAllOrder(HttpServletRequest request) {
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ // ์ฌ์ฉ์์ ๊ถํ ํ์ธ
+ String role = decodedJWT.getClaim("role").asString();
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+ if(role.equals(Role.USER.toString())){ // ๊ณ ๊ฐ์ผ ๊ฒฝ์ฐ ๋ณธ์ธ์ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ
+ OrderSheet orderSheet = orderSheetRepository.findByUserId(userId).get();
+ List orderProductList = orderSheet.getOrderProductList();
+ ResponseDto> responseDto = new ResponseDto<>().data(orderProductList);
+ return ResponseEntity.ok().body(responseDto);
+
+ }else if(role.equals(Role.SELLER.toString())){ // ํ๋งค์์ผ ๊ฒฝ์ฐ ๋ชจ๋ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ
+ List orderSheetList = orderSheetRepository.findAll();
+ ResponseDto> responseDto = new ResponseDto<>().data(orderSheetList);
+ return ResponseEntity.ok().body(responseDto);
+
+ }else {
+ throw new Exception401("์ธ์ฆ๋์ง ์์ ๊ณ ๊ฐ์
๋๋ค.");
+ }
+ }
+
+ @DeleteMapping("/cancel")
+ public ResponseEntity> cancel(HttpServletRequest request){
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ // 2. ์ฌ์ฉ์์ ๊ถํ ํ์ธ
+ String role = decodedJWT.getClaim("role").asString();
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+ if(role.equals(Role.USER.toString())) { // ๊ณ ๊ฐ์ผ ๊ฒฝ์ฐ ๋ณธ์ธ์ ์ฃผ๋ฌธ ๋ชฉ๋ก ์ญ์ ํ๊ธฐ -> ๋น ์ฃผ๋ฌธ ๋ชฉ๋ก์ผ๋ก ์๋ก ์์ฑํด์ฃผ๊ธฐ
+ orderSheetRepository.deleteByUserId(userId);
+ Optional user = userRepository.findById(userId);
+ OrderSheet orderSheet = OrderSheet.builder().user(user.get()).totalPrice(0).build();
+ orderSheetRepository.save(orderSheet);
+ ResponseDto> responseDto = new ResponseDto<>().data("์ฃผ๋ฌธ์ด ์ ์์ ์ผ๋ก ์ทจ์๋์์ต๋๋ค. ");
+ return ResponseEntity.ok().body(responseDto);
+ }else {
+ throw new Exception403("์๋ชป๋ ์ ๊ทผ์
๋๋ค. ");
+ }
+ }
+
+ @DeleteMapping("/cancel/{userId}") // ๊ฐ ์๋ค์ด์ค๋ฉด seller์ user cancel๋ก ํ๋จํด์ 403 - ์๋ชป๋ ์ ๊ทผ
+ public ResponseEntity> cancelSeller(@PathVariable(required = false) Long userId, HttpServletRequest request){
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ // ์ฌ์ฉ์์ ๊ถํ ํ์ธ SELLER(ํ๋งค์)
+ String role = decodedJWT.getClaim("role").asString();
+ Long id = decodedJWT.getClaim("id").asLong();
+
+ if(role.equals(Role.SELLER.toString())){ // ํ๋งค์์ผ ๊ฒฝ์ฐ ๋ณธ์ธ์ body์ ์
๋ ฅํ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ ๋ชฉ๋ก ์ญ์ ํ๊ธฐ -> ๋น ์ฃผ๋ฌธ ๋ชฉ๋ก์ผ๋ก ์๋ก ์์ฑํด์ฃผ๊ธฐ
+ // Long userId = Long.parseLong(id);
+ orderSheetRepository.deleteByUserId(userId);
+ User user = userRepository.findById(userId).orElseThrow(() -> {
+ return new Exception404(userId + "๋ฒ ๊ณ ๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค. ");
+ });
+ OrderSheet orderSheet = OrderSheet.builder().user(user).totalPrice(0).build();
+ orderSheetRepository.save(orderSheet);
+
+ ResponseDto> responseDto = new ResponseDto<>().data(userId + "๋ฒ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ์ด ์ ์์ ์ผ๋ก ์ทจ์๋์์ต๋๋ค. ");
+ return ResponseEntity.ok().body(responseDto);
+ }else {
+ throw new Exception403("์๋ชป๋ ์ ๊ทผ์
๋๋ค. ");
+ }
+ }
+}
diff --git a/src/main/java/shop/mtcoding/metamall/controller/ProductController.java b/src/main/java/shop/mtcoding/metamall/controller/ProductController.java
new file mode 100644
index 0000000..2ad6e8a
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/controller/ProductController.java
@@ -0,0 +1,132 @@
+package shop.mtcoding.metamall.controller;
+
+import com.auth0.jwt.interfaces.DecodedJWT;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import shop.mtcoding.metamall.core.exception.Exception400;
+import shop.mtcoding.metamall.core.exception.Exception403;
+import shop.mtcoding.metamall.core.jwt.JwtProvider;
+import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.dto.product.ProductRequest;
+import shop.mtcoding.metamall.model.product.Product;
+import shop.mtcoding.metamall.model.product.ProductRepository;
+import shop.mtcoding.metamall.model.user.Role;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Optional;
+
+@RequiredArgsConstructor
+@RestController
+public class ProductController {
+
+ private final ProductRepository productRepository;
+ private final HttpSession session;
+
+ @PostMapping("/find")
+ public ResponseEntity> find(@Valid @RequestBody ProductRequest.ProductDto product, HttpServletRequest request) {
+ //์ธ์ฆ๋ง ํ์
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+ Optional productOP = productRepository.findByName(product.getProductname());
+ if (productOP.isPresent()) {
+ // 1. ๋ฌผ๊ฑด ์ ๋ณด ๊บผ๋ด๊ธฐ
+ Product findProduct = productOP.get();
+
+ // 2. ์๋ต DTO ์์ฑ
+ ResponseDto> responseDto = new ResponseDto<>().data(findProduct);
+ return ResponseEntity.ok().body(responseDto);
+ } else {
+ throw new Exception400("์๋ชป๋ ์์ฒญ์
๋๋ค");
+ }
+ }
+
+ @GetMapping("/findAll")
+ public ResponseEntity> findAll(HttpServletRequest request) {
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ List productOP = productRepository.findAll();
+ ResponseDto> responseDto = new ResponseDto<>().data(productOP);
+ return ResponseEntity.ok().body(responseDto);
+ }
+
+ @PostMapping("/upload")
+ public ResponseEntity> upload(@Valid @RequestBody Product uploadProduct, HttpServletRequest request){
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+ // ์ฌ์ฉ์์ ๊ถํ ํ์ธ SELLER(ํ๋งค์) ๋ฑ๋ก ๊ฐ๋ฅ
+ String role = decodedJWT.getClaim("role").asString();
+
+ if(role.equals(Role.SELLER.toString())){
+ productRepository.save(uploadProduct);
+ ResponseDto> responseDto = new ResponseDto<>().data(uploadProduct);
+ return ResponseEntity.ok().body(responseDto);
+ }else{
+ throw new Exception403("ํ๋งค์๋ง ๋ฌผ๊ฑด์ ๋ฑ๋กํ ์ ์์ต๋๋ค");
+ }
+ }
+
+ @PutMapping("/update")
+ public ResponseEntity> update(@Valid @RequestBody Product updateProduct, HttpServletRequest request){
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ // ์ฌ์ฉ์์ ๊ถํ ํ์ธ SELLER(ํ๋งค์)
+ String role = decodedJWT.getClaim("role").asString();
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+ if(role.equals(Role.SELLER.toString())){
+
+ Product productPS = productRepository.findByName(updateProduct.getProductname()).orElseThrow(() -> {
+ return new Exception400("์ ํ์ ์ด๋ฆ์ ์ฐพ์ ์ ์์ต๋๋ค. ");
+ }); //์์ํ ํ๊ธฐ
+
+ productPS.setPrice(updateProduct.getPrice());
+ productPS.setQty(updateProduct.getQty());
+
+ ResponseDto> responseDto = new ResponseDto<>().data(productPS);
+ return ResponseEntity.ok().body(responseDto);
+
+ }else{
+ throw new Exception403("์๋ชป๋ ์ ๊ทผ์
๋๋ค. ");
+ }
+ }
+
+
+ @DeleteMapping("/delete/{productname}") // ๊ฐ ์๋ค์ด์ค๋ฉด 404 ๋ฐํ
+ public ResponseEntity> delete(@PathVariable(required = false) String productname, HttpServletRequest request){
+
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+ Long userId = decodedJWT.getClaim("id").asLong();
+
+ // ์ฌ์ฉ์์ ๊ถํ ํ์ธ SELLER(ํ๋งค์)
+ String role = decodedJWT.getClaim("role").asString();
+
+ if(role.equals(Role.SELLER.toString())){
+ Product productPS = productRepository.findByName(productname).orElseThrow(() -> {
+ return new Exception400("์ ํ์ ์ด๋ฆ์ ์ฐพ์ ์ ์์ต๋๋ค. ");
+ }); //์ ํ์ด ์๋์ง ํ์ธ
+
+ productRepository.deleteById(productPS.getId());
+
+ ResponseDto> responseDto = new ResponseDto<>().data("Delete Success!");
+ return ResponseEntity.ok().body(responseDto);
+
+ }else{
+ throw new Exception403("์๋ชป๋ ์ ๊ทผ์
๋๋ค. ");
+ }
+ }
+}
diff --git a/src/main/java/shop/mtcoding/metamall/controller/UserController.java b/src/main/java/shop/mtcoding/metamall/controller/UserController.java
index ddfee94..49c85fd 100644
--- a/src/main/java/shop/mtcoding/metamall/controller/UserController.java
+++ b/src/main/java/shop/mtcoding/metamall/controller/UserController.java
@@ -3,19 +3,24 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
+import shop.mtcoding.metamall.core.anotation.Authorize;
import shop.mtcoding.metamall.core.exception.Exception400;
import shop.mtcoding.metamall.core.exception.Exception401;
import shop.mtcoding.metamall.core.jwt.JwtProvider;
+import shop.mtcoding.metamall.core.session.LoginUser;
import shop.mtcoding.metamall.dto.ResponseDto;
import shop.mtcoding.metamall.dto.user.UserRequest;
-import shop.mtcoding.metamall.dto.user.UserResponse;
import shop.mtcoding.metamall.model.log.login.LoginLog;
import shop.mtcoding.metamall.model.log.login.LoginLogRepository;
+import shop.mtcoding.metamall.model.ordersheet.OrderSheet;
+import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository;
+import shop.mtcoding.metamall.model.user.Role;
import shop.mtcoding.metamall.model.user.User;
import shop.mtcoding.metamall.model.user.UserRepository;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
+import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Optional;
@@ -25,17 +30,20 @@ public class UserController {
private final UserRepository userRepository;
private final LoginLogRepository loginLogRepository;
+ private final OrderSheetRepository orderSheetRepository;
+
private final HttpSession session;
@PostMapping("/login")
- public ResponseEntity> login(@RequestBody UserRequest.LoginDto loginDto, HttpServletRequest request) {
+ public ResponseEntity> login(@Valid @RequestBody UserRequest.LoginDto loginDto, HttpServletRequest request) {
+ session.setAttribute("login", null);
Optional userOP = userRepository.findByUsername(loginDto.getUsername());
if (userOP.isPresent()) {
// 1. ์ ์ ์ ๋ณด ๊บผ๋ด๊ธฐ
- User loginUser = userOP.get();
+ User user = userOP.get();
// 2. ํจ์ค์๋ ๊ฒ์ฆํ๊ธฐ
- if(!loginUser.getPassword().equals(loginDto.getPassword())){
+ if(!user.getPassword().equals(loginDto.getPassword())){
throw new Exception401("์ธ์ฆ๋์ง ์์์ต๋๋ค");
}
@@ -43,21 +51,37 @@ public ResponseEntity> login(@RequestBody UserRequest.LoginDto loginDto, HttpS
String jwt = JwtProvider.create(userOP.get());
// 4. ์ต์ข
๋ก๊ทธ์ธ ๋ ์ง ๊ธฐ๋ก (๋ํฐ์ฒดํน - update ์ฟผ๋ฆฌ ๋ฐ์)
- loginUser.setUpdatedAt(LocalDateTime.now());
+ user.setUpdatedAt(LocalDateTime.now());
// 5. ๋ก๊ทธ ํ
์ด๋ธ ๊ธฐ๋ก
LoginLog loginLog = LoginLog.builder()
- .userId(loginUser.getId())
+ .userId(user.getId())
.userAgent(request.getHeader("User-Agent"))
.clientIP(request.getRemoteAddr())
.build();
loginLogRepository.save(loginLog);
- // 6. ์๋ต DTO ์์ฑ
- ResponseDto> responseDto = new ResponseDto<>().data(loginUser);
+// 6. loginUser์ ์ ์ฅ - ์๋ฌ์ ์ฌ์ฉํ๊ธฐ ์ํด์
+ LoginUser loginUser = LoginUser.builder().id(user.getId()).role(user.getRole().toString()).build();
+ session.setAttribute("login", loginUser);
+ System.out.println("๋ก๊ทธ์ธ ํ ์ ์ ์ ๋ณด : " + loginUser.toString());
+
+ // 7. ์๋ต DTO ์์ฑ
+ ResponseDto> responseDto = new ResponseDto<>().data(user);
return ResponseEntity.ok().header(JwtProvider.HEADER, jwt).body(responseDto);
} else {
throw new Exception400("์ ์ ๋ค์ ํน์ ์์ด๋๊ฐ ์๋ชป๋์์ต๋๋ค");
}
}
+
+ @PostMapping("/join")
+ public ResponseEntity> join(@Valid @RequestBody User joinUser){
+ joinUser.setRole(Role.USER);
+ userRepository.save(joinUser);
+ OrderSheet orderSheet = OrderSheet.builder().user(joinUser).totalPrice(0).build();
+ orderSheetRepository.save(orderSheet); // ํ ๊ณ ๊ฐ ๋น ์ฃผ๋ฌธ ์ํธ ์์ฑ
+
+ ResponseDto> responseDto = new ResponseDto<>().data(joinUser);
+ return ResponseEntity.ok().body(responseDto);
+ }
}
diff --git a/src/main/java/shop/mtcoding/metamall/core/advice/AuthorizeAdvice.java b/src/main/java/shop/mtcoding/metamall/core/advice/AuthorizeAdvice.java
new file mode 100644
index 0000000..f4614be
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/core/advice/AuthorizeAdvice.java
@@ -0,0 +1,34 @@
+package shop.mtcoding.metamall.core.advice;
+
+
+import com.auth0.jwt.interfaces.DecodedJWT;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import shop.mtcoding.metamall.core.jwt.JwtProvider;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Aspect
+@Component
+public class AuthorizeAdvice {
+
+ //๊น๋ฐ์ ๋ณ์นญ์ฃผ๊ธฐ
+ @Pointcut("@annotation(shop.mtcoding.metamall.core.anotation.Authorize)")
+ public void authorize(){}
+
+
+ @Around("authorize()")
+ public Object authAdvice(ProceedingJoinPoint jp) throws Throwable{
+
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
+ String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", "");
+ DecodedJWT decodedJWT = JwtProvider.verify(jwt);
+
+ return jp.proceed();
+ }
+}
diff --git a/src/main/java/shop/mtcoding/metamall/core/advice/ErrorLogAdvice.java b/src/main/java/shop/mtcoding/metamall/core/advice/ErrorLogAdvice.java
new file mode 100644
index 0000000..6e2b276
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/core/advice/ErrorLogAdvice.java
@@ -0,0 +1,31 @@
+package shop.mtcoding.metamall.core.advice;
+
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import shop.mtcoding.metamall.dto.user.UserRequest;
+
+@Aspect
+@Component
+public class ErrorLogAdvice {
+
+ //๊น๋ฐ์ ๋ณ์นญ์ฃผ๊ธฐ
+ @Pointcut("@annotation(shop.mtcoding.metamall.core.anotation.ErrorLog)")
+ public void errorLog(){}
+
+
+ @Before("errorLog()")
+ public void errorAdvice(JoinPoint jp) throws Throwable{
+ Object[] args = jp.getArgs();
+
+ for (Object arg : args) {
+ if(arg instanceof UserRequest.LoginDto){
+
+ System.out.println(((UserRequest.LoginDto) arg).getUsername()+"๋ ์๋
");
+ }
+ }
+ }
+}
diff --git a/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java b/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java
index 50ebee2..d138e73 100644
--- a/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java
+++ b/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java
@@ -2,11 +2,21 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import shop.mtcoding.metamall.core.exception.*;
-import shop.mtcoding.metamall.model.log.error.ErrorLogRepository;
+import shop.mtcoding.metamall.core.session.LoginUser;
+import shop.mtcoding.metamall.model.log.err.ErrorLog;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
+
+import javax.servlet.http.HttpSession;
+import java.util.List;
+import java.util.stream.Collectors;
@Slf4j
@RequiredArgsConstructor
@@ -15,28 +25,65 @@ public class MyExceptionAdvice {
private final ErrorLogRepository errorLogRepository;
+ private final HttpSession session;
+
@ExceptionHandler(Exception400.class)
- public ResponseEntity> badRequest(Exception400 e){
+ public ResponseEntity> badRequest(Exception400 e) { // ์๋ชป๋ ์์ฒญ์ ํ์ ๋
+ LoginUser loginUser = (LoginUser) session.getAttribute("login");
+ if (loginUser != null) { //๋ก๊ทธ์ธ์ด ๋์์ ๋
+ ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 400 - " + e.getMessage()).build();
+ errorLogRepository.save(errorLog);
+ }
return new ResponseEntity<>(e.body(), e.status());
}
@ExceptionHandler(Exception401.class)
- public ResponseEntity> unAuthorized(Exception401 e){
+ public ResponseEntity> unAuthorized(Exception401 e) { // ์ธ์ฆ๋์ง ์์์ ๋
+ LoginUser loginUser = (LoginUser) session.getAttribute("login");
+ if (loginUser != null) { //๋ก๊ทธ์ธ์ด ๋์์ ๋
+ ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 401 - " + e.getMessage()).build();
+ errorLogRepository.save(errorLog);
+ }
return new ResponseEntity<>(e.body(), e.status());
}
@ExceptionHandler(Exception403.class)
- public ResponseEntity> forbidden(Exception403 e){
+ public ResponseEntity> forbidden(Exception403 e) { // ์ฌ์ฉ์๊ฐ ์๋ชป๋ ์ ๊ทผ์ ํ์ ๋
+ LoginUser loginUser = (LoginUser) session.getAttribute("login");
+ System.out.println("์๋ฌ ๋ฐ์ ์ ์ : " + loginUser);
+ if (loginUser != null) { //๋ก๊ทธ์ธ์ด ๋์์ ๋
+ ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 403 - " + e.getMessage()).build();
+ errorLogRepository.save(errorLog);
+ }
return new ResponseEntity<>(e.body(), e.status());
}
@ExceptionHandler(Exception404.class)
- public ResponseEntity> notFound(Exception404 e){
+ public ResponseEntity> notFound(Exception404 e) { // ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์์ ๋
+ LoginUser loginUser = (LoginUser) session.getAttribute("login");
+ if (loginUser != null) { //๋ก๊ทธ์ธ์ด ๋์์ ๋
+ ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 404 - " + e.getMessage()).build();
+ errorLogRepository.save(errorLog);
+ }
return new ResponseEntity<>(e.body(), e.status());
}
@ExceptionHandler(Exception500.class)
- public ResponseEntity> serverError(Exception500 e){
+ public ResponseEntity> serverError(Exception500 e) {
+ LoginUser loginUser = (LoginUser) session.getAttribute("login");
+ if (loginUser != null) { //๋ก๊ทธ์ธ์ด ๋์์ ๋
+ ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 500 - " + e.getMessage()).build();
+ errorLogRepository.save(errorLog);
+ }
return new ResponseEntity<>(e.body(), e.status());
}
-}
+
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ public ResponseEntity> validError(MethodArgumentNotValidException e) {
+ BindingResult result = e.getBindingResult();
+ List errorMessages = result.getFieldErrors().stream()
+ .map(error -> error.getField() + " " + error.getDefaultMessage())
+ .collect(Collectors.toList());
+ return ResponseEntity.badRequest().body(errorMessages);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/shop/mtcoding/metamall/core/anotation/Authorize.java b/src/main/java/shop/mtcoding/metamall/core/anotation/Authorize.java
new file mode 100644
index 0000000..e756312
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/core/anotation/Authorize.java
@@ -0,0 +1,4 @@
+package shop.mtcoding.metamall.core.anotation;
+
+public @interface Authorize {
+}
diff --git a/src/main/java/shop/mtcoding/metamall/core/anotation/ErrorLog.java b/src/main/java/shop/mtcoding/metamall/core/anotation/ErrorLog.java
new file mode 100644
index 0000000..0db7191
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/core/anotation/ErrorLog.java
@@ -0,0 +1,4 @@
+package shop.mtcoding.metamall.core.anotation;
+
+public @interface ErrorLog {
+}
diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java
index d1b5fec..f99856b 100644
--- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java
+++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java
@@ -1,13 +1,19 @@
package shop.mtcoding.metamall.core.exception;
import lombok.Getter;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
+
+
import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.model.log.err.ErrorLog;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
// ์ ํจ์ฑ ์คํจ
@Getter
public class Exception400 extends RuntimeException {
+
public Exception400(String message) {
super(message);
}
diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java
index 5d2f310..0c79bf7 100644
--- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java
+++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java
@@ -4,6 +4,8 @@
import lombok.Getter;
import org.springframework.http.HttpStatus;
import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.model.log.err.ErrorLog;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
// ์ธ์ฆ ์๋จ
diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java
index c8dc137..562ae9d 100644
--- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java
+++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java
@@ -1,13 +1,18 @@
package shop.mtcoding.metamall.core.exception;
import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.model.log.err.ErrorLog;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
// ๊ถํ ์์
@Getter
public class Exception403 extends RuntimeException {
+
public Exception403(String message) {
super(message);
}
diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java
index c20b64f..e883d72 100644
--- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java
+++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java
@@ -3,6 +3,8 @@
import lombok.Getter;
import org.springframework.http.HttpStatus;
import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.model.log.err.ErrorLog;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
// ๋ฆฌ์์ค ์์
@@ -10,6 +12,7 @@
public class Exception404 extends RuntimeException {
public Exception404(String message) {
super(message);
+
}
public ResponseDto> body(){
diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java
index d3d4468..ec6e4fb 100644
--- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java
+++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java
@@ -3,11 +3,14 @@
import lombok.Getter;
import org.springframework.http.HttpStatus;
import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.model.log.err.ErrorLog;
+import shop.mtcoding.metamall.model.log.err.ErrorLogRepository;
// ์๋ฒ ์๋ฌ
@Getter
public class Exception500 extends RuntimeException {
+
public Exception500(String message) {
super(message);
}
diff --git a/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java b/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java
index 870bf93..347dd7a 100644
--- a/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java
+++ b/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java
@@ -10,6 +10,7 @@
import shop.mtcoding.metamall.core.jwt.JwtProvider;
import shop.mtcoding.metamall.core.session.LoginUser;
import shop.mtcoding.metamall.dto.ResponseDto;
+import shop.mtcoding.metamall.model.user.Role;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
@@ -31,8 +32,8 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
String jwt = prefixJwt.replace(JwtProvider.TOKEN_PREFIX, "");
try {
DecodedJWT decodedJWT = JwtProvider.verify(jwt);
- int id = decodedJWT.getClaim("id").asInt();
- String role = decodedJWT.getClaim("role").asString();
+ Long id = decodedJWT.getClaim("id").asLong();
+ String role = decodedJWT.getClaim("role").toString();
// ์ธ์
์ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ถํ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์์ด๋ค.
HttpSession session = req.getSession();
diff --git a/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java b/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java
index 93a4bae..b314137 100644
--- a/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java
+++ b/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java
@@ -24,7 +24,7 @@ public static String create(User user) {
.withSubject(SUBJECT)
.withExpiresAt(new Date(System.currentTimeMillis() + EXP))
.withClaim("id", user.getId())
- .withClaim("role", user.getRole())
+ .withClaim("role", user.getRole().toString())
.sign(Algorithm.HMAC512(SECRET));
System.out.println("๋๋ฒ๊ทธ : ํ ํฐ ์์ฑ๋จ");
return TOKEN_PREFIX + jwt;
diff --git a/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java b/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java
index 59f402c..d8a63ea 100644
--- a/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java
+++ b/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java
@@ -2,14 +2,15 @@
import lombok.Builder;
import lombok.Getter;
+import shop.mtcoding.metamall.model.user.Role;
@Getter
public class LoginUser {
- private Integer id;
+ private Long id;
private String role;
@Builder
- public LoginUser(Integer id, String role) {
+ public LoginUser(Long id, String role) {
this.id = id;
this.role = role;
}
diff --git a/src/main/java/shop/mtcoding/metamall/dto/order/OrderRequest.java b/src/main/java/shop/mtcoding/metamall/dto/order/OrderRequest.java
new file mode 100644
index 0000000..769cb78
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/dto/order/OrderRequest.java
@@ -0,0 +1,19 @@
+package shop.mtcoding.metamall.dto.order;
+
+import lombok.Getter;
+import lombok.Setter;
+import shop.mtcoding.metamall.model.product.Product;
+import shop.mtcoding.metamall.model.user.User;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+public class OrderRequest {
+ @Getter @Setter
+ public static class OrderDto {
+ @NotBlank(message = "์
๋ ฅ์ ํ์์
๋๋ค")
+ private String name;
+ @NotNull(message = "์
๋ ฅ์ ํ์์
๋๋ค")
+ private Integer count;
+ }
+}
diff --git a/src/main/java/shop/mtcoding/metamall/dto/product/ProductRequest.java b/src/main/java/shop/mtcoding/metamall/dto/product/ProductRequest.java
new file mode 100644
index 0000000..826ab61
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/dto/product/ProductRequest.java
@@ -0,0 +1,15 @@
+package shop.mtcoding.metamall.dto.product;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+public class ProductRequest {
+ @Getter @Setter
+ public static class ProductDto {
+
+ @NotBlank(message = " ์
๋ ฅ์ ํ์์
๋๋ค")
+ private String productname;
+ }
+}
diff --git a/src/main/java/shop/mtcoding/metamall/dto/user/UserResponse.java b/src/main/java/shop/mtcoding/metamall/dto/product/UserResponse.java
similarity index 71%
rename from src/main/java/shop/mtcoding/metamall/dto/user/UserResponse.java
rename to src/main/java/shop/mtcoding/metamall/dto/product/UserResponse.java
index ae218ec..02b3dc7 100644
--- a/src/main/java/shop/mtcoding/metamall/dto/user/UserResponse.java
+++ b/src/main/java/shop/mtcoding/metamall/dto/product/UserResponse.java
@@ -1,4 +1,4 @@
-package shop.mtcoding.metamall.dto.user;
+package shop.mtcoding.metamall.dto.product;
// ์๋ต DTO๋ ์๋น์ค ๋ฐฐ์ฐ๊ณ ๋์ ํ๊ธฐ (ํ ์ ์์ผ๋ฉด ํด๋ณด๊ธฐ)
public class UserResponse {
diff --git a/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java b/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java
index 80947db..39554f9 100644
--- a/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java
+++ b/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java
@@ -3,10 +3,14 @@
import lombok.Getter;
import lombok.Setter;
+import javax.validation.constraints.NotBlank;
+
public class UserRequest {
@Getter @Setter
public static class LoginDto {
+ @NotBlank(message = "๊ณ ๊ฐ๋ช
์
๋ ฅ์ ํ์์
๋๋ค")
private String username;
+ @NotBlank(message = "๋น๋ฐ๋ฒํธ ์
๋ ฅ์ ํ์์
๋๋ค")
private String password;
}
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLog.java b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLog.java
similarity index 72%
rename from src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLog.java
rename to src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLog.java
index fbfe7e5..5e2b195 100644
--- a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLog.java
+++ b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLog.java
@@ -1,4 +1,4 @@
-package shop.mtcoding.metamall.model.log.error;
+package shop.mtcoding.metamall.model.log.err;
import lombok.Builder;
import lombok.Getter;
@@ -19,26 +19,25 @@ public class ErrorLog {
private Long id;
private String msg;
private Long userId;
-
private LocalDateTime createdAt;
- private LocalDateTime updatedAt;
+// private LocalDateTime updatedAt; ํ์ ์์ ๋ฏ
@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
}
- @PreUpdate
- protected void onUpdate() {
- this.updatedAt = LocalDateTime.now();
- }
+// @PreUpdate
+// protected void onUpdate() {
+// this.updatedAt = LocalDateTime.now();
+// } ํ์ ์์ ๋ฏ
@Builder
- public ErrorLog(Long id, String msg, Long userId, LocalDateTime createdAt, LocalDateTime updatedAt) {
+ public ErrorLog(Long id, String msg, Long userId, LocalDateTime createdAt) {
this.id = id;
this.msg = msg;
this.userId = userId;
this.createdAt = createdAt;
- this.updatedAt = updatedAt;
+// this.updatedAt = updatedAt;
}
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLogRepository.java b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLogRepository.java
new file mode 100644
index 0000000..00bf732
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLogRepository.java
@@ -0,0 +1,9 @@
+package shop.mtcoding.metamall.model.log.err;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+
+public interface ErrorLogRepository extends JpaRepository {
+}
diff --git a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLogRepository.java b/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLogRepository.java
deleted file mode 100644
index 53c8a4f..0000000
--- a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLogRepository.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package shop.mtcoding.metamall.model.log.error;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-public interface ErrorLogRepository extends JpaRepository {
-}
diff --git a/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java b/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java
index 40b2964..245b2c1 100644
--- a/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java
+++ b/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java
@@ -21,18 +21,12 @@ public class LoginLog {
private String userAgent;
private String clientIP;
private LocalDateTime createdAt;
- private LocalDateTime updatedAt;
@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
}
- @PreUpdate
- protected void onUpdate() {
- this.updatedAt = LocalDateTime.now();
- }
-
@Builder
public LoginLog(Long id, Long userId, String userAgent, String clientIP, LocalDateTime createdAt) {
diff --git a/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java b/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java
index 165905e..0d94069 100644
--- a/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java
+++ b/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java
@@ -11,8 +11,8 @@
import java.time.LocalDateTime;
@NoArgsConstructor
-@Setter // DTO ๋ง๋ค๋ฉด ์ญ์ ํด์ผ๋จ
@Getter
+@Setter
@Table(name = "order_product_tb")
@Entity
public class OrderProduct { // ์ฃผ๋ฌธ ์ํ
@@ -20,33 +20,36 @@ public class OrderProduct { // ์ฃผ๋ฌธ ์ํ
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
+ @JoinColumn(name = "productId")
private Product product;
+ @Column(nullable = false)
private Integer count; // ์ํ ์ฃผ๋ฌธ ๊ฐ์
private Integer orderPrice; // ์ํ ์ฃผ๋ฌธ ๊ธ์ก
private LocalDateTime createdAt;
- private LocalDateTime updatedAt;
+// private LocalDateTime updatedAt;
- @ManyToOne
- private OrderSheet orderSheet;
+// @ManyToOne
+// OrderSheet๋ฅผ ์ ์ฅํ๊ณ ์ถ์๋๋ฐ ์ด๋ ค์์ ์ผ๋จ id๋ก
+ private Long orderSheet;
@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
}
- @PreUpdate
- protected void onUpdate() {
- this.updatedAt = LocalDateTime.now();
- }
+// @PreUpdate ์
๋ฐ์ดํธ๊ฐ ํ์ ์๋?
+// protected void onUpdate() {
+// this.updatedAt = LocalDateTime.now();
+// }
@Builder
- public OrderProduct(Long id, Product product, Integer count, Integer orderPrice, LocalDateTime createdAt, LocalDateTime updatedAt, OrderSheet orderSheet) {
+ public OrderProduct(Long id, Product product, Integer count, Integer orderPrice, LocalDateTime createdAt, Long orderSheet) {
this.id = id;
this.product = product;
this.count = count;
this.orderPrice = orderPrice;
this.createdAt = createdAt;
- this.updatedAt = updatedAt;
+// this.updatedAt = updatedAt;
this.orderSheet = orderSheet;
}
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java
index 7638710..5e119cb 100644
--- a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java
+++ b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java
@@ -23,8 +23,10 @@ public class OrderSheet { // ์ฃผ๋ฌธ์
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
+ @JoinColumn(name = "userId")
private User user; // ์ฃผ๋ฌธ์
- @OneToMany(mappedBy = "orderSheet")
+
+ @OneToMany(mappedBy = "orderSheet", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)// OrderSheet๋ฅผ ์ญ์ ํ๋ฉด OrderProduct ๋ค๋ ์ฌ๋ผ์ง๊ฒ
private List orderProductList = new ArrayList<>(); // ์ด ์ฃผ๋ฌธ ์ํ ๋ฆฌ์คํธ
private Integer totalPrice; // ์ด ์ฃผ๋ฌธ ๊ธ์ก (์ด ์ฃผ๋ฌธ ์ํ ๋ฆฌ์คํธ์ orderPrice ํฉ)
private LocalDateTime createdAt;
@@ -50,4 +52,14 @@ public OrderSheet(Long id, User user, Integer totalPrice, LocalDateTime createdA
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
+
+ @Override
+ public String toString() {
+ return "OrderSheet{" +
+ "id=" + id +
+ ", user=" + user +
+ ", orderProductList=" + orderProductList +
+ ", totalPrice=" + totalPrice +
+ '}';
+ }
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java
index 5d59249..e30be5e 100644
--- a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java
+++ b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java
@@ -1,6 +1,19 @@
package shop.mtcoding.metamall.model.ordersheet;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Optional;
public interface OrderSheetRepository extends JpaRepository {
+ @Query("select o from OrderSheet o where o.user.id = :userId")
+ Optional findByUserId(@Param("userId") Long userId);
+
+ @Modifying
+ @Transactional
+ @Query("delete from OrderSheet o where o.user.id = :userId")
+ void deleteByUserId(@Param("userId") Long userId);
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/product/Product.java b/src/main/java/shop/mtcoding/metamall/model/product/Product.java
index bc8c618..0c0ca72 100644
--- a/src/main/java/shop/mtcoding/metamall/model/product/Product.java
+++ b/src/main/java/shop/mtcoding/metamall/model/product/Product.java
@@ -6,20 +6,31 @@
import lombok.Setter;
import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@NoArgsConstructor
-@Setter // DTO ๋ง๋ค๋ฉด ์ญ์ ํด์ผ๋จ
@Getter
+@Setter
@Table(name = "product_tb")
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- private String name; // ์ํ ์ด๋ฆ
+ @NotBlank(message = "์
๋ ฅ์ ํ์์
๋๋ค")
+ @Column(nullable = false, length = 50)
+ private String productname; // ์ํ ์ด๋ฆ
+
+ @NotNull(message = "์
๋ ฅ์ ํ์์
๋๋ค")
+ @Column(nullable = false, length = Integer.MAX_VALUE)
private Integer price; // ์ํ ๊ฐ๊ฒฉ
+
+ @NotNull(message = "์
๋ ฅ์ ํ์์
๋๋ค")
+ @Column(nullable = false, length = Integer.MAX_VALUE)
private Integer qty; // ์ํ ์ฌ๊ณ
+
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
@@ -34,12 +45,22 @@ protected void onUpdate() {
}
@Builder
- public Product(Long id, String name, Integer price, Integer qty, LocalDateTime createdAt, LocalDateTime updatedAt) {
+ public Product(Long id, String productname, Integer price, Integer qty, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.id = id;
- this.name = name;
+ this.productname = productname;
this.price = price;
this.qty = qty;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
+
+ @Override
+ public String toString() {
+ return "Product{" +
+ "id=" + id +
+ ", productname='" + productname + '\'' +
+ ", price=" + price +
+ ", qty=" + qty +
+ '}';
+ }
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java b/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java
index ba5def3..9b659c3 100644
--- a/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java
+++ b/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java
@@ -1,6 +1,12 @@
package shop.mtcoding.metamall.model.product;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.Optional;
public interface ProductRepository extends JpaRepository {
+ @Query("select p from Product p where p.productname = :productname")
+ Optional findByName(@Param("productname") String productname);
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/user/Role.java b/src/main/java/shop/mtcoding/metamall/model/user/Role.java
new file mode 100644
index 0000000..34b765c
--- /dev/null
+++ b/src/main/java/shop/mtcoding/metamall/model/user/Role.java
@@ -0,0 +1,5 @@
+package shop.mtcoding.metamall.model.user;
+
+public enum Role {
+ USER,SELLER,ADMIN
+}
diff --git a/src/main/java/shop/mtcoding/metamall/model/user/User.java b/src/main/java/shop/mtcoding/metamall/model/user/User.java
index c929ce5..554a67a 100644
--- a/src/main/java/shop/mtcoding/metamall/model/user/User.java
+++ b/src/main/java/shop/mtcoding/metamall/model/user/User.java
@@ -1,26 +1,38 @@
package shop.mtcoding.metamall.model.user;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+import java.sql.Timestamp;
import java.time.LocalDateTime;
@NoArgsConstructor
-@Setter // DTO ๋ง๋ค๋ฉด ์ญ์ ํด์ผ๋จ
@Getter
+@Setter
@Table(name = "user_tb")
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
+ @NotBlank(message = " ์
๋ ฅ์ ํ์์
๋๋ค")
+ @Column(length = 30)
private String username;
+ @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
+ @NotBlank(message = " ์
๋ ฅ์ ํ์์
๋๋ค")
+ @Column(length = 100)
private String password;
+ @NotBlank(message = " ์
๋ ฅ์ ํ์์
๋๋ค")
+ @Column(length = 50)
private String email;
- private String role; // USER(๊ณ ๊ฐ), SELLER(ํ๋งค์), ADMIN(๊ด๋ฆฌ์)
+ private Role role; // USER(๊ณ ๊ฐ), SELLER(ํ๋งค์), ADMIN(๊ด๋ฆฌ์)
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
@@ -35,7 +47,7 @@ protected void onUpdate() {
}
@Builder
- public User(Long id, String username, String password, String email, String role, LocalDateTime createdAt) {
+ public User(Long id, String username, String password, String email, Role role, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.id = id;
this.username = username;
this.password = password;
@@ -43,4 +55,15 @@ public User(Long id, String username, String password, String email, String role
this.role = role;
this.createdAt = createdAt;
}
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "id=" + id +
+ ", username='" + username + '\'' +
+ ", password='" + password + '\'' +
+ ", email='" + email + '\'' +
+ ", role=" + role +
+ '}';
+ }
}
diff --git a/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java b/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java
index 293a101..2f642f9 100644
--- a/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java
+++ b/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java
@@ -6,7 +6,7 @@
import java.util.Optional;
-public interface UserRepository extends JpaRepository {
+public interface UserRepository extends JpaRepository {
@Query("select u from User u where u.username = :username")
Optional findByUsername(@Param("username") String username);
diff --git a/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java b/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java
new file mode 100644
index 0000000..3f4756a
--- /dev/null
+++ b/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java
@@ -0,0 +1,159 @@
+package shop.mtcoding.metamall.controller;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.transaction.annotation.Transactional;
+import shop.mtcoding.metamall.core.exception.Exception400;
+import shop.mtcoding.metamall.core.exception.Exception404;
+import shop.mtcoding.metamall.model.orderproduct.OrderProduct;
+import shop.mtcoding.metamall.model.orderproduct.OrderProductRepository;
+import shop.mtcoding.metamall.model.ordersheet.OrderSheet;
+import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository;
+import shop.mtcoding.metamall.model.product.Product;
+import shop.mtcoding.metamall.model.product.ProductRepository;
+import shop.mtcoding.metamall.model.user.User;
+import shop.mtcoding.metamall.model.user.UserRepository;
+
+import java.util.Date;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+class OrderControllerTest {
+
+ private static final String SUBJECT = "jwtstudy";
+ private static final int EXP = 1000 * 60 * 60;
+ public static final String TOKEN_PREFIX = "Bearer "; // ์คํ์ด์ค ํ์ํจ
+ public static final String HEADER = "Authorization";
+ private static final String SECRET = "๋ฉํ์ฝ๋ฉ";
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Autowired
+ private ProductRepository productRepository;
+
+ @Autowired
+ private OrderProductRepository orderProductRepository;
+
+ @Autowired
+ private OrderSheetRepository orderSheetRepository;
+
+ private String jwt = "";
+
+
+ @BeforeEach
+ @Transactional
+ void setUp() {
+ User user = userRepository.findById(2L).get(); //ssar ์ ์ ๊บผ๋ด์ ๋ก๊ทธ์ธ์ํค๊ธฐ
+// User user = userRepository.findById(1L).get(); //seller ์ ์ ๊บผ๋ด์ ๋ก๊ทธ์ธ์ํค๊ธฐ
+
+ jwt = TOKEN_PREFIX + JWT.create()
+ .withSubject(SUBJECT)
+ .withExpiresAt(new Date(System.currentTimeMillis() + EXP))
+ .withClaim("id", user.getId())
+ .withClaim("role", user.getRole().toString())
+ .sign(Algorithm.HMAC512(SECRET));
+
+ // ssar์ book1 ์ฃผ๋ฌธ ๋ง๋ค๊ธฐ, seller๋ ์๋จ ordersheet ์์
+ Product productPS = productRepository.findByName("book1").get();
+
+ productPS.setQty(productPS.getQty() - 10); //10๊ฐ ์ฃผ๋ฌธ, ์๋ ์
๋ฐ์ดํธ
+ OrderProduct orderProduct = OrderProduct.builder().product(productPS).count(10).orderPrice(productPS.getPrice() * 10).build();
+ orderProductRepository.save(orderProduct);
+
+ OrderSheet orderSheetPS = orderSheetRepository.findByUserId(user.getId()).get();
+
+ List orderProductList = orderSheetPS.getOrderProductList();
+ orderProductList.add(orderProduct);
+ orderSheetPS.setOrderProductList(orderProductList); //orderProduct ์ถ๊ฐ๋ ๋ฆฌ์คํธ๋ก ์
๋ฐ์ดํธ
+//
+ Integer totalPrice = orderSheetPS.getTotalPrice();
+ totalPrice = totalPrice + orderProduct.getOrderPrice();
+ orderSheetPS.setTotalPrice(totalPrice);
+
+ orderProduct.setOrderSheet(orderSheetPS.getId());
+
+ User seller = userRepository.findById(1L).get(); //seller ์ ์ ๊บผ๋ด์ ๋ก๊ทธ์ธ์ํค๊ธฐ
+
+ jwt = TOKEN_PREFIX + JWT.create()
+ .withSubject(SUBJECT)
+ .withExpiresAt(new Date(System.currentTimeMillis() + EXP))
+ .withClaim("id", seller.getId())
+ .withClaim("role", seller.getRole().toString())
+ .sign(Algorithm.HMAC512(SECRET));
+ }
+
+ @Test
+ @Transactional
+ void order() throws Exception{
+ //given
+ String requestBody = "{\"name\":\"book1\",\"count\":\"10\"}"; //OrderDto ๋ง๋ค์ด์ ์ ๋ฌ
+
+ //then
+ MvcResult result = mockMvc.perform(post("/order")
+ .header(HEADER, jwt)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBody))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ @Transactional
+ void findAllOrder() throws Exception{
+ //then
+ MvcResult result = mockMvc.perform(get("/findAllOrder")
+ .header(HEADER, jwt))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ @Transactional
+ void cancel() throws Exception{
+ MvcResult result = mockMvc.perform(delete("/cancel")
+ .header(HEADER, jwt))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ @Transactional
+ void cancelSeller() throws Exception{
+ MvcResult result = mockMvc.perform(delete("/cancel/{userId}", 2L) //ssar์ ์ฃผ๋ฌธ ์ทจ์
+ .header(HEADER, jwt)) //Role์ด Seller์ฌ์ผ ํจ
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java b/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java
new file mode 100644
index 0000000..5affa68
--- /dev/null
+++ b/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java
@@ -0,0 +1,132 @@
+package shop.mtcoding.metamall.controller;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.transaction.annotation.Transactional;
+import shop.mtcoding.metamall.model.user.User;
+import shop.mtcoding.metamall.model.user.UserRepository;
+
+import java.util.Date;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+class ProductControllerTest {
+
+ private static final String SUBJECT = "jwtstudy";
+ private static final int EXP = 1000 * 60 * 60;
+ public static final String TOKEN_PREFIX = "Bearer "; // ์คํ์ด์ค ํ์ํจ
+ public static final String HEADER = "Authorization";
+ private static final String SECRET = "๋ฉํ์ฝ๋ฉ";
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ private String jwt = "";
+
+ @BeforeEach
+ void setUp(){
+// User user = userRepository.findById(2L).get(); //ssar ์ ์ ๊บผ๋ด์ ๋ก๊ทธ์ธ์ํค๊ธฐ
+ User user = userRepository.findById(1L).get(); //seller ์ ์ ๊บผ๋ด์ ๋ก๊ทธ์ธ์ํค๊ธฐ
+
+
+ jwt = TOKEN_PREFIX + JWT.create()
+ .withSubject(SUBJECT)
+ .withExpiresAt(new Date(System.currentTimeMillis() + EXP))
+ .withClaim("id", user.getId())
+ .withClaim("role", user.getRole().toString())
+ .sign(Algorithm.HMAC512(SECRET));
+ //
+ }
+
+
+ @Test
+ void find() throws Exception{
+ //given
+ String requestBody = "{\"name\":\"book1\"}"; //productDto ๋ง๋ค์ด์ ์ ๋ฌ
+
+ //then
+ MvcResult result = mockMvc.perform(post("/find")
+ .header(HEADER, jwt)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBody))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ void findAll() throws Exception{
+ //then
+ MvcResult result = mockMvc.perform(get("/findAll")
+ .header(HEADER, jwt))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ void upload() throws Exception{
+ //given
+ String requestBody = "{\"name\":\"book3\",\"price\":\"100000\",\"qty\":\"10\"}";
+
+ //then
+ MvcResult result = mockMvc.perform(post("/upload")
+ .header(HEADER, jwt)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBody))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ void update() throws Exception{
+ //given
+ String requestBody = "{\"productname\":\"book2\",\"price\":\"12345\",\"qty\":\"10\"}"; // ์์ ํ ๋ฌผ๊ฑด ๋ด์ฉ book2๋ฅผ ์์
+
+ //then
+ MvcResult result = mockMvc.perform(put("/update")
+ .header(HEADER, jwt)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBody))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+ @Test
+ @Transactional
+ void delete_Test() throws Exception{
+ //then
+ mockMvc.perform(delete("/delete/{productname}", "book2")
+ .header(HEADER, jwt)
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk());
+
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java b/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java
new file mode 100644
index 0000000..a1b9b64
--- /dev/null
+++ b/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java
@@ -0,0 +1,63 @@
+package shop.mtcoding.metamall.controller;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+class UserControllerTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @BeforeEach
+ void setUp() {
+ }
+
+ @Test
+ void login() throws Exception{
+ //given
+ String requestBody = "{\"username\":\"ssar\", \"password\":1234}";
+
+ //then
+ MvcResult result = mockMvc.perform(post("/login")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBody))
+ .andExpect(status().isOk())
+ .andReturn();
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+
+
+
+ @Test
+ void join() throws Exception{
+ //given
+ String requestBody = "{\"username\":\"jju\", \"password\":\"1234\", \"email\":\"1234@1234\"}";
+
+ //then
+ MvcResult result = mockMvc.perform(post("/join")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBody))
+ .andExpect(status().isOk())
+ .andReturn();
+
+ String content = result.getResponse().getContentAsString();
+ System.out.println(content);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java b/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java
new file mode 100644
index 0000000..86b21e5
--- /dev/null
+++ b/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java
@@ -0,0 +1,59 @@
+package shop.mtcoding.metamall.model.ordersheet;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+import shop.mtcoding.metamall.model.user.Role;
+import shop.mtcoding.metamall.model.user.User;
+import shop.mtcoding.metamall.model.user.UserRepository;
+
+import java.util.Optional;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+class OrderSheetRepositoryTest {
+ @Autowired
+ private OrderSheetRepository orderSheetRepository;
+ @Autowired
+ private UserRepository userRepository;
+
+ @BeforeEach
+ void setUp() {
+ User user = User.builder().username("jju").email("nn").password("1234").build(); //userId = 3
+ user.setRole(Role.USER);
+ userRepository.save(user);
+ OrderSheet orderSheet = OrderSheet.builder().user(user).totalPrice(0).build();
+ orderSheetRepository.save(orderSheet);
+ }
+
+ @Test
+ void findByUserId() {
+ //given
+ Long userId = 3L;
+
+ //when
+ Optional orderSheetOP = orderSheetRepository.findByUserId(userId);
+
+ //then
+ String username = orderSheetOP.get().getUser().getUsername();
+ Assertions.assertThat(username).isEqualTo("jju");
+ }
+
+ @Test
+ void deleteByUserId() {
+ //given
+ Long userId = 2L;
+
+ //when
+ orderSheetRepository.deleteByUserId(userId);
+
+ //then
+
+ Assertions.assertThat(orderSheetRepository.findByUserId(userId)).isNotPresent();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java b/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java
new file mode 100644
index 0000000..04a2bfd
--- /dev/null
+++ b/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java
@@ -0,0 +1,33 @@
+package shop.mtcoding.metamall.model.product;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+class ProductRepositoryTest {
+
+ @Autowired
+ private ProductRepository productRepository;
+
+
+ @Test
+ void findByName() {
+ //given
+ String productname = "phone";
+ Product product = Product.builder().productname(productname).price(1000).qty(10).build(); // id : 3
+ productRepository.save(product);
+ //when
+ Product findProduct = productRepository.findByName(productname).get();
+ //then
+ System.out.println("find ============ " + findProduct);
+ Assertions.assertThat(findProduct.getId()).isEqualTo(3);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java b/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java
new file mode 100644
index 0000000..eca9acb
--- /dev/null
+++ b/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java
@@ -0,0 +1,35 @@
+package shop.mtcoding.metamall.model.user;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+class UserRepositoryTest {
+
+ @Autowired
+ private UserRepository userRepository;
+
+
+ @Test
+ void findByUsername() {
+ //given
+ String username = "jju";
+ User user = User.builder().username(username).email("nn").password("1234").build(); //userId = 3
+ userRepository.save(user);
+ //when
+ User findUser = userRepository.findByUsername(username).get();
+ //then
+ System.out.println("find================" + findUser);
+ Assertions.assertThat(findUser.getId()).isEqualTo(3);
+
+ }
+}
\ No newline at end of file