From 8238f3ec85ad196da3ac54474862b78fc51f81c4 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Thu, 27 Jul 2023 17:15:23 +0900
Subject: [PATCH 01/33] =?UTF-8?q?User=20->=20Member=20=EB=B3=80=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
build.gradle | 1 +
readme.md | 24 +++++------
.../swger/tddstudy/member/domain/Member.java | 40 +++++++++++++++++++
.../domain/MemberLevel.java} | 4 +-
.../tddstudy/member/domain/MemberType.java | 12 ++++++
.../swger/tddstudy/order/domain/Order.java | 6 +--
.../com/swger/tddstudy/user/domain/User.java | 31 --------------
.../swger/tddstudy/user/domain/UserType.java | 12 ------
8 files changed, 70 insertions(+), 60 deletions(-)
create mode 100644 src/main/java/com/swger/tddstudy/member/domain/Member.java
rename src/main/java/com/swger/tddstudy/{user/domain/UserLevel.java => member/domain/MemberLevel.java} (70%)
create mode 100644 src/main/java/com/swger/tddstudy/member/domain/MemberType.java
delete mode 100644 src/main/java/com/swger/tddstudy/user/domain/User.java
delete mode 100644 src/main/java/com/swger/tddstudy/user/domain/UserType.java
diff --git a/build.gradle b/build.gradle
index e5ec1a5..3b55e26 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,6 +27,7 @@ dependencies {
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
+ implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
diff --git a/readme.md b/readme.md
index 0e8875a..1fc75a5 100644
--- a/readme.md
+++ b/readme.md
@@ -28,29 +28,29 @@
#### 패키지 구조
```text
├── controller
-│ └── UserController.java
+│ └── MemberController.java
├── domain
-│ ├── User.java
-│ ├── UserLevel.java
-│ └── UserType.java
+│ ├── Member.java
+│ ├── MemberLevel.java
+│ └── MemberType.java
├── repository
-│ └── UserRepository.java
+│ └── MemberRepository.java
└── service
- └── UserService.java
+ └── MemberService.java
```
-* 모든 도메인 패키지 구조는 다음을 따릅니다. (예시 : `user` 도메인)
+* 모든 도메인 패키지 구조는 다음을 따릅니다. (예시 : `Member` 도메인)
* 각 패키지 내부의 클래스들은 예시일 뿐 얼마든지 클래스를 추가로 생성하셔도 됩니다.
### 유저 도메인을 완성해봅시다.
| 변수명 | 필드명 | 설명 |
|----------------|----------|--------------------------|
| id | 사용자 아이디 | 사용자 엔티티 식별자 |
-| username | 사용자 아이디 | 사용자 로그인 아이디 |
+| Membername | 사용자 아이디 | 사용자 로그인 아이디 |
| password | 사용자 비밀번호 | 사용자 비밀번호 |
| nickname | 사용자 닉네임 | 사용자 닉네임 |
-| userLevel | 사용자 등급 | 사용자 등급 |
-| type | 사용자 유형 | 사용자 유형으로 ADMIN, USER가 존재 |
+| MemberLevel | 사용자 등급 | 사용자 등급 |
+| type | 사용자 유형 | 사용자 유형으로 ADMIN, Member가 존재 |
| createdAt | 생성 일시 | 사용자 최초 생성 일시 |
| lastModifiedAt | 최종 수정 일시 | 사용자 최종 수정 일시 |
* 사용자는 `회원가입`이 가능합니다.
@@ -62,7 +62,7 @@
* BRONZE, SILVER, GOLD가 존재하며 추후 주문 시 결제 금액 할인이 가능합니다.
* 5번 구매를 하면 SILVER, 10번 구매를 하면 GOLD로 등급업이 됩니다.
* 사용자 별 `타입(type)`이 존재합니다.
- * USER : 일반유저로 상품을 구매는 가능하지만 추가할 수 없습니다.
+ * Member : 일반유저로 상품을 구매는 가능하지만 추가할 수 없습니다.
* ADMIN : 관리자로 상품을 구매와 추가 모두 가능합니다.
@@ -93,7 +93,7 @@
| 변수명 | 필드명 | 설명 |
|----------------|----------|------------|
| id | 주문 아이디 | 주문 엔티티 식별자 |
-| userId | 유저 아이디 | 유저 엔티티 식별자 |
+| MemberId | 유저 아이디 | 유저 엔티티 식별자 |
| orderProducts | 주문 상품 정보 | 주문의 상품의 정보 |
| price | 총 주문 가격 | 총 주문 가격 |
| orderStatus | 주문 상태 | 주문 상태 |
diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java
new file mode 100644
index 0000000..63f3fad
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java
@@ -0,0 +1,40 @@
+package com.swger.tddstudy.member.domain;
+
+import com.swger.tddstudy.util.BaseEntity;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Entity
+public class Member extends BaseEntity {
+
+ @Id @GeneratedValue
+ private Long id;
+
+ @NotBlank
+ private String username;
+
+ @NotBlank
+ private String password;
+
+ @NotBlank
+ private String nickname;
+
+ @Enumerated(EnumType.STRING)
+ private MemberLevel MemberLevel;
+
+ @Enumerated(EnumType.STRING)
+ private MemberType type;
+
+ public Member(String username, String password, String nickname) {
+ this.username = username;
+ this.password = password;
+ this.nickname = nickname;
+ }
+}
diff --git a/src/main/java/com/swger/tddstudy/user/domain/UserLevel.java b/src/main/java/com/swger/tddstudy/member/domain/MemberLevel.java
similarity index 70%
rename from src/main/java/com/swger/tddstudy/user/domain/UserLevel.java
rename to src/main/java/com/swger/tddstudy/member/domain/MemberLevel.java
index 4f9e926..9a884b6 100644
--- a/src/main/java/com/swger/tddstudy/user/domain/UserLevel.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/MemberLevel.java
@@ -1,9 +1,9 @@
-package com.swger.tddstudy.user.domain;
+package com.swger.tddstudy.member.domain;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
-public enum UserLevel {
+public enum MemberLevel {
BRONZE("브론즈"), SILVER("실버"), GOLD("골드");
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberType.java b/src/main/java/com/swger/tddstudy/member/domain/MemberType.java
new file mode 100644
index 0000000..9e86662
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/domain/MemberType.java
@@ -0,0 +1,12 @@
+package com.swger.tddstudy.member.domain;
+
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public enum MemberType {
+
+ Member("일반회원"), ADMIN("관리자");
+
+ private final String text;
+
+}
diff --git a/src/main/java/com/swger/tddstudy/order/domain/Order.java b/src/main/java/com/swger/tddstudy/order/domain/Order.java
index 3267f59..bc978f1 100644
--- a/src/main/java/com/swger/tddstudy/order/domain/Order.java
+++ b/src/main/java/com/swger/tddstudy/order/domain/Order.java
@@ -2,7 +2,7 @@
import com.swger.tddstudy.orderProduct.domain.OrderProduct;
import com.swger.tddstudy.util.BaseEntity;
-import com.swger.tddstudy.user.domain.User;
+import com.swger.tddstudy.member.domain.Member;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
@@ -26,13 +26,13 @@ public class Order extends BaseEntity {
private Long id;
@ManyToOne
- private User user;
+ private Member Member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List orderProducts;
private int price;
- @Enum태erated(EnumType.STRING)
+ @Enumerated(EnumType.STRING)
private OrderStatus orderStatus;
}
diff --git a/src/main/java/com/swger/tddstudy/user/domain/User.java b/src/main/java/com/swger/tddstudy/user/domain/User.java
deleted file mode 100644
index 8df4eaa..0000000
--- a/src/main/java/com/swger/tddstudy/user/domain/User.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.swger.tddstudy.user.domain;
-
-import com.swger.tddstudy.util.BaseEntity;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Id;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-
-@Getter
-@NoArgsConstructor(access = AccessLevel.PROTECTED)
-@Entity
-public class User extends BaseEntity {
-
- @Id
- private Long id;
-
- private String username;
-
- private String password;
-
- private String nickname;
-
- @Enumerated(EnumType.STRING)
- private UserLevel userLevel;
-
- @Enumerated(EnumType.STRING)
- private UserType type;
-}
diff --git a/src/main/java/com/swger/tddstudy/user/domain/UserType.java b/src/main/java/com/swger/tddstudy/user/domain/UserType.java
deleted file mode 100644
index 73912c7..0000000
--- a/src/main/java/com/swger/tddstudy/user/domain/UserType.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.swger.tddstudy.user.domain;
-
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-public enum UserType {
-
- USER("일반회원"), ADMIN("관리자");
-
- private final String text;
-
-}
From c8c7952c36cf3089e09aa4389b0f5e7610728f86 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Thu, 27 Jul 2023 17:15:57 +0900
Subject: [PATCH 02/33] =?UTF-8?q?DTO=EB=A1=9C=20=EB=B0=9B=EC=95=84?=
=?UTF-8?q?=EC=98=A4=EB=8A=94=20=ED=99=98=EA=B2=BD=20=EC=84=A4=EC=A0=95?=
=?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20MemberDTO=20=EC=83=9D=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/swger/tddstudy/member/domain/MemberDTO.java | 12 ++++++++++++
1 file changed, 12 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
new file mode 100644
index 0000000..f83ff2f
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
@@ -0,0 +1,12 @@
+package com.swger.tddstudy.member.domain;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter @Setter
+public class MemberDTO {
+
+ private String username;
+ private String password;
+ private String nickname;
+}
From 8e00cf09f9e9b30de7ff98ebd9217591bf105194 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Thu, 27 Jul 2023 17:16:41 +0900
Subject: [PATCH 03/33] =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EA=B0=80=EC=9E=85?=
=?UTF-8?q?=20=EC=84=B1=EA=B3=B5=20/=20=EC=8B=A4=ED=8C=A8(=EC=95=84?=
=?UTF-8?q?=EC=9D=B4=EB=94=94=EB=A5=BC=20=EC=9E=91=EC=84=B1=ED=95=98?=
=?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=8C)=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/domain/MemberTest.java | 61 +++++++++++++++++++
1 file changed, 61 insertions(+)
create mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
new file mode 100644
index 0000000..7752a17
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
@@ -0,0 +1,61 @@
+package com.swger.tddstudy.member.domain;
+
+
+import com.swger.tddstudy.member.repository.MemberRepository;
+import com.swger.tddstudy.member.service.MemberService;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+@SpringBootTest
+@Transactional
+class MemberTest {
+ @Autowired
+ MemberRepository memberRepository;
+ @Autowired
+ MemberService memberService;
+ /**
+ * 회원가입
+ * */
+ /* 회원 가입 성공 */
+ /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname*/
+ @Test
+ public void SignUpSuccess() {
+ //given
+ MemberDTO memberDTO = new MemberDTO();
+ memberDTO.setUsername("testUsername");
+ memberDTO.setPassword("testPassword");
+ memberDTO.setNickname("testNickname");
+ //when
+ Member member= new Member(memberDTO.getUsername(), memberDTO.getPassword(), memberDTO.getNickname());
+ memberService.join(member);
+ List getMember = memberRepository.findByUsername("testUsername");
+ //then
+ Assertions.assertThat(getMember.get(0)).isEqualTo(member);
+ }
+
+ /* 회원 가입 실패 - 아이디 */
+ /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname*/
+ @Test
+ public void SignUpUsernameBlank() {
+ //given
+ MemberDTO MemberDTO = new MemberDTO();
+ MemberDTO.setPassword("testPassword");
+ MemberDTO.setNickname("testNickname");
+ //when
+ Member Member = new Member(MemberDTO.getUsername(), MemberDTO.getPassword(), MemberDTO.getNickname());
+ memberService.join(Member);
+ List getMember = memberRepository.findByUsername("");
+ //then
+ Assertions.assertThat(getMember.get(0)).isEqualTo(Member);
+ }
+ /* 회원 가입 실패 - 비밀번호*/
+
+ /* 회원 가입 실패 - 비밀번호 재확인*/
+
+ /* 회원 가입 실패 - 닉네임 */
+}
\ No newline at end of file
From abfd5aefc16bb1c23c55fae62821458b92c4d2d2 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Thu, 27 Jul 2023 17:17:46 +0900
Subject: [PATCH 04/33] =?UTF-8?q?Member=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20?=
=?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?=
=?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20:=20save,=20Member=20=EA=B0=9D?=
=?UTF-8?q?=EC=B2=B4=EB=A5=BC=20username=EC=9C=BC=EB=A1=9C=20=EC=B0=BE?=
=?UTF-8?q?=EA=B8=B0=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=86=8C=EB=93=9C:=20fi?=
=?UTF-8?q?ndByUsername?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/repository/MemberRepository.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java
diff --git a/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java
new file mode 100644
index 0000000..2fb64af
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java
@@ -0,0 +1,13 @@
+package com.swger.tddstudy.member.repository;
+
+import com.swger.tddstudy.member.domain.Member;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface MemberRepository extends JpaRepository {
+ List findByUsername(String username);
+
+ @Override
+ S save(S entity);
+}
From fe5a76944bc6e26b8ab766e01cc9c32d4917fa6a Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Thu, 27 Jul 2023 17:18:31 +0900
Subject: [PATCH 05/33] =?UTF-8?q?Transaction=ED=99=98=EA=B2=BD=EC=97=90?=
=?UTF-8?q?=EC=84=9C=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EB=A9=94?=
=?UTF-8?q?=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84:join?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/service/MemberService.java | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/member/service/MemberService.java
diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
new file mode 100644
index 0000000..b1f7267
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
@@ -0,0 +1,21 @@
+package com.swger.tddstudy.member.service;
+
+import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.repository.MemberRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class MemberService {
+ private final MemberRepository memberRepository;
+
+ public Member join(Member member){
+ memberRepository.save(member);
+ return member;
+ }
+}
From 9cd2ed1ea768fe38d5862d40a1693bcf5320dce9 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Thu, 27 Jul 2023 17:22:09 +0900
Subject: [PATCH 06/33] username
---
readme.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/readme.md b/readme.md
index 1fc75a5..640e832 100644
--- a/readme.md
+++ b/readme.md
@@ -46,10 +46,10 @@
| 변수명 | 필드명 | 설명 |
|----------------|----------|--------------------------|
| id | 사용자 아이디 | 사용자 엔티티 식별자 |
-| Membername | 사용자 아이디 | 사용자 로그인 아이디 |
+| username | 사용자 아이디 | 사용자 로그인 아이디 |
| password | 사용자 비밀번호 | 사용자 비밀번호 |
| nickname | 사용자 닉네임 | 사용자 닉네임 |
-| MemberLevel | 사용자 등급 | 사용자 등급 |
+| MemberLevel | 사용자 등급 | 사용자 등급 |
| type | 사용자 유형 | 사용자 유형으로 ADMIN, Member가 존재 |
| createdAt | 생성 일시 | 사용자 최초 생성 일시 |
| lastModifiedAt | 최종 수정 일시 | 사용자 최종 수정 일시 |
From c2d8b75f39608c3622f2c8621113b752ef569820 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 31 Jul 2023 16:48:27 +0900
Subject: [PATCH 07/33] =?UTF-8?q?Mock=EC=9D=84=20=EC=9D=B4=EC=9A=A9?=
=?UTF-8?q?=ED=95=9C=20Controller=20Test?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/domain/MemberDTO.java | 11 ++-
.../member/domain/MemberSignUpTest.java | 96 +++++++++++++++++++
2 files changed, 105 insertions(+), 2 deletions(-)
create mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
index f83ff2f..396ad4b 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
@@ -1,12 +1,19 @@
package com.swger.tddstudy.member.domain;
import lombok.Getter;
-import lombok.Setter;
-@Getter @Setter
+@Getter
public class MemberDTO {
private String username;
private String password;
private String nickname;
+ private String rePassword;
+
+ public MemberDTO(String username, String password, String nickname, String rePassword) {
+ this.username = username;
+ this.password = password;
+ this.nickname = nickname;
+ this.rePassword = rePassword;
+ }
}
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
new file mode 100644
index 0000000..faec2fc
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
@@ -0,0 +1,96 @@
+package com.swger.tddstudy.member.domain;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.swger.tddstudy.member.repository.MemberRepository;
+import com.swger.tddstudy.member.service.MemberService;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+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.web.servlet.MockMvc;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@SpringBootTest
+@Transactional
+@AutoConfigureMockMvc
+class MemberSignUpTest {
+ @Autowired
+ MemberRepository memberRepository;
+ @Autowired
+ MemberService memberService;
+ @Autowired
+ private MockMvc mockMvc;
+ @Autowired
+ private ObjectMapper om;
+ /**
+ * 회원가입
+ * */
+ /* 회원 가입 성공 */
+ /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/
+ @Test
+ public void SignUpSuccess() throws Exception {
+ //given
+ MemberDTO signInMember= new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/signIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("signInOK"))
+ .andDo(print());
+ //when
+ List getMember = memberRepository.findByUsername("testUsername");
+ //then
+ /* 아이디, 비밀번호 같은지 확인*/
+ /* equals로 진행하려고 했지만 안됨*/
+ Assertions.assertThat(getMember.get(0).getUsername()).isEqualTo(signInMember.getUsername());
+ Assertions.assertThat(getMember.get(0).getPassword()).isEqualTo(signInMember.getPassword());
+ }
+
+ /* 회원 가입 실패 - 비밀번호 재확인*/
+ /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: test*/
+ @Test
+ public void SignUpRePasswordMismatch() throws Exception {
+ //given
+ MemberDTO signInMember= new MemberDTO("testUsername",
+ "testPassword", "testNickname", "test");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/signIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Password Mismatch"))
+ .andDo(print());
+
+ }
+// /* 회원 가입 실패 - 아이디 */
+ /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/
+ @Test
+ public void SignUpUsernameBlank() throws Exception {
+ //given
+ MemberDTO signInMember= new MemberDTO("testUsername",
+ "testPassword", "", "testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/signIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("signInOK"))
+ .andDo(print());
+ // validation이 진행되지 않는 이유...
+// List members = memberRepository.findByUsername("testUsername");
+ }
+}
\ No newline at end of file
From bc4704d74cb762b052791ca1c3496d21a4d0a48e Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 31 Jul 2023 16:48:56 +0900
Subject: [PATCH 08/33] =?UTF-8?q?Controller:=20=ED=9A=8C=EC=9B=90=EA=B0=80?=
=?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/controller/MemberController.java | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/member/controller/MemberController.java
diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
new file mode 100644
index 0000000..ed8dd89
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
@@ -0,0 +1,27 @@
+package com.swger.tddstudy.member.controller;
+
+import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.domain.MemberDTO;
+import com.swger.tddstudy.member.service.MemberService;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.PackagePrivate;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequiredArgsConstructor
+public class MemberController {
+ private final MemberService memberService;
+// signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈
+ @PostMapping("/signIn")
+ public String signIn(@RequestBody MemberDTO memberDTO) {
+ /* 비밀번호 재확인 */
+ if (!memberDTO.getPassword().equals(memberDTO.getRePassword())) {
+ return "Password Mismatch";
+ }
+ Member newMember = new Member(memberDTO.getUsername(),
+ memberDTO.getPassword(), memberDTO.getNickname());
+ memberService.join(newMember);
+ return "signInOK";
+ }
+
+}
From dc8819651417cfad859dd7fcf081a72420df3136 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 31 Jul 2023 16:59:05 +0900
Subject: [PATCH 09/33] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=85=8C?=
=?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=84=B1=EA=B3=B5=20/=20=EC=8B=A4?=
=?UTF-8?q?=ED=8C=A8=20Test?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/controller/MemberController.java | 17 ++++
.../member/domain/MemberSignInTest.java | 87 +++++++++++++++++++
2 files changed, 104 insertions(+)
create mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java
diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
index ed8dd89..75085e8 100644
--- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
+++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
@@ -2,15 +2,20 @@
import com.swger.tddstudy.member.domain.Member;
import com.swger.tddstudy.member.domain.MemberDTO;
+import com.swger.tddstudy.member.domain.MemberSignInDTO;
+import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.experimental.PackagePrivate;
import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
+ private final MemberRepository memberRepository;
// signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈
@PostMapping("/signIn")
public String signIn(@RequestBody MemberDTO memberDTO) {
@@ -24,4 +29,16 @@ public String signIn(@RequestBody MemberDTO memberDTO) {
return "signInOK";
}
+ @PostMapping("/logIn")
+ public String logIn(@RequestBody MemberSignInDTO memberSignInDTO) {
+ List byUsername = memberRepository.findByUsername(memberSignInDTO.getUsername());
+ if (byUsername.isEmpty()) {
+ return "Username MisMatch";
+ }
+ if (!byUsername.get(0).getPassword().equals(memberSignInDTO.getPassword())){
+ return "Password MisMatch";
+ }
+ return "LogInOK";
+ }
+
}
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java
new file mode 100644
index 0000000..9c8e38f
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java
@@ -0,0 +1,87 @@
+package com.swger.tddstudy.member.domain;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.swger.tddstudy.member.repository.MemberRepository;
+import com.swger.tddstudy.member.service.MemberService;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+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.web.servlet.MockMvc;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@SpringBootTest
+@Transactional
+@AutoConfigureMockMvc
+class MemberSignInTest {
+ @Autowired
+ MemberRepository memberRepository;
+ @Autowired
+ MemberService memberService;
+ @Autowired
+ private MockMvc mockMvc;
+ @Autowired
+ private ObjectMapper om;
+ /**
+ * 로그인
+ * */
+ /* 로그인 성공 */
+ /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword*/
+ @Test
+ public void SignInSuccess() throws Exception {
+ //given
+ memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/logIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("LogInOK"))
+ .andDo(print());
+ }
+ /* 로그인 실패 - 아이디 틀림 */
+ /* 사용자 입력: 아이디:test , 비밀번호: testPassword*/
+ @Test
+ public void SignInFailUsername() throws Exception {
+ //given
+ memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMember= new MemberSignInDTO("test","testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/logIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Username MisMatch"))
+ .andDo(print());
+ }
+ /* 로그인 실패 - 비밀번호 틀림 */
+ /* 사용자 입력: 아이디:testUsername , 비밀번호: test*/
+ @Test
+ public void SignInFailPassword() throws Exception {
+ //given
+ memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","test");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/logIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Password MisMatch"))
+ .andDo(print());
+ }
+
+}
\ No newline at end of file
From 40624610fe9cbe9885ddf4204e011ca9789e233f Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 31 Jul 2023 16:59:29 +0900
Subject: [PATCH 10/33] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=9A=A9=20DT?=
=?UTF-8?q?O=20=EC=83=9D=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/domain/MemberSignInDTO.java | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java
new file mode 100644
index 0000000..b453b03
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java
@@ -0,0 +1,16 @@
+package com.swger.tddstudy.member.domain;
+
+import lombok.Getter;
+
+@Getter
+public class MemberSignInDTO {
+
+ private String username;
+ private String password;
+
+ public MemberSignInDTO(String username, String password) {
+ this.username = username;
+ this.password = password;
+
+ }
+}
From d58abb953a770278186f4f0edf72a7009a7eef61 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 31 Jul 2023 16:59:59 +0900
Subject: [PATCH 11/33] =?UTF-8?q?equals=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?=
=?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../swger/tddstudy/member/domain/Member.java | 26 +++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java
index 63f3fad..d17e71a 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/Member.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java
@@ -1,7 +1,7 @@
package com.swger.tddstudy.member.domain;
import com.swger.tddstudy.util.BaseEntity;
-
+import com.swger.tddstudy.member.domain.MemberLevel;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
@@ -9,8 +9,9 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
+import java.util.Objects;
+
@Getter
-@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member extends BaseEntity {
@@ -36,5 +37,26 @@ public Member(String username, String password, String nickname) {
this.username = username;
this.password = password;
this.nickname = nickname;
+ this.MemberLevel = MemberLevel.BRONZE;
+ }
+ public Member(){}
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Member)) return false;
+ Member member = (Member) o;
+ return Objects.equals(getId(), member.getId())
+ && Objects.equals(getUsername(), member.getUsername())
+ && Objects.equals(getPassword(), member.getPassword())
+ && Objects.equals(getNickname(), member.getNickname())
+ && getMemberLevel() == member.getMemberLevel() && getType() == member.getType();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getId(), getUsername(), getPassword(),
+ getNickname(), getMemberLevel(), getType());
}
}
From 0aa291cf7c398d94359ea7e7c91cbe6edcfb466f Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 31 Jul 2023 18:46:59 +0900
Subject: [PATCH 12/33] =?UTF-8?q?Vaildation=20=EC=98=A4=EB=A5=98=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/controller/MemberController.java | 3 ++-
.../com/swger/tddstudy/member/domain/MemberDTO.java | 7 ++++++-
.../tddstudy/member/domain/MemberSignUpTest.java | 11 +++++------
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
index 75085e8..206d710 100644
--- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
+++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
@@ -9,6 +9,7 @@
import lombok.experimental.PackagePrivate;
import org.springframework.web.bind.annotation.*;
+import javax.validation.Valid;
import java.util.List;
@RestController
@@ -18,7 +19,7 @@ public class MemberController {
private final MemberRepository memberRepository;
// signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈
@PostMapping("/signIn")
- public String signIn(@RequestBody MemberDTO memberDTO) {
+ public String signIn(@Valid @RequestBody MemberDTO memberDTO) {
/* 비밀번호 재확인 */
if (!memberDTO.getPassword().equals(memberDTO.getRePassword())) {
return "Password Mismatch";
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
index 396ad4b..32e330c 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
@@ -2,12 +2,17 @@
import lombok.Getter;
+import javax.validation.constraints.NotBlank;
+
@Getter
public class MemberDTO {
-
+ @NotBlank
private String username;
+ @NotBlank
private String password;
+ @NotBlank
private String nickname;
+ @NotBlank
private String rePassword;
public MemberDTO(String username, String password, String nickname, String rePassword) {
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
index faec2fc..5dfc476 100644
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
@@ -16,8 +16,7 @@
import java.util.List;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@SpringBootTest
@Transactional
@@ -53,9 +52,10 @@ public void SignUpSuccess() throws Exception {
List getMember = memberRepository.findByUsername("testUsername");
//then
/* 아이디, 비밀번호 같은지 확인*/
- /* equals로 진행하려고 했지만 안됨*/
Assertions.assertThat(getMember.get(0).getUsername()).isEqualTo(signInMember.getUsername());
Assertions.assertThat(getMember.get(0).getPassword()).isEqualTo(signInMember.getPassword());
+// equals로 진행하려고 했지만 안됨
+// Assertions.assertThat(getMember.get(0).equals(signInMember)).isTrue();
}
/* 회원 가입 실패 - 비밀번호 재확인*/
@@ -81,14 +81,13 @@ public void SignUpRePasswordMismatch() throws Exception {
public void SignUpUsernameBlank() throws Exception {
//given
MemberDTO signInMember= new MemberDTO("testUsername",
- "testPassword", "", "testPassword");
+ "testPassword", null, "testPassword");
String content = om.writeValueAsString(signInMember);
mockMvc.perform(post("/signIn")
.content(content)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("signInOK"))
+ .andExpect(status().isBadRequest())
.andDo(print());
// validation이 진행되지 않는 이유...
// List members = memberRepository.findByUsername("testUsername");
From 80a2ab16b481f854b651e36af2dcafbe7a9104dc Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:03:22 +0900
Subject: [PATCH 13/33] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20Test=20=ED=86=B5?=
=?UTF-8?q?=ED=95=A9=20=EB=B0=8F=20Servive=20=ED=85=8C=EC=8A=A4=ED=8A=B8?=
=?UTF-8?q?=EC=99=80=20Controller=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?=
=?UTF-8?q?=EB=B6=84=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/MemberControllerTest.java | 107 ++++++++++++++++++
1 file changed, 107 insertions(+)
create mode 100644 src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
diff --git a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
new file mode 100644
index 0000000..33a371f
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
@@ -0,0 +1,107 @@
+package com.swger.tddstudy.member;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
+import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
+import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.repository.MemberRepository;
+import com.swger.tddstudy.member.service.MemberService;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+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.web.servlet.MockMvc;
+import org.springframework.validation.BindException;
+
+import javax.transaction.Transactional;
+
+
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@SpringBootTest
+@Transactional
+@AutoConfigureMockMvc
+public class MemberControllerTest {
+ @Autowired
+ MemberRepository memberRepository;
+ @Autowired
+ MemberService memberService;
+ @Autowired
+ private MockMvc mockMvc;
+ @Autowired
+ private ObjectMapper om;
+
+ @DisplayName("회원 가입 성공")
+ @Test
+ public void SignUpSuccess() throws Exception {
+ //given
+ MemberDTO signInMember= new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/signUp")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("signUpOK"))
+ .andDo(print());
+ //when
+ Optional getMember = memberRepository.findByUsername(signInMember.getUsername());
+ //then
+ /* 아이디, 비밀번호 같은지 확인*/
+ Assertions.assertThat(getMember.get().getUsername()).isEqualTo(signInMember.getUsername());
+ Assertions.assertThat(getMember.get().getPassword()).isEqualTo(signInMember.getPassword());
+ }
+
+ @DisplayName("회원가입 실패 - Validation 실패")
+ @Test
+ public void SignUpFail() throws Exception {
+ MemberDTO signInMember= new MemberDTO("testUsername",
+ "testPassword", null, "testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/signUp")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(result -> assertTrue(result.getResolvedException().getClass().isAssignableFrom(BindException.class)))
+ .andDo(print());
+
+ }
+ @DisplayName("로그인 성공")
+ @Test
+ public void SignInSuccess() throws Exception {
+ memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/logIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("LogInOK"))
+ .andDo(print());
+ }
+ @DisplayName("로그인 실패 - Vaildation 실패")
+ @Test
+ public void SignInFail() throws Exception {
+ memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMember= new MemberSignInDTO(null,"testPassword");
+ String content = om.writeValueAsString(signInMember);
+ mockMvc.perform(post("/logIn")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(result -> assertTrue(result.getResolvedException().getClass().isAssignableFrom(BindException.class)))
+ .andDo(print());
+ }
+
+}
From 99b4655a3f0d2887a5ce06761d0133d6e05a7197 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:03:45 +0900
Subject: [PATCH 14/33] =?UTF-8?q?Default=20Constructor=20=EC=B6=94?=
=?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../swger/tddstudy/member/domain/{ => DTO}/MemberDTO.java | 3 ++-
.../tddstudy/member/domain/{ => DTO}/MemberSignInDTO.java | 8 ++++++--
2 files changed, 8 insertions(+), 3 deletions(-)
rename src/main/java/com/swger/tddstudy/member/domain/{ => DTO}/MemberDTO.java (87%)
rename src/main/java/com/swger/tddstudy/member/domain/{ => DTO}/MemberSignInDTO.java (63%)
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberDTO.java
similarity index 87%
rename from src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
rename to src/main/java/com/swger/tddstudy/member/domain/DTO/MemberDTO.java
index 32e330c..85370e0 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/MemberDTO.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberDTO.java
@@ -1,4 +1,4 @@
-package com.swger.tddstudy.member.domain;
+package com.swger.tddstudy.member.domain.DTO;
import lombok.Getter;
@@ -21,4 +21,5 @@ public MemberDTO(String username, String password, String nickname, String rePas
this.nickname = nickname;
this.rePassword = rePassword;
}
+ public MemberDTO(){}
}
diff --git a/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberSignInDTO.java
similarity index 63%
rename from src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java
rename to src/main/java/com/swger/tddstudy/member/domain/DTO/MemberSignInDTO.java
index b453b03..2887370 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/MemberSignInDTO.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/DTO/MemberSignInDTO.java
@@ -1,16 +1,20 @@
-package com.swger.tddstudy.member.domain;
+package com.swger.tddstudy.member.domain.DTO;
import lombok.Getter;
+import javax.validation.constraints.NotBlank;
+
@Getter
public class MemberSignInDTO {
+ @NotBlank
private String username;
+ @NotBlank
private String password;
public MemberSignInDTO(String username, String password) {
this.username = username;
this.password = password;
-
}
+ public MemberSignInDTO(){}
}
From 9a56bad505952457287cb42178ae5daa552f0ff9 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:04:19 +0900
Subject: [PATCH 15/33] =?UTF-8?q?Controller=20=EB=A1=9C=EC=A7=81=20?=
=?UTF-8?q?=EB=B3=80=EA=B2=BD=20(Service=EC=97=90=EC=84=9C=20=EB=A1=9C?=
=?UTF-8?q?=EC=A7=81=20=EC=8B=A4=ED=96=89)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/controller/MemberController.java | 36 +++++++------------
1 file changed, 13 insertions(+), 23 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
index 206d710..574e698 100644
--- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
+++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
@@ -1,15 +1,16 @@
package com.swger.tddstudy.member.controller;
import com.swger.tddstudy.member.domain.Member;
-import com.swger.tddstudy.member.domain.MemberDTO;
-import com.swger.tddstudy.member.domain.MemberSignInDTO;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
+import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
import lombok.RequiredArgsConstructor;
-import lombok.experimental.PackagePrivate;
+import org.springframework.validation.BindException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import javax.validation.Valid;
import java.util.List;
@RestController
@@ -17,28 +18,17 @@
public class MemberController {
private final MemberService memberService;
private final MemberRepository memberRepository;
-// signIn이 아니라 SignUp이 맞는 표현.. 영어 이슈
- @PostMapping("/signIn")
- public String signIn(@Valid @RequestBody MemberDTO memberDTO) {
- /* 비밀번호 재확인 */
- if (!memberDTO.getPassword().equals(memberDTO.getRePassword())) {
- return "Password Mismatch";
- }
- Member newMember = new Member(memberDTO.getUsername(),
- memberDTO.getPassword(), memberDTO.getNickname());
- memberService.join(newMember);
- return "signInOK";
+ @PostMapping("/signUp")
+ public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) throws Exception{
+ if (bindingResult.hasErrors()) throw new BindException(bindingResult);
+ memberService.SignUp(memberDTO);
+ return "signUpOK";
}
@PostMapping("/logIn")
- public String logIn(@RequestBody MemberSignInDTO memberSignInDTO) {
- List byUsername = memberRepository.findByUsername(memberSignInDTO.getUsername());
- if (byUsername.isEmpty()) {
- return "Username MisMatch";
- }
- if (!byUsername.get(0).getPassword().equals(memberSignInDTO.getPassword())){
- return "Password MisMatch";
- }
+ public String logIn(@Validated @RequestBody MemberSignInDTO memberSignInDTO,BindingResult bindingResult) throws Exception{
+ if (bindingResult.hasErrors()) throw new BindException(bindingResult);
+ memberService.SignIn(memberSignInDTO);
return "LogInOK";
}
From 443c1d5cbcd3bb9faf221b3ab9764cdfc55efcee Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:04:42 +0900
Subject: [PATCH 16/33] =?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?=
=?UTF-8?q?=EC=9E=AC=ED=99=95=EC=9D=B8,=20=EC=95=84=EC=9D=B4=EB=94=94,?=
=?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20=ED=99=95=EC=9D=B8=20?=
=?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/service/MemberService.java | 20 +++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
index b1f7267..fd27d27 100644
--- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java
+++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
@@ -1,7 +1,9 @@
package com.swger.tddstudy.member.service;
import com.swger.tddstudy.member.domain.Member;
-import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
+import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
+import com.swger.tddstudy.member.domain.MemberType;
import com.swger.tddstudy.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -13,9 +15,23 @@
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
-
public Member join(Member member){
memberRepository.save(member);
return member;
}
+ public Member SignUp(MemberDTO member){
+ if(!member.getPassword().equals(member.getRePassword())){
+ throw new IllegalArgumentException("RePassword Mismatch");
+ }
+ Member signUpMember = new Member(member.getUsername(), member.getPassword(), member.getNickname());
+ join(signUpMember);
+ return signUpMember;
+ }
+ public Member SignIn(MemberSignInDTO member){
+ Member signInMember = memberRepository.findByUsername(member.getUsername()).orElseThrow(() -> new IllegalArgumentException("Username Mismatch"));
+ if (!signInMember.getPassword().equals(member.getPassword())) {
+ throw new IllegalArgumentException("Password Mismatch");
+ }
+ return signInMember;
+ }
}
From da5f9e8426d9a815224d4276240c46d637971d39 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:05:02 +0900
Subject: [PATCH 17/33] =?UTF-8?q?NPE=20=EC=A0=9C=EA=B1=B0=EB=A5=BC=20?=
=?UTF-8?q?=EC=9C=84=ED=95=B4=20Optional=20=EC=82=AC=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/swger/tddstudy/member/repository/MemberRepository.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java
index 2fb64af..9d5d52e 100644
--- a/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java
+++ b/src/main/java/com/swger/tddstudy/member/repository/MemberRepository.java
@@ -4,9 +4,10 @@
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
+import java.util.Optional;
public interface MemberRepository extends JpaRepository {
- List findByUsername(String username);
+ Optional findByUsername(String username);
@Override
S save(S entity);
From 5e28932344a3127f3877e6a1533e41d5f69ea4e8 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:03:53 +0900
Subject: [PATCH 18/33] =?UTF-8?q?Service=20Test=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../swger/tddstudy/member/domain/Member.java | 41 ++++----
.../member/service/MemberService.java | 2 +-
.../tddstudy/member/MemberServiceTest.java | 99 +++++++++++++++++++
3 files changed, 117 insertions(+), 25 deletions(-)
create mode 100644 src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java
index d17e71a..e472b10 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/Member.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java
@@ -1,15 +1,12 @@
package com.swger.tddstudy.member.domain;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
import com.swger.tddstudy.util.BaseEntity;
-import com.swger.tddstudy.member.domain.MemberLevel;
+
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
-import lombok.AccessLevel;
import lombok.Getter;
-import lombok.NoArgsConstructor;
-
-import java.util.Objects;
@Getter
@Entity
@@ -28,35 +25,31 @@ public class Member extends BaseEntity {
private String nickname;
@Enumerated(EnumType.STRING)
- private MemberLevel MemberLevel;
+ private MemberLevel memberLevel;
@Enumerated(EnumType.STRING)
- private MemberType type;
+ private MemberType memberType;
public Member(String username, String password, String nickname) {
this.username = username;
this.password = password;
this.nickname = nickname;
- this.MemberLevel = MemberLevel.BRONZE;
+ this.memberLevel = MemberLevel.BRONZE;
+ this.memberType = MemberType.Member;
}
public Member(){}
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof Member)) return false;
- Member member = (Member) o;
- return Objects.equals(getId(), member.getId())
- && Objects.equals(getUsername(), member.getUsername())
- && Objects.equals(getPassword(), member.getPassword())
- && Objects.equals(getNickname(), member.getNickname())
- && getMemberLevel() == member.getMemberLevel() && getType() == member.getType();
+ public Member(MemberDTO memberDTO){
+ this.username = memberDTO.getUsername();
+ this.password = memberDTO.getPassword();
+ this.nickname = memberDTO.getNickname();
+ this.memberLevel = MemberLevel.BRONZE;
+ this.memberType = MemberType.Member;
}
-
- @Override
- public int hashCode() {
- return Objects.hash(getId(), getUsername(), getPassword(),
- getNickname(), getMemberLevel(), getType());
+ public Member AdminMember(MemberDTO memberDTO){
+ Member member = new Member(memberDTO);
+ member.memberType = MemberType.ADMIN;
+ return member;
}
+
}
diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
index fd27d27..dc9ffe0 100644
--- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java
+++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
@@ -23,7 +23,7 @@ public Member SignUp(MemberDTO member){
if(!member.getPassword().equals(member.getRePassword())){
throw new IllegalArgumentException("RePassword Mismatch");
}
- Member signUpMember = new Member(member.getUsername(), member.getPassword(), member.getNickname());
+ Member signUpMember = new Member(member);
join(signUpMember);
return signUpMember;
}
diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
new file mode 100644
index 0000000..df08c79
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
@@ -0,0 +1,99 @@
+package com.swger.tddstudy.member;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
+import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
+import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.repository.MemberRepository;
+import com.swger.tddstudy.member.service.MemberService;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.transaction.Transactional;
+
+@SpringBootTest
+@Transactional
+public class MemberServiceTest {
+ @Autowired
+ MemberService memberService;
+ @Autowired
+ MemberRepository memberRepository;
+
+ @DisplayName("회원가입 성공")
+ @Test
+ public void SignUpSuccessInService(){
+ //given
+ MemberDTO memberDTO = new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword");
+ //when
+ Member member = memberService.SignUp(memberDTO);
+ Member memberInRepos = memberRepository.findById(member.getId()).get();
+ //then
+ Assertions.assertThat(member).extracting(
+ "id", "username", "nickname", "memberLevel", "memberType")
+ .containsExactly(memberInRepos.getId(),
+ memberInRepos.getUsername(),
+ memberInRepos.getNickname(),
+ memberInRepos.getMemberLevel(),
+ memberInRepos.getMemberType());
+ }
+ @DisplayName("회원가입 실패-비밀번호 재확인")
+ @Test
+ public void SignUpFailRePassword(){
+ //given
+ MemberDTO memberDTO = new MemberDTO("testUsername",
+ "testPassword", "testNickname", "test");
+ //when
+ //then
+ Assertions.assertThatThrownBy(() -> memberService.SignUp(memberDTO))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("RePassword Mismatch");
+ }
+ @DisplayName("로그인 성공")
+ @Test
+ public void SignInSuccessInService(){
+ //given
+ Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMemberDTO= new MemberSignInDTO("testUsername","testPassword");
+ //when
+ Member signInMember = memberService.SignIn(signInMemberDTO);
+ //then
+ Assertions.assertThat(member).extracting(
+ "id", "username", "nickname", "memberLevel", "memberType")
+ .containsExactly(signInMember.getId(),
+ signInMember.getUsername(),
+ signInMember.getNickname(),
+ signInMember.getMemberLevel(),
+ signInMember.getMemberType());
+ }
+ @DisplayName("로그인 실패 - 아이디 틀림")
+ @Test
+ public void SignInFailUsername(){
+ //given
+ Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMemberDTO= new MemberSignInDTO("test","testPassword");
+ //when
+ //then
+ Assertions.assertThatThrownBy(() -> memberService.SignIn(signInMemberDTO))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("Username Mismatch");
+ }
+ @DisplayName("로그인 실패 - 비밀번호 틀림")
+ @Test
+ public void SignInFailPassword(){
+ //given
+ Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName"));
+ MemberSignInDTO signInMemberDTO= new MemberSignInDTO("testUsername","test");
+ //when
+ //then
+ Assertions.assertThatThrownBy(() -> memberService.SignIn(signInMemberDTO))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("Password Mismatch");
+ }
+
+
+
+}
From 9820479e1c2237a31e38d13f944c1b62aab74373 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:27:37 +0900
Subject: [PATCH 19/33] =?UTF-8?q?=EB=93=B1=EA=B8=89=20=EC=97=85=20Test=20?=
=?UTF-8?q?=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../swger/tddstudy/member/domain/Member.java | 8 +++
.../member/service/MemberService.java | 2 +
.../tddstudy/member/MemberServiceTest.java | 3 +-
.../tddstudy/member/domain/MemberTest.java | 50 ++++---------------
4 files changed, 21 insertions(+), 42 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java
index e472b10..98159e0 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/Member.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java
@@ -51,5 +51,13 @@ public Member AdminMember(MemberDTO memberDTO){
member.memberType = MemberType.ADMIN;
return member;
}
+ public void LevelUp() {
+ if (this.getMemberLevel().equals(MemberLevel.SILVER)) {
+ this.memberLevel = MemberLevel.GOLD;
+ }
+ if (this.getMemberLevel().equals(MemberLevel.BRONZE)) {
+ this.memberLevel = MemberLevel.SILVER;
+ }
+ }
}
diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
index dc9ffe0..faccbf3 100644
--- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java
+++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
@@ -3,6 +3,7 @@
import com.swger.tddstudy.member.domain.Member;
import com.swger.tddstudy.member.domain.DTO.MemberDTO;
import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
+import com.swger.tddstudy.member.domain.MemberLevel;
import com.swger.tddstudy.member.domain.MemberType;
import com.swger.tddstudy.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
@@ -34,4 +35,5 @@ public Member SignIn(MemberSignInDTO member){
}
return signInMember;
}
+
}
diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
index df08c79..fe4fe61 100644
--- a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
+++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
@@ -4,6 +4,7 @@
import com.swger.tddstudy.member.domain.DTO.MemberDTO;
import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.domain.MemberLevel;
import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
import org.assertj.core.api.Assertions;
@@ -94,6 +95,4 @@ public void SignInFailPassword(){
.hasMessage("Password Mismatch");
}
-
-
}
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
index 7752a17..9868edc 100644
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
@@ -1,61 +1,31 @@
package com.swger.tddstudy.member.domain;
-
import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.transaction.Transactional;
-import java.util.List;
@SpringBootTest
@Transactional
-class MemberTest {
- @Autowired
- MemberRepository memberRepository;
+public class MemberTest {
@Autowired
MemberService memberService;
- /**
- * 회원가입
- * */
- /* 회원 가입 성공 */
- /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname*/
- @Test
- public void SignUpSuccess() {
- //given
- MemberDTO memberDTO = new MemberDTO();
- memberDTO.setUsername("testUsername");
- memberDTO.setPassword("testPassword");
- memberDTO.setNickname("testNickname");
- //when
- Member member= new Member(memberDTO.getUsername(), memberDTO.getPassword(), memberDTO.getNickname());
- memberService.join(member);
- List getMember = memberRepository.findByUsername("testUsername");
- //then
- Assertions.assertThat(getMember.get(0)).isEqualTo(member);
- }
+ @Autowired
+ MemberRepository memberRepository;
- /* 회원 가입 실패 - 아이디 */
- /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname*/
+ @DisplayName("등급 업")
@Test
- public void SignUpUsernameBlank() {
+ public void LevelUp(){
//given
- MemberDTO MemberDTO = new MemberDTO();
- MemberDTO.setPassword("testPassword");
- MemberDTO.setNickname("testNickname");
+ Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName"));
//when
- Member Member = new Member(MemberDTO.getUsername(), MemberDTO.getPassword(), MemberDTO.getNickname());
- memberService.join(Member);
- List getMember = memberRepository.findByUsername("");
+ member.LevelUp();
//then
- Assertions.assertThat(getMember.get(0)).isEqualTo(Member);
+ Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER);
}
- /* 회원 가입 실패 - 비밀번호*/
-
- /* 회원 가입 실패 - 비밀번호 재확인*/
-
- /* 회원 가입 실패 - 닉네임 */
-}
\ No newline at end of file
+}
From 1a7c45e269eda954dde940c2f6b21865b3c05d65 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:36:15 +0900
Subject: [PATCH 20/33] =?UTF-8?q?Admin=20=EA=B3=84=EC=A0=95=20=EB=A7=8C?=
=?UTF-8?q?=EB=93=A4=EA=B8=B0=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/swger/tddstudy/member/domain/Member.java | 6 ++----
.../swger/tddstudy/member/service/MemberService.java | 9 +++++++++
.../com/swger/tddstudy/member/domain/MemberTest.java | 12 ++++++++++++
3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/domain/Member.java b/src/main/java/com/swger/tddstudy/member/domain/Member.java
index 98159e0..3555636 100644
--- a/src/main/java/com/swger/tddstudy/member/domain/Member.java
+++ b/src/main/java/com/swger/tddstudy/member/domain/Member.java
@@ -46,10 +46,8 @@ public Member(MemberDTO memberDTO){
this.memberLevel = MemberLevel.BRONZE;
this.memberType = MemberType.Member;
}
- public Member AdminMember(MemberDTO memberDTO){
- Member member = new Member(memberDTO);
- member.memberType = MemberType.ADMIN;
- return member;
+ public void AdminMember(){
+ this.memberType = MemberType.ADMIN;
}
public void LevelUp() {
if (this.getMemberLevel().equals(MemberLevel.SILVER)) {
diff --git a/src/main/java/com/swger/tddstudy/member/service/MemberService.java b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
index faccbf3..8864ed5 100644
--- a/src/main/java/com/swger/tddstudy/member/service/MemberService.java
+++ b/src/main/java/com/swger/tddstudy/member/service/MemberService.java
@@ -28,6 +28,15 @@ public Member SignUp(MemberDTO member){
join(signUpMember);
return signUpMember;
}
+ public Member SignUpAdmin(MemberDTO member){
+ if(!member.getPassword().equals(member.getRePassword())){
+ throw new IllegalArgumentException("RePassword Mismatch");
+ }
+ Member signUpMember = new Member(member);
+ signUpMember.AdminMember();
+ join(signUpMember);
+ return signUpMember;
+ }
public Member SignIn(MemberSignInDTO member){
Member signInMember = memberRepository.findByUsername(member.getUsername()).orElseThrow(() -> new IllegalArgumentException("Username Mismatch"));
if (!signInMember.getPassword().equals(member.getPassword())) {
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
index 9868edc..5ce1cbf 100644
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
@@ -1,5 +1,6 @@
package com.swger.tddstudy.member.domain;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
import org.assertj.core.api.Assertions;
@@ -28,4 +29,15 @@ public void LevelUp(){
//then
Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER);
}
+ @DisplayName("Admin 타입으로 회원가입")
+ @Test
+ public void SignUpAdmin(){
+ //given
+ MemberDTO signUpMember= new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword");
+ //when
+ Member adminMember = memberService.SignUpAdmin(signUpMember);
+ //then
+ Assertions.assertThat(adminMember.getMemberType()).isEqualTo(MemberType.ADMIN);
+ }
}
From 5cd9521dfbf3c95d0fed0ca2e8ccc3eac5ef9d71 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:37:05 +0900
Subject: [PATCH 21/33] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20Test=20=EC=82=AD?=
=?UTF-8?q?=EC=A0=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/domain/MemberSignInTest.java | 87 -----------------
.../member/domain/MemberSignUpTest.java | 95 -------------------
2 files changed, 182 deletions(-)
delete mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java
delete mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java
deleted file mode 100644
index 9c8e38f..0000000
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberSignInTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.swger.tddstudy.member.domain;
-
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.swger.tddstudy.member.repository.MemberRepository;
-import com.swger.tddstudy.member.service.MemberService;
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
-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.web.servlet.MockMvc;
-
-import javax.transaction.Transactional;
-import java.util.List;
-
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-@SpringBootTest
-@Transactional
-@AutoConfigureMockMvc
-class MemberSignInTest {
- @Autowired
- MemberRepository memberRepository;
- @Autowired
- MemberService memberService;
- @Autowired
- private MockMvc mockMvc;
- @Autowired
- private ObjectMapper om;
- /**
- * 로그인
- * */
- /* 로그인 성공 */
- /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword*/
- @Test
- public void SignInSuccess() throws Exception {
- //given
- memberService.join(new Member("testUsername", "testPassword", "testNickName"));
- MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","testPassword");
- String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/logIn")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("LogInOK"))
- .andDo(print());
- }
- /* 로그인 실패 - 아이디 틀림 */
- /* 사용자 입력: 아이디:test , 비밀번호: testPassword*/
- @Test
- public void SignInFailUsername() throws Exception {
- //given
- memberService.join(new Member("testUsername", "testPassword", "testNickName"));
- MemberSignInDTO signInMember= new MemberSignInDTO("test","testPassword");
- String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/logIn")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("Username MisMatch"))
- .andDo(print());
- }
- /* 로그인 실패 - 비밀번호 틀림 */
- /* 사용자 입력: 아이디:testUsername , 비밀번호: test*/
- @Test
- public void SignInFailPassword() throws Exception {
- //given
- memberService.join(new Member("testUsername", "testPassword", "testNickName"));
- MemberSignInDTO signInMember= new MemberSignInDTO("testUsername","test");
- String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/logIn")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("Password MisMatch"))
- .andDo(print());
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
deleted file mode 100644
index 5dfc476..0000000
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberSignUpTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.swger.tddstudy.member.domain;
-
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.swger.tddstudy.member.repository.MemberRepository;
-import com.swger.tddstudy.member.service.MemberService;
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
-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.web.servlet.MockMvc;
-
-import javax.transaction.Transactional;
-import java.util.List;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
-
-@SpringBootTest
-@Transactional
-@AutoConfigureMockMvc
-class MemberSignUpTest {
- @Autowired
- MemberRepository memberRepository;
- @Autowired
- MemberService memberService;
- @Autowired
- private MockMvc mockMvc;
- @Autowired
- private ObjectMapper om;
- /**
- * 회원가입
- * */
- /* 회원 가입 성공 */
- /* 사용자 입력: 아이디:testUsername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/
- @Test
- public void SignUpSuccess() throws Exception {
- //given
- MemberDTO signInMember= new MemberDTO("testUsername",
- "testPassword", "testNickname", "testPassword");
- String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/signIn")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("signInOK"))
- .andDo(print());
- //when
- List getMember = memberRepository.findByUsername("testUsername");
- //then
- /* 아이디, 비밀번호 같은지 확인*/
- Assertions.assertThat(getMember.get(0).getUsername()).isEqualTo(signInMember.getUsername());
- Assertions.assertThat(getMember.get(0).getPassword()).isEqualTo(signInMember.getPassword());
-// equals로 진행하려고 했지만 안됨
-// Assertions.assertThat(getMember.get(0).equals(signInMember)).isTrue();
- }
-
- /* 회원 가입 실패 - 비밀번호 재확인*/
- /* 사용자 입력: 아이디:testMembername , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: test*/
- @Test
- public void SignUpRePasswordMismatch() throws Exception {
- //given
- MemberDTO signInMember= new MemberDTO("testUsername",
- "testPassword", "testNickname", "test");
- String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/signIn")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("Password Mismatch"))
- .andDo(print());
-
- }
-// /* 회원 가입 실패 - 아이디 */
- /* 사용자 입력: 아이디: , 비밀번호: testPassword , 닉네임: testNickname, 비밀번호재확인: testPassword*/
- @Test
- public void SignUpUsernameBlank() throws Exception {
- //given
- MemberDTO signInMember= new MemberDTO("testUsername",
- "testPassword", null, "testPassword");
- String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/signIn")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isBadRequest())
- .andDo(print());
- // validation이 진행되지 않는 이유...
-// List members = memberRepository.findByUsername("testUsername");
- }
-}
\ No newline at end of file
From b4f779c53f87533de5132974d301145ae65ca064 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:49:39 +0900
Subject: [PATCH 22/33] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80?=
=?UTF-8?q?=EC=95=8A=EC=9D=80=20Autowired=20=EC=82=AD=EC=A0=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/swger/tddstudy/member/controller/MemberController.java | 1 -
src/test/java/com/swger/tddstudy/member/MemberServiceTest.java | 1 -
2 files changed, 2 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
index 574e698..4d432ae 100644
--- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
+++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
@@ -17,7 +17,6 @@
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
- private final MemberRepository memberRepository;
@PostMapping("/signUp")
public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) throws Exception{
if (bindingResult.hasErrors()) throw new BindException(bindingResult);
diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
index fe4fe61..3e2cd9c 100644
--- a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
+++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
@@ -94,5 +94,4 @@ public void SignInFailPassword(){
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Password Mismatch");
}
-
}
From 7d82f93f6bef1924b4ca7abd0049f80472184917 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:50:31 +0900
Subject: [PATCH 23/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?=
=?UTF-8?q?=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/product/productServiceTest.java | 69 +++++++++++++++++++
1 file changed, 69 insertions(+)
create mode 100644 src/test/java/com/swger/tddstudy/product/productServiceTest.java
diff --git a/src/test/java/com/swger/tddstudy/product/productServiceTest.java b/src/test/java/com/swger/tddstudy/product/productServiceTest.java
new file mode 100644
index 0000000..3159ca5
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/product/productServiceTest.java
@@ -0,0 +1,69 @@
+package com.swger.tddstudy.product;
+
+import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
+import com.swger.tddstudy.product.domain.Product;
+import com.swger.tddstudy.product.domain.SellingStatus;
+import com.swger.tddstudy.product.repository.ProductRepository;
+import com.swger.tddstudy.product.service.ProductService;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.transaction.Transactional;
+import java.util.Optional;
+
+
+@SpringBootTest
+@Transactional
+public class productServiceTest {
+
+ @Autowired
+ ProductService productService;
+ @Autowired
+ ProductRepository productRepository;
+
+ @DisplayName("상품 등록이 가능합니다")
+ @Test
+ public void productRegisterSuccess(){
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
+ //when
+ Product registeredProduct = productService.register(product);
+ Optional productOptional = productRepository.findById(registeredProduct.getId());
+ //then
+ Assertions.assertThat(registeredProduct.getId())
+ .isEqualTo(productOptional.get().getId());
+ }
+
+
+ @DisplayName("상품 주문이 가능합니다")
+ @Test
+ public void sellingSuccess(){
+ //given
+ Product product = new Product("testName", 1000, 10);
+ //when, then
+ Assertions.assertThat(productService.sellingOrNo(product)).isTrue();
+ }
+ @DisplayName("상품 주문이 불가능합니다 - 재고 부족1")
+ @Test
+ public void sellingFailAmount1(){
+ //given
+ Product product = new Product("testName", 1000, 0);
+ //when, then
+ Assertions.assertThat(productService.sellingOrNo(product)).isFalse();
+ }
+ @DisplayName("상품 주문이 불가능합니다 - 재고 부족2")
+ @Test
+ public void sellingFailAmount2(){
+ //given
+ Product product = new Product("testName", 1000, 1);
+ //when
+ product.sellProduct();
+ //then
+ Assertions.assertThat(productService.sellingOrNo(product)).isFalse();
+ }
+
+
+}
From 0f684c5865d390f252bdd0d87a881c24ac6c3a2a Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:50:50 +0900
Subject: [PATCH 24/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=B6=94?=
=?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/product/repository/ProductRepository.java | 8 ++++++++
1 file changed, 8 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java
diff --git a/src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java b/src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java
new file mode 100644
index 0000000..d1fd632
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/product/repository/ProductRepository.java
@@ -0,0 +1,8 @@
+package com.swger.tddstudy.product.repository;
+
+import com.swger.tddstudy.product.domain.Product;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ProductRepository extends JpaRepository {
+
+}
From 0be9d21c4410fa98ba3898e75b1b099fa2589c24 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:51:07 +0900
Subject: [PATCH 25/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EB=93=B1=EB=A1=9D=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=83=81?=
=?UTF-8?q?=ED=92=88=20DTO=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../domain/DTO/ProductRegisterDTO.java | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java
diff --git a/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java
new file mode 100644
index 0000000..49f2e10
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java
@@ -0,0 +1,19 @@
+package com.swger.tddstudy.product.domain.DTO;
+
+import lombok.Getter;
+
+@Getter
+public class ProductRegisterDTO {
+ private String name;
+
+ private int price;
+
+ private int amount;
+
+ public ProductRegisterDTO(String name, int price, int amount) {
+ this.name = name;
+ this.price = price;
+ this.amount = amount;
+ }
+
+}
From 24b6ca68e47d623b5eea1d494a0fd19757a325f3 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:51:35 +0900
Subject: [PATCH 26/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=A9=94=EC=86=8C=EB=93=9C,=20=EC=83=81?=
=?UTF-8?q?=ED=92=88=20=EC=A3=BC=EB=AC=B8=20=EA=B0=80=EB=8A=A5=20=EC=97=AC?=
=?UTF-8?q?=EB=B6=80=20=ED=8C=90=EB=8B=A8=20=EB=A9=94=EC=86=8C=EB=93=9C=20?=
=?UTF-8?q?=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../product/service/ProductService.java | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 src/main/java/com/swger/tddstudy/product/service/ProductService.java
diff --git a/src/main/java/com/swger/tddstudy/product/service/ProductService.java b/src/main/java/com/swger/tddstudy/product/service/ProductService.java
new file mode 100644
index 0000000..09e3d1e
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/product/service/ProductService.java
@@ -0,0 +1,40 @@
+package com.swger.tddstudy.product.service;
+
+import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
+import com.swger.tddstudy.product.domain.Product;
+import com.swger.tddstudy.product.domain.SellingStatus;
+import com.swger.tddstudy.product.repository.ProductRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.swing.text.TableView;
+
+@Service
+@RequiredArgsConstructor
+public class ProductService {
+ private final ProductRepository productRepository;
+
+ public Product register(ProductRegisterDTO product) {
+ Product save = productRepository.save(new Product(product.getName()
+ , product.getPrice(), product.getAmount()));
+ return save;
+ }
+
+ public boolean sellingOrNo(Product product) {
+ /* 처음부터 재고 수량 = 0 */
+ if (product.getSellingStatus()== SellingStatus.STOP_SELLING) return false;
+ else {
+ /* 구매 가능 */
+ if (product.getAmount() > 0 && product.getSellingStatus()== SellingStatus.SELLING){
+ return true;
+ }
+ else {
+ /* 재고수량이 처음으로 0이 되었을 때 */
+ product.sellStop();
+ return false;
+ }
+ }
+ }
+
+
+}
From f98dc6d567cd2317cdc267c04a492aeec7470371 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:53:18 +0900
Subject: [PATCH 27/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EA=B5=AC=EB=A7=A4->=20=EC=9E=AC=EA=B3=A0=20-1=20=EB=A9=94?=
=?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80=20,=20SellingStatus?=
=?UTF-8?q?=EB=A5=BC=20=EB=B0=94=EA=BE=B8=EB=8A=94=20=EB=A9=94=EC=86=8C?=
=?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/product/domain/Product.java | 30 ++++++++++++++++---
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/product/domain/Product.java b/src/main/java/com/swger/tddstudy/product/domain/Product.java
index e71ebd9..55cd586 100644
--- a/src/main/java/com/swger/tddstudy/product/domain/Product.java
+++ b/src/main/java/com/swger/tddstudy/product/domain/Product.java
@@ -1,10 +1,10 @@
package com.swger.tddstudy.product.domain;
import com.swger.tddstudy.util.BaseEntity;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Id;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
@@ -15,14 +15,36 @@
public class Product extends BaseEntity {
@Id
+ @GeneratedValue
private Long id;
+ @NotBlank
private String name;
+ @NotBlank
private int price;
+ @NotBlank
private int amount;
@Enumerated(EnumType.STRING)
private SellingStatus sellingStatus;
+
+ public Product(String name, int price, int amount) {
+ this.name = name;
+ this.price = price;
+ this.amount = amount;
+ if(amount >0) this.sellingStatus = SellingStatus.SELLING;
+ else this.sellingStatus = SellingStatus.STOP_SELLING;
+ }
+ public void sellProduct(){
+ this.amount -= 1;
+ }
+ public void sellStop(){
+ this.sellingStatus = SellingStatus.STOP_SELLING;
+ }
+ public void sellStart(){
+ this.sellingStatus = SellingStatus.SELLING;
+ }
+
}
From 557eb5d5631b7831970da1ed0e8d47b4170a5a48 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 16:32:03 +0900
Subject: [PATCH 28/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=85=8C=EC=8A=A4?=
=?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../product/productControllerTest.java | 84 +++++++++++++++++++
1 file changed, 84 insertions(+)
create mode 100644 src/test/java/com/swger/tddstudy/product/productControllerTest.java
diff --git a/src/test/java/com/swger/tddstudy/product/productControllerTest.java b/src/test/java/com/swger/tddstudy/product/productControllerTest.java
new file mode 100644
index 0000000..6d42acb
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/product/productControllerTest.java
@@ -0,0 +1,84 @@
+package com.swger.tddstudy.product;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
+import com.swger.tddstudy.product.repository.ProductRepository;
+import com.swger.tddstudy.product.service.ProductService;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+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.web.servlet.MockMvc;
+import org.springframework.validation.BindException;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import javax.transaction.Transactional;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+@Transactional
+public class productControllerTest {
+ @Autowired
+ ProductRepository productRepository;
+ @Autowired
+ ProductService productService;
+ @Autowired
+ MockMvc mockMvc;
+ @Autowired
+ ObjectMapper om;
+
+ @DisplayName("상품 등록이 가능합니다")
+ @Test
+ public void registerSuccess() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Register OK"))
+ .andDo(print());
+ }
+
+ @DisplayName("상품 등록이 불가능합니다 - NotBlank")
+ @Test
+ public void registerFailNotBlank() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO(null, 1000, 10);
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(result -> assertTrue(result.getResolvedException()
+ .getClass().isAssignableFrom(BindException.class)))
+ .andDo(print());
+ }
+ @DisplayName("상품 등록이 불가능합니다 - Min")
+ @Test
+ public void registerFailMin() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testname", 10000, 0);
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(result -> assertTrue(result.getResolvedException()
+ .getClass().isAssignableFrom(BindException.class)))
+ .andDo(print());
+
+ }
+}
From 82cc88fe56242d9bd5db7af02d2b1a6cb6ae2de2 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 16:32:28 +0900
Subject: [PATCH 29/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20?=
=?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../product/controller/ProductController.java | 26 +++++++++++++++++++
.../tddstudy/member/MemberControllerTest.java | 3 ++-
2 files changed, 28 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/com/swger/tddstudy/product/controller/ProductController.java
diff --git a/src/main/java/com/swger/tddstudy/product/controller/ProductController.java b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java
new file mode 100644
index 0000000..81327ef
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java
@@ -0,0 +1,26 @@
+package com.swger.tddstudy.product.controller;
+
+import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
+import com.swger.tddstudy.product.service.ProductService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequiredArgsConstructor
+public class ProductController {
+ @Autowired
+ ProductService productService;
+
+ @PostMapping("/productRegister")
+ public String productRegister(@Validated @RequestBody ProductRegisterDTO DTO, BindingResult br) throws BindException {
+ if (br.hasErrors()) throw new BindException(br);
+ productService.register(DTO);
+ return "Register OK";
+ }
+}
diff --git a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
index 33a371f..3614dc0 100644
--- a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
+++ b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
@@ -72,7 +72,8 @@ public void SignUpFail() throws Exception {
.content(content)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
- .andExpect(result -> assertTrue(result.getResolvedException().getClass().isAssignableFrom(BindException.class)))
+ .andExpect(result -> assertTrue(result.getResolvedException()
+ .getClass().isAssignableFrom(BindException.class)))
.andDo(print());
}
From 3e779dc2cec06751997174401b6346a4031ece4e Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Wed, 2 Aug 2023 16:32:43 +0900
Subject: [PATCH 30/33] =?UTF-8?q?[Day=203-4]=20=EC=83=81=ED=92=88=20Valida?=
=?UTF-8?q?tion=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/product/domain/DTO/ProductRegisterDTO.java | 7 +++++++
.../java/com/swger/tddstudy/product/domain/Product.java | 8 ++++----
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java
index 49f2e10..9a53ce1 100644
--- a/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java
+++ b/src/main/java/com/swger/tddstudy/product/domain/DTO/ProductRegisterDTO.java
@@ -2,12 +2,18 @@
import lombok.Getter;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+
@Getter
public class ProductRegisterDTO {
+ @NotBlank
private String name;
+ @Min(1000)
private int price;
+ @Min(1)
private int amount;
public ProductRegisterDTO(String name, int price, int amount) {
@@ -15,5 +21,6 @@ public ProductRegisterDTO(String name, int price, int amount) {
this.price = price;
this.amount = amount;
}
+ public ProductRegisterDTO(){}
}
diff --git a/src/main/java/com/swger/tddstudy/product/domain/Product.java b/src/main/java/com/swger/tddstudy/product/domain/Product.java
index 55cd586..c751b20 100644
--- a/src/main/java/com/swger/tddstudy/product/domain/Product.java
+++ b/src/main/java/com/swger/tddstudy/product/domain/Product.java
@@ -3,6 +3,7 @@
import com.swger.tddstudy.util.BaseEntity;
import javax.persistence.*;
+import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import lombok.AccessLevel;
@@ -21,10 +22,10 @@ public class Product extends BaseEntity {
@NotBlank
private String name;
- @NotBlank
+ @Min(1000)
private int price;
- @NotBlank
+ @Min(1)
private int amount;
@Enumerated(EnumType.STRING)
@@ -34,8 +35,7 @@ public Product(String name, int price, int amount) {
this.name = name;
this.price = price;
this.amount = amount;
- if(amount >0) this.sellingStatus = SellingStatus.SELLING;
- else this.sellingStatus = SellingStatus.STOP_SELLING;
+ this.sellingStatus = SellingStatus.SELLING;
}
public void sellProduct(){
this.amount -= 1;
From 747627cd4f726c7ae931e98ba7d02de2468a7e05 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 7 Aug 2023 16:12:31 +0900
Subject: [PATCH 31/33] =?UTF-8?q?[Day=203-4]=20=ED=8C=80=EC=9B=90=EB=B6=84?=
=?UTF-8?q?=EB=93=A4=EC=9D=98=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?=
=?UTF-8?q?=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../member/controller/MemberController.java | 20 ++-
.../product/controller/ProductController.java | 23 ++-
.../controller/ProductControllerAdvice.java | 26 ++++
.../tddstudy/product/domain/Product.java | 25 +++-
.../product/service/ProductService.java | 20 +--
.../tddstudy/member/MemberServiceTest.java | 12 ++
.../tddstudy/member/domain/MemberTest.java | 12 +-
.../product/ProductControllerTest.java | 140 ++++++++++++++++++
...rviceTest.java => ProductServiceTest.java} | 23 +--
.../product/productControllerTest.java | 84 -----------
10 files changed, 251 insertions(+), 134 deletions(-)
create mode 100644 src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java
create mode 100644 src/test/java/com/swger/tddstudy/product/ProductControllerTest.java
rename src/test/java/com/swger/tddstudy/product/{productServiceTest.java => ProductServiceTest.java} (75%)
delete mode 100644 src/test/java/com/swger/tddstudy/product/productControllerTest.java
diff --git a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
index 4d432ae..ff02db2 100644
--- a/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
+++ b/src/main/java/com/swger/tddstudy/member/controller/MemberController.java
@@ -5,6 +5,7 @@
import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
+import javax.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
@@ -16,18 +17,27 @@
@RestController
@RequiredArgsConstructor
public class MemberController {
+
private final MemberService memberService;
+
@PostMapping("/signUp")
- public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult) throws Exception{
- if (bindingResult.hasErrors()) throw new BindException(bindingResult);
+ public String signUp(@Validated @RequestBody MemberDTO memberDTO, BindingResult bindingResult)
+ throws Exception {
+ if (bindingResult.hasErrors()) {
+ throw new BindException(bindingResult);
+ }
memberService.SignUp(memberDTO);
return "signUpOK";
}
@PostMapping("/logIn")
- public String logIn(@Validated @RequestBody MemberSignInDTO memberSignInDTO,BindingResult bindingResult) throws Exception{
- if (bindingResult.hasErrors()) throw new BindException(bindingResult);
- memberService.SignIn(memberSignInDTO);
+ public String logIn(@Validated @RequestBody MemberSignInDTO memberSignInDTO,
+ BindingResult bindingResult, HttpSession session) throws Exception {
+ if (bindingResult.hasErrors()) {
+ throw new BindException(bindingResult);
+ }
+ Member member = memberService.SignIn(memberSignInDTO);
+ session.setAttribute("id", member.getId());
return "LogInOK";
}
diff --git a/src/main/java/com/swger/tddstudy/product/controller/ProductController.java b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java
index 81327ef..acaa73f 100644
--- a/src/main/java/com/swger/tddstudy/product/controller/ProductController.java
+++ b/src/main/java/com/swger/tddstudy/product/controller/ProductController.java
@@ -1,8 +1,14 @@
package com.swger.tddstudy.product.controller;
+import com.swger.tddstudy.member.domain.MemberType;
+import com.swger.tddstudy.member.repository.MemberRepository;
+import com.swger.tddstudy.member.service.MemberService;
import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
import com.swger.tddstudy.product.service.ProductService;
+import javax.naming.AuthenticationException;
+import javax.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
+import org.hibernate.engine.spi.ManagedEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
@@ -14,13 +20,24 @@
@RestController
@RequiredArgsConstructor
public class ProductController {
- @Autowired
- ProductService productService;
+
+ private final ProductService productService;
+ private final MemberRepository memberRepository;
@PostMapping("/productRegister")
- public String productRegister(@Validated @RequestBody ProductRegisterDTO DTO, BindingResult br) throws BindException {
+ public String productRegister(@Validated @RequestBody ProductRegisterDTO DTO, BindingResult br,
+ HttpSession httpSession) throws BindException, AuthenticationException {
if (br.hasErrors()) throw new BindException(br);
productService.register(DTO);
+
+ if (httpSession.getAttribute("id") == null) {
+ throw new AuthenticationException("You must SignIn");
+ }
+
+ if(!memberRepository.findById((Long) httpSession.getAttribute("id"))
+ .get().getMemberType().equals(MemberType.ADMIN)){
+ throw new AuthenticationException("You are not Admin");
+ }
return "Register OK";
}
}
diff --git a/src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java b/src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java
new file mode 100644
index 0000000..4820d06
--- /dev/null
+++ b/src/main/java/com/swger/tddstudy/product/controller/ProductControllerAdvice.java
@@ -0,0 +1,26 @@
+package com.swger.tddstudy.product.controller;
+
+import javax.naming.AuthenticationException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+@ControllerAdvice
+public class ProductControllerAdvice {
+
+ @ExceptionHandler
+ public ResponseEntity> bindException(BindException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
+ }
+ @ExceptionHandler
+ public ResponseEntity> authenticationException(AuthenticationException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(e.getMessage());
+ }
+}
diff --git a/src/main/java/com/swger/tddstudy/product/domain/Product.java b/src/main/java/com/swger/tddstudy/product/domain/Product.java
index c751b20..3729658 100644
--- a/src/main/java/com/swger/tddstudy/product/domain/Product.java
+++ b/src/main/java/com/swger/tddstudy/product/domain/Product.java
@@ -37,8 +37,14 @@ public Product(String name, int price, int amount) {
this.amount = amount;
this.sellingStatus = SellingStatus.SELLING;
}
- public void sellProduct(){
- this.amount -= 1;
+ public boolean sellProduct(int cnt){
+ /* 사용자가 재고 이상으로 주문 */
+ if (cnt > this.amount) {
+ return false;
+ }
+ /* 사용자가 재고에 맞게 주문 */
+ this.amount -= cnt;
+ return true;
}
public void sellStop(){
this.sellingStatus = SellingStatus.STOP_SELLING;
@@ -47,4 +53,19 @@ public void sellStart(){
this.sellingStatus = SellingStatus.SELLING;
}
+ public boolean sellingOrNo() {
+ /* 처음부터 재고 수량 = 0 */
+ if (this.getSellingStatus() == SellingStatus.STOP_SELLING) {
+ return false;
+ }
+ /* 구매 가능 */
+ if (this.getAmount() > 0 && this.getSellingStatus() == SellingStatus.SELLING) {
+ return true;}
+ else {
+ /* 재고수량이 처음으로 0이 되었을 때 */
+ this.sellStop();
+ return false;
+ }
+ }
+
}
diff --git a/src/main/java/com/swger/tddstudy/product/service/ProductService.java b/src/main/java/com/swger/tddstudy/product/service/ProductService.java
index 09e3d1e..e4c0938 100644
--- a/src/main/java/com/swger/tddstudy/product/service/ProductService.java
+++ b/src/main/java/com/swger/tddstudy/product/service/ProductService.java
@@ -12,29 +12,13 @@
@Service
@RequiredArgsConstructor
public class ProductService {
+
private final ProductRepository productRepository;
public Product register(ProductRegisterDTO product) {
Product save = productRepository.save(new Product(product.getName()
- , product.getPrice(), product.getAmount()));
+ , product.getPrice(), product.getAmount()));
return save;
}
- public boolean sellingOrNo(Product product) {
- /* 처음부터 재고 수량 = 0 */
- if (product.getSellingStatus()== SellingStatus.STOP_SELLING) return false;
- else {
- /* 구매 가능 */
- if (product.getAmount() > 0 && product.getSellingStatus()== SellingStatus.SELLING){
- return true;
- }
- else {
- /* 재고수량이 처음으로 0이 되었을 때 */
- product.sellStop();
- return false;
- }
- }
- }
-
-
}
diff --git a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
index 3e2cd9c..7d410c5 100644
--- a/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
+++ b/src/test/java/com/swger/tddstudy/member/MemberServiceTest.java
@@ -5,6 +5,7 @@
import com.swger.tddstudy.member.domain.DTO.MemberSignInDTO;
import com.swger.tddstudy.member.domain.Member;
import com.swger.tddstudy.member.domain.MemberLevel;
+import com.swger.tddstudy.member.domain.MemberType;
import com.swger.tddstudy.member.repository.MemberRepository;
import com.swger.tddstudy.member.service.MemberService;
import org.assertj.core.api.Assertions;
@@ -41,6 +42,17 @@ public void SignUpSuccessInService(){
memberInRepos.getMemberLevel(),
memberInRepos.getMemberType());
}
+ @DisplayName("Admin 타입으로 회원가입")
+ @Test
+ public void SignUpAdmin(){
+ //given
+ MemberDTO signUpMember= new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword");
+ //when
+ Member adminMember = memberService.SignUpAdmin(signUpMember);
+ //then
+ Assertions.assertThat(adminMember.getMemberType()).isEqualTo(MemberType.ADMIN);
+ }
@DisplayName("회원가입 실패-비밀번호 재확인")
@Test
public void SignUpFailRePassword(){
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
index 5ce1cbf..be2742c 100644
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
+++ b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
@@ -29,15 +29,5 @@ public void LevelUp(){
//then
Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER);
}
- @DisplayName("Admin 타입으로 회원가입")
- @Test
- public void SignUpAdmin(){
- //given
- MemberDTO signUpMember= new MemberDTO("testUsername",
- "testPassword", "testNickname", "testPassword");
- //when
- Member adminMember = memberService.SignUpAdmin(signUpMember);
- //then
- Assertions.assertThat(adminMember.getMemberType()).isEqualTo(MemberType.ADMIN);
- }
+
}
diff --git a/src/test/java/com/swger/tddstudy/product/ProductControllerTest.java b/src/test/java/com/swger/tddstudy/product/ProductControllerTest.java
new file mode 100644
index 0000000..e6e7e98
--- /dev/null
+++ b/src/test/java/com/swger/tddstudy/product/ProductControllerTest.java
@@ -0,0 +1,140 @@
+package com.swger.tddstudy.product;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.swger.tddstudy.member.domain.DTO.MemberDTO;
+import com.swger.tddstudy.member.domain.Member;
+import com.swger.tddstudy.member.service.MemberService;
+import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
+import com.swger.tddstudy.product.repository.ProductRepository;
+import com.swger.tddstudy.product.service.ProductService;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+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.mock.web.MockHttpSession;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.validation.BindException;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import javax.transaction.Transactional;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+@Transactional
+public class ProductControllerTest {
+
+ @Autowired
+ ProductRepository productRepository;
+ @Autowired
+ ProductService productService;
+ @Autowired
+ MemberService memberService;
+ @Autowired
+ MockMvc mockMvc;
+ @Autowired
+ ObjectMapper om;
+
+ @DisplayName("상품 등록이 가능합니다")
+ @Test
+ public void registerSuccess() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
+ Member member = memberService.SignUpAdmin(new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword"));
+ MockHttpSession session = new MockHttpSession();
+ session.setAttribute("id", member.getId());
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .session(session)
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("Register OK"))
+ .andDo(print());
+
+ }
+ @DisplayName("상품 등록이 불가능합니다- 로그인을 하지 않음")
+ @Test
+ public void registerFailNotLogin() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
+ MockHttpSession session = new MockHttpSession();
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .session(session)
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isBadRequest())
+ .andExpect(content().string("You must SignIn"))
+ .andDo(print());
+
+ }
+ @DisplayName("상품 등록이 불가능합니다- Admin 계정이 아님")
+ @Test
+ public void registerFailNotAdmin() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
+ Member member = memberService.SignUp(new MemberDTO("testUsername",
+ "testPassword", "testNickname", "testPassword"));
+ MockHttpSession session = new MockHttpSession();
+ session.setAttribute("id", member.getId());
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .session(session)
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isBadRequest())
+ .andExpect(content().string("You are not Admin"))
+ .andDo(print());
+
+ }
+
+
+ @DisplayName("상품 등록이 불가능합니다 - NotBlank")
+ @Test
+ public void registerFailNotBlank() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO(null, 1000, 10);
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(result -> assertTrue(result.getResolvedException()
+ .getClass().isAssignableFrom(BindException.class)))
+ .andDo(print());
+ }
+
+ @DisplayName("상품 등록이 불가능합니다 - Min")
+ @Test
+ public void registerFailMin() throws Exception {
+ //given
+ ProductRegisterDTO product = new ProductRegisterDTO("testname", 10000, 0);
+ //when, then
+ String content = om.writeValueAsString(product);
+ mockMvc.perform(post("/productRegister")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(result -> assertTrue(result.getResolvedException()
+ .getClass().isAssignableFrom(BindException.class)))
+ .andDo(print());
+ }
+
+}
diff --git a/src/test/java/com/swger/tddstudy/product/productServiceTest.java b/src/test/java/com/swger/tddstudy/product/ProductServiceTest.java
similarity index 75%
rename from src/test/java/com/swger/tddstudy/product/productServiceTest.java
rename to src/test/java/com/swger/tddstudy/product/ProductServiceTest.java
index 3159ca5..a30b992 100644
--- a/src/test/java/com/swger/tddstudy/product/productServiceTest.java
+++ b/src/test/java/com/swger/tddstudy/product/ProductServiceTest.java
@@ -2,7 +2,6 @@
import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
import com.swger.tddstudy.product.domain.Product;
-import com.swger.tddstudy.product.domain.SellingStatus;
import com.swger.tddstudy.product.repository.ProductRepository;
import com.swger.tddstudy.product.service.ProductService;
import org.assertj.core.api.Assertions;
@@ -17,7 +16,7 @@
@SpringBootTest
@Transactional
-public class productServiceTest {
+public class ProductServiceTest {
@Autowired
ProductService productService;
@@ -26,7 +25,7 @@ public class productServiceTest {
@DisplayName("상품 등록이 가능합니다")
@Test
- public void productRegisterSuccess(){
+ public void productRegisterSuccess() {
//given
ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
//when
@@ -34,35 +33,37 @@ public void productRegisterSuccess(){
Optional productOptional = productRepository.findById(registeredProduct.getId());
//then
Assertions.assertThat(registeredProduct.getId())
- .isEqualTo(productOptional.get().getId());
+ .isEqualTo(productOptional.get().getId());
}
@DisplayName("상품 주문이 가능합니다")
@Test
- public void sellingSuccess(){
+ public void sellingSuccess() {
//given
Product product = new Product("testName", 1000, 10);
//when, then
- Assertions.assertThat(productService.sellingOrNo(product)).isTrue();
+ Assertions.assertThat(product.sellingOrNo()).isTrue();
}
+
@DisplayName("상품 주문이 불가능합니다 - 재고 부족1")
@Test
- public void sellingFailAmount1(){
+ public void sellingFailAmount1() {
//given
Product product = new Product("testName", 1000, 0);
//when, then
- Assertions.assertThat(productService.sellingOrNo(product)).isFalse();
+ Assertions.assertThat(product.sellingOrNo()).isFalse();
}
+
@DisplayName("상품 주문이 불가능합니다 - 재고 부족2")
@Test
- public void sellingFailAmount2(){
+ public void sellingFailAmount2() {
//given
Product product = new Product("testName", 1000, 1);
//when
- product.sellProduct();
+ product.sellProduct(1);
//then
- Assertions.assertThat(productService.sellingOrNo(product)).isFalse();
+ Assertions.assertThat(product.sellingOrNo()).isFalse();
}
diff --git a/src/test/java/com/swger/tddstudy/product/productControllerTest.java b/src/test/java/com/swger/tddstudy/product/productControllerTest.java
deleted file mode 100644
index 6d42acb..0000000
--- a/src/test/java/com/swger/tddstudy/product/productControllerTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.swger.tddstudy.product;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.swger.tddstudy.product.domain.DTO.ProductRegisterDTO;
-import com.swger.tddstudy.product.repository.ProductRepository;
-import com.swger.tddstudy.product.service.ProductService;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-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.web.servlet.MockMvc;
-import org.springframework.validation.BindException;
-
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
-import javax.transaction.Transactional;
-
-@SpringBootTest
-@AutoConfigureMockMvc
-@Transactional
-public class productControllerTest {
- @Autowired
- ProductRepository productRepository;
- @Autowired
- ProductService productService;
- @Autowired
- MockMvc mockMvc;
- @Autowired
- ObjectMapper om;
-
- @DisplayName("상품 등록이 가능합니다")
- @Test
- public void registerSuccess() throws Exception {
- //given
- ProductRegisterDTO product = new ProductRegisterDTO("testName", 1000, 10);
- //when, then
- String content = om.writeValueAsString(product);
- mockMvc.perform(post("/productRegister")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("Register OK"))
- .andDo(print());
- }
-
- @DisplayName("상품 등록이 불가능합니다 - NotBlank")
- @Test
- public void registerFailNotBlank() throws Exception {
- //given
- ProductRegisterDTO product = new ProductRegisterDTO(null, 1000, 10);
- //when, then
- String content = om.writeValueAsString(product);
- mockMvc.perform(post("/productRegister")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(result -> assertTrue(result.getResolvedException()
- .getClass().isAssignableFrom(BindException.class)))
- .andDo(print());
- }
- @DisplayName("상품 등록이 불가능합니다 - Min")
- @Test
- public void registerFailMin() throws Exception {
- //given
- ProductRegisterDTO product = new ProductRegisterDTO("testname", 10000, 0);
- //when, then
- String content = om.writeValueAsString(product);
- mockMvc.perform(post("/productRegister")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(result -> assertTrue(result.getResolvedException()
- .getClass().isAssignableFrom(BindException.class)))
- .andDo(print());
-
- }
-}
From 61ec120c7b90e41f46fcedb958a1d492e6d53280 Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 7 Aug 2023 16:18:19 +0900
Subject: [PATCH 32/33] =?UTF-8?q?[Day=203-4]=20=ED=8C=80=EC=9B=90=EB=B6=84?=
=?UTF-8?q?=EB=93=A4=EC=9D=98=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?=
=?UTF-8?q?=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/domain/MemberTest.java | 33 -------------------
1 file changed, 33 deletions(-)
delete mode 100644 src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
diff --git a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java b/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
deleted file mode 100644
index be2742c..0000000
--- a/src/test/java/com/swger/tddstudy/member/domain/MemberTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.swger.tddstudy.member.domain;
-
-import com.swger.tddstudy.member.domain.DTO.MemberDTO;
-import com.swger.tddstudy.member.repository.MemberRepository;
-import com.swger.tddstudy.member.service.MemberService;
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import javax.transaction.Transactional;
-
-@SpringBootTest
-@Transactional
-public class MemberTest {
- @Autowired
- MemberService memberService;
- @Autowired
- MemberRepository memberRepository;
-
- @DisplayName("등급 업")
- @Test
- public void LevelUp(){
- //given
- Member member = memberService.join(new Member("testUsername", "testPassword", "testNickName"));
- //when
- member.LevelUp();
- //then
- Assertions.assertThat(member.getMemberLevel()).isEqualTo(MemberLevel.SILVER);
- }
-
-}
From 1012a3de876eedceace2af734fd3bdf9c6cf53ac Mon Sep 17 00:00:00 2001
From: KwonJuHwan <118177454+KwonJuHwan@users.noreply.github.com>
Date: Mon, 7 Aug 2023 16:40:10 +0900
Subject: [PATCH 33/33] =?UTF-8?q?[Day=203-4]=20=ED=8C=80=EC=9B=90=EB=B6=84?=
=?UTF-8?q?=EB=93=A4=EC=9D=98=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98?=
=?UTF-8?q?=EC=98=81=203?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../tddstudy/member/MemberControllerTest.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
index 3614dc0..bf48280 100644
--- a/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
+++ b/src/test/java/com/swger/tddstudy/member/MemberControllerTest.java
@@ -47,14 +47,14 @@ public void SignUpSuccess() throws Exception {
MemberDTO signInMember= new MemberDTO("testUsername",
"testPassword", "testNickname", "testPassword");
String content = om.writeValueAsString(signInMember);
- mockMvc.perform(post("/signUp")
- .content(content)
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk())
- .andExpect(content().string("signUpOK"))
- .andDo(print());
//when
+ mockMvc.perform(post("/signUp")
+ .content(content)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().string("signUpOK"))
+ .andDo(print());
Optional getMember = memberRepository.findByUsername(signInMember.getUsername());
//then
/* 아이디, 비밀번호 같은지 확인*/