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.*;