From c0dcfd8aa69e2c7e316fd19b2c35527541e59906 Mon Sep 17 00:00:00 2001 From: "hanyoung.park" Date: Mon, 2 Feb 2026 01:26:59 +0900 Subject: [PATCH 1/3] remove: deprecated codeguide --- .codeguide/loopers-1-week.md | 45 ------------------------------------ 1 file changed, 45 deletions(-) delete mode 100644 .codeguide/loopers-1-week.md diff --git a/.codeguide/loopers-1-week.md b/.codeguide/loopers-1-week.md deleted file mode 100644 index a8ace53e..00000000 --- a/.codeguide/loopers-1-week.md +++ /dev/null @@ -1,45 +0,0 @@ -## πŸ§ͺ Implementation Quest - -> μ§€μ •λœ **λ‹¨μœ„ ν…ŒμŠ€νŠΈ / 톡합 ν…ŒμŠ€νŠΈ / E2E ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€**λ₯Ό ν•„μˆ˜λ‘œ κ΅¬ν˜„ν•˜κ³ , λͺ¨λ“  ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όμ‹œν‚€λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€. - -### νšŒμ› κ°€μž… - -**🧱 λ‹¨μœ„ ν…ŒμŠ€νŠΈ** - -- [ ] ID κ°€ `영문 및 숫자 10자 이내` ν˜•μ‹μ— λ§žμ§€ μ•ŠμœΌλ©΄, User 객체 생성에 μ‹€νŒ¨ν•œλ‹€. -- [ ] 이메일이 `xx@yy.zz` ν˜•μ‹μ— λ§žμ§€ μ•ŠμœΌλ©΄, User 객체 생성에 μ‹€νŒ¨ν•œλ‹€. -- [ ] 생년월일이 `yyyy-MM-dd` ν˜•μ‹μ— λ§žμ§€ μ•ŠμœΌλ©΄, User 객체 생성에 μ‹€νŒ¨ν•œλ‹€. - -**πŸ”— 톡합 ν…ŒμŠ€νŠΈ** - -- [ ] νšŒμ› κ°€μž…μ‹œ User μ €μž₯이 μˆ˜ν–‰λœλ‹€. ( spy 검증 ) -- [ ] 이미 κ°€μž…λœ ID 둜 νšŒμ›κ°€μž… μ‹œλ„ μ‹œ, μ‹€νŒ¨ν•œλ‹€. - -**🌐 E2E ν…ŒμŠ€νŠΈ** - -- [ ] νšŒμ› κ°€μž…μ΄ 성곡할 경우, μƒμ„±λœ μœ μ € 정보λ₯Ό μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. -- [ ] νšŒμ› κ°€μž… μ‹œμ— 성별이 없을 경우, `400 Bad Request` 응닡을 λ°˜ν™˜ν•œλ‹€. - -### λ‚΄ 정보 쑰회 - -**πŸ”— 톡합 ν…ŒμŠ€νŠΈ** - -- [ ] ν•΄λ‹Ή ID 의 νšŒμ›μ΄ μ‘΄μž¬ν•  경우, νšŒμ› 정보가 λ°˜ν™˜λœλ‹€. -- [ ] ν•΄λ‹Ή ID 의 νšŒμ›μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우, null 이 λ°˜ν™˜λœλ‹€. - -**🌐 E2E ν…ŒμŠ€νŠΈ** - -- [ ] λ‚΄ 정보 μ‘°νšŒμ— 성곡할 경우, ν•΄λ‹Ήν•˜λŠ” μœ μ € 정보λ₯Ό μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. -- [ ] μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ID 둜 μ‘°νšŒν•  경우, `404 Not Found` 응닡을 λ°˜ν™˜ν•œλ‹€. - -### 포인트 쑰회 - -**πŸ”— 톡합 ν…ŒμŠ€νŠΈ** - -- [ ] ν•΄λ‹Ή ID 의 νšŒμ›μ΄ μ‘΄μž¬ν•  경우, 보유 ν¬μΈνŠΈκ°€ λ°˜ν™˜λœλ‹€. -- [ ] ν•΄λ‹Ή ID 의 νšŒμ›μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우, null 이 λ°˜ν™˜λœλ‹€. - -**🌐 E2E ν…ŒμŠ€νŠΈ** - -- [ ] 포인트 μ‘°νšŒμ— 성곡할 경우, 보유 포인트λ₯Ό μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. -- [ ] `X-USER-ID` 헀더가 없을 경우, `400 Bad Request` 응닡을 λ°˜ν™˜ν•œλ‹€. From ffd0eae2efda12ccb71da77dc25113dd973736c9 Mon Sep 17 00:00:00 2001 From: simoncho91 Date: Fri, 6 Feb 2026 17:32:35 +0900 Subject: [PATCH 2/3] =?UTF-8?q?test:=20Member=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=83=9D=EC=84=B1=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 - μœ νš¨ν•œ μ •λ³΄λ‘œ νšŒμ› 생성 성곡 ν…ŒμŠ€νŠΈ - 각 ν•„λ“œ null/blank 검증 ν…ŒμŠ€νŠΈ - loginId, password, name, birthDate, email ν•„μˆ˜κ°’ 검증 --- .../com/loopers/domain/member/MemberTest.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 apps/commerce-api/src/test/java/com/loopers/domain/member/MemberTest.java diff --git a/apps/commerce-api/src/test/java/com/loopers/domain/member/MemberTest.java b/apps/commerce-api/src/test/java/com/loopers/domain/member/MemberTest.java new file mode 100644 index 00000000..df36d660 --- /dev/null +++ b/apps/commerce-api/src/test/java/com/loopers/domain/member/MemberTest.java @@ -0,0 +1,92 @@ +package com.loopers.domain.member; + +import com.loopers.support.error.CoreException; +import com.loopers.support.error.ErrorType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; + +class MemberTest { + + @DisplayName("νšŒμ›μ„ 생성할 λ•Œ") + @Nested + class Create { + + @DisplayName("μœ νš¨ν•œ 정보가 μ£Όμ–΄μ§€λ©΄ μ„±κ³΅ν•œλ‹€") + @Test + void success() { + String loginId = "testuser123"; + String password = "password123"; + String name = "홍길동"; + String birthDate = "1990-01-01"; + String email = "test@example.com"; + + Member member = new Member(loginId, password, name, birthDate, email); + + assertAll( + () -> assertThat(member.getLoginId()).isEqualTo(loginId), + () -> assertThat(member.getName()).isEqualTo(name), + () -> assertThat(member.getBirthDate()).isEqualTo(birthDate), + () -> assertThat(member.getEmail()).isEqualTo(email) + ); + } + + @DisplayName("둜그인IDκ°€ null이면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€") + @Test + void failsWhenLoginIdIsNull() { + assertThatThrownBy(() -> + new Member(null, "pw", "name", "1990-01-01", "email@test.com") + ) + .isInstanceOf(CoreException.class) + .hasFieldOrPropertyWithValue("errorType", ErrorType.BAD_REQUEST); + } + + @DisplayName("둜그인IDκ°€ 빈 λ¬Έμžμ—΄μ΄λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€") + @Test + void failsWhenLoginIdIsBlank() { + assertThatThrownBy(() -> + new Member(" ", "pw", "name", "1990-01-01", "email@test.com") + ) + .isInstanceOf(CoreException.class); + } + + @DisplayName("λΉ„λ°€λ²ˆν˜Έκ°€ null이면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€") + @Test + void failsWhenPasswordIsNull() { + assertThatThrownBy(() -> + new Member("loginId", null, "name", "1990-01-01", "email@test.com") + ) + .isInstanceOf(CoreException.class); + } + + @DisplayName("이름이 null이면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€") + @Test + void failsWhenNameIsNull() { + assertThatThrownBy(() -> + new Member("loginId", "pw", null, "1990-01-01", "email@test.com") + ) + .isInstanceOf(CoreException.class); + } + + @DisplayName("생년월일이 null이면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€") + @Test + void failsWhenBirthDateIsNull() { + assertThatThrownBy(() -> + new Member("loginId", "pw", "name", null, "email@test.com") + ) + .isInstanceOf(CoreException.class); + } + + @DisplayName("이메일이 null이면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€") + @Test + void failsWhenEmailIsNull() { + assertThatThrownBy(() -> + new Member("loginId", "pw", "name", "1990-01-01", null) + ) + .isInstanceOf(CoreException.class); + } + } +} From a9087296540db9064999bf0363d44664c727d86d Mon Sep 17 00:00:00 2001 From: simoncho91 Date: Fri, 6 Feb 2026 17:35:39 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20Member=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EA=B8=B0=EB=B3=B8=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ν•„μˆ˜ ν•„λ“œ 5개 (loginId, encryptedPassword, name, birthDate, email) - μƒμ„±μžμ—μ„œ 각 ν•„λ“œ null/blank 검증 - BaseEntity μƒμ†μœΌλ‘œ id, 생성/μˆ˜μ • μ‹œκ°„ μžλ™ 관리 - λΉ„λ°€λ²ˆν˜Έ μ•”ν˜Έν™”λŠ” μΆ”ν›„ κ΅¬ν˜„ μ˜ˆμ • --- .../com/loopers/domain/member/Member.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 apps/commerce-api/src/main/java/com/loopers/domain/member/Member.java diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/member/Member.java b/apps/commerce-api/src/main/java/com/loopers/domain/member/Member.java new file mode 100644 index 00000000..d4053ed3 --- /dev/null +++ b/apps/commerce-api/src/main/java/com/loopers/domain/member/Member.java @@ -0,0 +1,81 @@ +package com.loopers.domain.member; + +import com.loopers.domain.BaseEntity; +import com.loopers.support.error.CoreException; +import com.loopers.support.error.ErrorType; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + +@Entity +@Table(name = "member") +public class Member extends BaseEntity { + + private String loginId; + private String encryptedPassword; + private String name; + private String birthDate; + private String email; + + protected Member() {} + + public Member(String loginId, String rawPassword, String name, + String birthDate, String email) { + validateLoginId(loginId); + validatePassword(rawPassword); + validateName(name); + validateBirthDate(birthDate); + validateEmail(email); + + this.loginId = loginId; + this.encryptedPassword = rawPassword; + this.name = name; + this.birthDate = birthDate; + this.email = email; + } + + private void validateLoginId(String loginId) { + if (loginId == null || loginId.isBlank()) { + throw new CoreException(ErrorType.BAD_REQUEST, "둜그인IDλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€"); + } + } + + private void validatePassword(String password) { + if (password == null || password.isBlank()) { + throw new CoreException(ErrorType.BAD_REQUEST, "λΉ„λ°€λ²ˆν˜ΈλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€"); + } + } + + private void validateName(String name) { + if (name == null || name.isBlank()) { + throw new CoreException(ErrorType.BAD_REQUEST, "이름은 ν•„μˆ˜μž…λ‹ˆλ‹€"); + } + } + + private void validateBirthDate(String birthDate) { + if (birthDate == null || birthDate.isBlank()) { + throw new CoreException(ErrorType.BAD_REQUEST, "생년월일은 ν•„μˆ˜μž…λ‹ˆλ‹€"); + } + } + + private void validateEmail(String email) { + if (email == null || email.isBlank()) { + throw new CoreException(ErrorType.BAD_REQUEST, "이메일은 ν•„μˆ˜μž…λ‹ˆλ‹€"); + } + } + + public String getLoginId() { + return loginId; + } + + public String getName() { + return name; + } + + public String getBirthDate() { + return birthDate; + } + + public String getEmail() { + return email; + } +}