From 4617a41ca4eff39817d2cc80494f7e4962e70c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A4=80=ED=97=8C?= Date: Tue, 4 Mar 2025 08:59:27 +0900 Subject: [PATCH] Refactor week 3 study plan and clean up MemberRestController Expanded and refined explanations of JPA concepts (e.g., AttributeConverter, Embeddable) and improved clarity on testing practices like MockMvc and DTO usage. Removed unused import from MemberRestController for improved code quality. --- plan/3. study_plan-curriculum.md | 4 +- plan/4.3. study_plan-week-3-summary.md | 75 +++++++++++++++++-- .../controller/MemberRestController.java | 1 - 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/plan/3. study_plan-curriculum.md b/plan/3. study_plan-curriculum.md index ba5b2ff..65b65b9 100644 --- a/plan/3. study_plan-curriculum.md +++ b/plan/3. study_plan-curriculum.md @@ -31,14 +31,14 @@ ### πŸ“… 3μ£Όμ°¨ - **3.1.** JPA 심화 ν•™μŠ΅ - - **3.1.1.** Converter μ‚¬μš© + - **3.1.1.** AttributeConverter μ‚¬μš© - **3.1.2.** Embeddable μ‚¬μš© - **3.1.3.** Auditing μ‚¬μš© - **3.1.4.** ManyToOne, OneToMany μ‚¬μš© - **3.2.** Spring Boot ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± - **3.2.1.** λ‹¨μœ„ ν…ŒμŠ€νŠΈ (Unit Test) μž‘μ„± + - MockMvc μ‚¬μš© - **3.2.2.** 톡합 ν…ŒμŠ€νŠΈ (Integration Test) μž‘μ„± - - **3.2.3.** MockMvc μ‚¬μš© - **3.3.** RESTful API 섀계 및 κ΅¬ν˜„ - **3.3.1.** RESTful API κΈ°λ³Έ 원칙 - **3.3.2.** Request, Response DTO 클래슀 μž‘μ„± diff --git a/plan/4.3. study_plan-week-3-summary.md b/plan/4.3. study_plan-week-3-summary.md index ce83b7d..d46a3c8 100644 --- a/plan/4.3. study_plan-week-3-summary.md +++ b/plan/4.3. study_plan-week-3-summary.md @@ -2,22 +2,85 @@ ## πŸ“œ μŠ€ν„°λ”” μš”μ•½ ### πŸ“… 3μ£Όμ°¨ - **3.1.** JPA 심화 ν•™μŠ΅ - - **3.1.1.** Converter μ‚¬μš© - - **3.1.2.** Embeddable μ‚¬μš© - - **3.1.3.** Auditing μ‚¬μš© - - **3.1.4.** ManyToOne, OneToMany μ‚¬μš© + - **3.1.1.** `AttributeConverter` μ‚¬μš© + - `AttributeConverter`λž€ DB 컬럼과 μ—”ν‹°ν‹° ν•„λ“œ κ°„μ˜ λ³€ν™˜μ„ λ‹΄λ‹Ήν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€ + - `@RequestParam`, `@PathVariable` λ“±μœΌλ‘œ μ „λ‹¬λ˜λŠ” κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•  λ•Œ μ‚¬μš©ν•˜λŠ” `Converter`μ™€λŠ” 닀름 + - **3.1.2.** `Embeddable` μ‚¬μš© + - `Embeddable`은 `VO`(Value Object)λ₯Ό ν‘œν˜„ν•˜λŠ”λ° μ‚¬μš©λ˜λ©°, μž¬μ‚¬μš© κ°€λŠ₯ν•œ `VO`λ₯Ό μ‰½κ²Œ ν™œμš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€Œ + - DB ν…Œμ΄λΈ”μ— `VO`의 ν•„λ“œκ°€ κ·ΈλŒ€λ‘œ λ§€ν•‘λ˜λŠ” 것이 μ•„λ‹ˆλΌ, `VO`의 ν•„λ“œκ°€ μ—”ν‹°ν‹°μ˜ ν•„λ“œλ‘œ ν¬ν•¨λ˜μ–΄ 맀핑됨 + - e.g. `Address` 클래슀λ₯Ό `User` 엔티티에 ν¬ν•¨μ‹œν‚€κΈ° + - ```mysql + CREATE TABLE user ( + id BIGINT PRIMARY KEY, + name VARCHAR(255), + city VARCHAR(255), + street VARCHAR(255), + zipcode VARCHAR(255) + ); + ``` + - ```java + @Embeddable + public class Address { + private String city; + private String street; + private String zipcode; + } + ``` + - ```java + @Entity + public class User { + @Id + @GeneratedValue + private Long id; + + private String name; + + @Embedded + private Address address; + } + ``` + - OOP(Object Oriented Design)의 λͺ©μ μΈ **μΊ‘μŠν™”**λ₯Ό 지원함 + - OOP의 μΊ‘μŠν™”: 객체의 μƒνƒœ(ν•„λ“œ)와 ν–‰μœ„(λ©”μ„œλ“œ)λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³ , μ™ΈλΆ€μ—μ„œ 객체의 μƒνƒœλ₯Ό 직접 λ³€κ²½ν•˜μ§€ μ•Šλ„λ‘ 함 + - `Address` 클래슀의 ν•„λ“œλ₯Ό `User` μ—”ν‹°ν‹°μ˜ ν•„λ“œλ‘œ ν¬ν•¨μ‹œν‚΄μœΌλ‘œμ¨, `Address` 클래슀의 λ‚΄λΆ€ κ΅¬ν˜„μ„ μ™ΈλΆ€λ‘œλΆ€ν„° 숨길 수 있음 + - `Address` 클래슀의 ν•„λ“œμ— λŒ€ν•œ κ΄€λ ¨ 둜직(검증 λ“±)이 μΆ”κ°€λ˜μ–΄λ„, `User` μ—”ν‹°ν‹°μ˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šμ•„λ„ 됨 + - `@Embeddable`κ³Ό `@Embedded` μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 엔티티에 `VO`λ₯Ό ν¬ν•¨μ‹œν‚¬ 수 있음 + - **3.1.3.** `Auditing` μ‚¬μš© + - **3.1.4.** `ManyToOne`, `OneToMany` μ‚¬μš© - **3.2.** Spring Boot ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± - **3.2.1.** λ‹¨μœ„ ν…ŒμŠ€νŠΈ (Unit Test) μž‘μ„± - MockMvc μ‚¬μš© + - `MockMvc`λŠ” Spring MVC ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ 클래슀둜, μ„œλ²„λ₯Ό λ„μš°μ§€ μ•Šκ³ λ„ 컨트둀러 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  수 있음 - ν…ŒμŠ€νŠΈ κ΄€μ μ—μ„œμ˜ Request, Response DTO 클래슀 μž‘μ„±μ˜ ν•„μš”μ„± + - 계측 λ³„λ‘œ DTO 클래슀λ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ„ μ‹œ, μ˜μ‘΄μ„±μ΄ λ†’μ•„μ§€κ³  ν…ŒμŠ€νŠΈ μž‘μ„±μ΄ μ–΄λ €μ›Œμ§ + - Entity 클래슀λ₯Ό Request, Response DTO둜 μ‚¬μš©ν•  경우, JPA μ˜μ‘΄μ„±μ„ ν…ŒμŠ€νŠΈ μ‹œ ν¬ν•¨μ‹œμΌœμ•Ό ν•˜λ―€λ‘œ ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μ›Œμ§ - **3.2.2.** 톡합 ν…ŒμŠ€νŠΈ (Integration Test) μž‘μ„± + - `@SpringBootTest` μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ„μš°κ³  ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ + - `@Transactional` μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈκ°€ μ’…λ£Œλ  λ•Œ λ‘€λ°± 처리 - **3.3.** RESTful API 섀계 및 κ΅¬ν˜„ - **3.3.1.** RESTful API κΈ°λ³Έ 원칙 + - RESTful APIλŠ” **μžμ›(URI)**을 ν‘œν˜„ν•˜κ³ , **ν–‰μœ„(HTTP Method)**λ₯Ό 톡해 μžμ›μ„ μ²˜λ¦¬ν•¨ + - `GET /api/users`: μ‚¬μš©μž λͺ©λ‘ 쑰회 + - `GET /api/users/{id}`: μ‚¬μš©μž 쑰회 + - `GET /api/users/{id}/address`: μ‚¬μš©μžμ˜ μ£Όμ†Œ λͺ©λ‘ 쑰회 + - `POST /api/users`: μ‚¬μš©μž 생성 + - `POST /api/users/{id}/address`: μ‚¬μš©μžμ˜ μ£Όμ†Œ 생성 + - `PUT /api/users/{id}`: μ‚¬μš©μž 정보 μˆ˜μ • + - `PUT /api/users/{id}/address/{addressId}`: μ‚¬μš©μžμ˜ μ£Όμ†Œ 정보 μˆ˜μ • + - `PUT /api/users/{id}/password`: μ‚¬μš©μžμ˜ λΉ„λ°€λ²ˆν˜Έ μˆ˜μ • + - `PUT /api/users/{id}/password-reset`: μ‚¬μš©μžμ˜ λΉ„λ°€λ²ˆν˜Έ μ΄ˆκΈ°ν™” + - `DELETE /api/users/{id}`: μ‚¬μš©μž μ‚­μ œ - 데이터 전솑 κ΄€μ μ—μ„œμ˜ Request, Response DTO 클래슀 μž‘μ„±μ˜ ν•„μš”μ„± + - ν•„λ“œ μΆ”κ°€, μ‚­μ œ λ“±μ˜ 변경이 μžˆμ„ λ•Œ, API μŠ€νŽ™μ΄ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ 함 + - Entity 클래슀의 ν•„λ“œμ™€ API μŠ€νŽ™μ΄ μΌμΉ˜ν•˜μ§€ μ•Šλ„λ‘ 함 - **3.3.3.** API μ˜ˆμ™Έ 처리 - **3.3.4.** Spring Validation μ‚¬μš© - - **3.3.5.** Converter μ‚¬μš© - - **3.3.6.** Serializer/Deserializer μ‚¬μš© + - **3.3.5.** `Converter` μ‚¬μš© + - `Converter`λŠ” `@RequestParam`, `@PathVariable` λ“±μœΌλ‘œ μ „λ‹¬λ˜λŠ” κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•  λ•Œ μ‚¬μš© + - **3.3.6.** `Serializer`/`Deserializer` μ‚¬μš© + - `Serializer`λŠ” 객체λ₯Ό JSON ν˜•νƒœλ‘œ λ³€ν™˜ν•  λ•Œ μ‚¬μš© + - `Deserializer`λŠ” JSON을 객체둜 λ³€ν™˜ν•  λ•Œ μ‚¬μš© + - `@RequestBody`둜 μ „λ‹¬λ˜λŠ” JSON 데이터λ₯Ό 객체둜 λ³€ν™˜ν•  λ•Œ μ‚¬μš© + - `@ResponseBody`, `@RestController`둜 응닡 데이터λ₯Ό JSON으둜 λ³€ν™˜ν•  λ•Œ μ‚¬μš© diff --git a/spring-boot/src/main/java/com/mpc/springboot/member/presentation/controller/MemberRestController.java b/spring-boot/src/main/java/com/mpc/springboot/member/presentation/controller/MemberRestController.java index 79ae3f8..27a31c6 100644 --- a/spring-boot/src/main/java/com/mpc/springboot/member/presentation/controller/MemberRestController.java +++ b/spring-boot/src/main/java/com/mpc/springboot/member/presentation/controller/MemberRestController.java @@ -5,7 +5,6 @@ import com.mpc.springboot.member.application.dto.CreateMemberRequest; import com.mpc.springboot.member.application.dto.MemberResponse; import com.mpc.springboot.member.application.service.MemberService; -import com.mpc.springboot.member.domain.entity.Member; import com.mpc.springboot.member.domain.vo.MemberCode; import lombok.*;