From e50a5b1e6fc0da1312c01e6b234e2d3e57e99d81 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 01:34:35 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20customer=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/domain/Address.java | 11 +++++ .../springbootjpa/domain/Customer.java | 42 +++++++++++++++++++ src/main/resources/application.properties | 1 - src/main/resources/application.yml | 21 ++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/programmers/springbootjpa/domain/Address.java create mode 100644 src/main/java/com/programmers/springbootjpa/domain/Customer.java delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml diff --git a/src/main/java/com/programmers/springbootjpa/domain/Address.java b/src/main/java/com/programmers/springbootjpa/domain/Address.java new file mode 100644 index 000000000..1dd6d30fc --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/domain/Address.java @@ -0,0 +1,11 @@ +package com.programmers.springbootjpa.domain; + +import jakarta.persistence.Embeddable; + +@Embeddable +public class Address { + + private String streetAddress; + private String detailedAddress; + private Integer zipCode; +} diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java new file mode 100644 index 000000000..0de58146a --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -0,0 +1,42 @@ +package com.programmers.springbootjpa.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @Column(name = "name", nullable = false, length = 20) + private String name; + + @Column(name = "age", nullable = false) + private Integer age; + + @Column(name = "nick_name", nullable = false) + private String nickName; + + @Embedded + private Address address; + + @Builder + public Customer(String name, Integer age, String nickName, Address address) { + this.name = name; + this.age = age; + this.nickName = nickName; + this.address = address; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b1378917..000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 000000000..1f6280ea6 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,21 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + +logging: + level: + org: + hibernate: + SQL: debug + type: + descriptor: + sql: trace From 2ade20324cf4b9f227308ddfe386f7ef19c914cb Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 02:37:02 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20CustomerController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../controller/CustomerController.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/controller/CustomerController.java diff --git a/build.gradle b/build.gradle index 9e9e67ddf..fdf0daf5a 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java new file mode 100644 index 000000000..fe219ce7b --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -0,0 +1,65 @@ +package com.programmers.springbootjpa.controller; + +import com.programmers.springbootjpa.dto.request.CustomerCreateRequest; +import com.programmers.springbootjpa.dto.request.CustomerUpdateRequest; +import com.programmers.springbootjpa.dto.response.CustomerResponse; +import com.programmers.springbootjpa.service.CustomerService; +import jakarta.validation.Valid; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RequestMapping("/api/customers") +@RequiredArgsConstructor +@RestController +public class CustomerController { + + @Autowired + private final CustomerService customerService; + + @PostMapping + public ResponseEntity createCustomer(@Valid @RequestBody CustomerCreateRequest customerCreateRequest) { + customerService.createCustomer(customerCreateRequest); + + return ResponseEntity.status(HttpStatus.CREATED).body(null); + } + + @GetMapping("/{id}") + public ResponseEntity readCustomer(@PathVariable Long id) { + CustomerResponse customerResponse = customerService.readCustomer(id); + + return ResponseEntity.ok(customerResponse); + } + + @GetMapping + public ResponseEntity> readAllCustomer() { + List customerResponses = customerService.readAllCustomer(); + + return ResponseEntity.ok(customerResponses); + } + + @PatchMapping + public ResponseEntity updateCustomer(@Valid @RequestBody CustomerUpdateRequest customerUpdateRequest) { + customerService.updateCustomer(customerUpdateRequest); + + return ResponseEntity.ok(null); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteCustomer(@PathVariable Long id) { + customerService.deleteCustomer(id); + + return ResponseEntity.noContent().build(); + } +} From e2ae899fa3e9aa1f11fe93b0ff889545c6569b12 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 02:37:22 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20CustomerController=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20DTO=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20Valid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CustomerCreateRequest.java | 37 +++++++++++++++++++ .../dto/request/CustomerUpdateRequest.java | 22 +++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/dto/request/CustomerCreateRequest.java create mode 100644 src/main/java/com/programmers/springbootjpa/dto/request/CustomerUpdateRequest.java diff --git a/src/main/java/com/programmers/springbootjpa/dto/request/CustomerCreateRequest.java b/src/main/java/com/programmers/springbootjpa/dto/request/CustomerCreateRequest.java new file mode 100644 index 000000000..3616e09b0 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/request/CustomerCreateRequest.java @@ -0,0 +1,37 @@ +package com.programmers.springbootjpa.dto.request; + +import com.programmers.springbootjpa.domain.Address; +import com.programmers.springbootjpa.domain.Customer; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CustomerCreateRequest { + + @NotBlank(message = "이름은 공백이거나 값이 없으면 안됩니다.") + private String name; + @Min(value = 1, message = "나이는 한살보다 많아야합니다.") + @Max(value = 100, message = "나이는 백살보다 적여야합니다.") + @NotNull(message = "나이는 값이 없으면 안됩니다.") + private Integer age; + @NotBlank(message = "닉네임은 공백이거나 값이 없으면 안됩니다.") + private String nickName; + @NotNull(message = "주소값은 없을 수 없습니다.") + private Address address; + + public Customer of() { + return Customer.builder() + .name(name) + .age(age) + .nickName(nickName) + .address(address) + .build(); + } + +} diff --git a/src/main/java/com/programmers/springbootjpa/dto/request/CustomerUpdateRequest.java b/src/main/java/com/programmers/springbootjpa/dto/request/CustomerUpdateRequest.java new file mode 100644 index 000000000..db878de91 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/request/CustomerUpdateRequest.java @@ -0,0 +1,22 @@ +package com.programmers.springbootjpa.dto.request; + +import com.programmers.springbootjpa.domain.Address; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CustomerUpdateRequest { + + @PositiveOrZero(message = "id값은 0이상 이어야합니다.") + private Long id; + @NotBlank(message = "닉네임은 공백이거나 값이 없으면 안됩니다.") + private String nickName; + @NotNull(message = "주소값은 없을 수 없습니다.") + private Address address; + +} From 5e48d5269fa4ff22d2bfc4276d9c70eb745df4e4 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:20:46 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20JPA=EB=A1=9C=20CustomerRepository?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/repository/CustomerRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java diff --git a/src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java b/src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java new file mode 100644 index 000000000..bf639bb3a --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/repository/CustomerRepository.java @@ -0,0 +1,8 @@ +package com.programmers.springbootjpa.repository; + +import com.programmers.springbootjpa.domain.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CustomerRepository extends JpaRepository { + +} From 26fe500b0656c501beb6ce46432cc7d69452f48b Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:21:12 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20CustomerService=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CustomerService.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/service/CustomerService.java diff --git a/src/main/java/com/programmers/springbootjpa/service/CustomerService.java b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java new file mode 100644 index 000000000..954c13447 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/service/CustomerService.java @@ -0,0 +1,64 @@ +package com.programmers.springbootjpa.service; + +import com.programmers.springbootjpa.domain.Customer; +import com.programmers.springbootjpa.dto.request.CustomerCreateRequest; +import com.programmers.springbootjpa.dto.request.CustomerUpdateRequest; +import com.programmers.springbootjpa.dto.response.CustomerResponse; +import com.programmers.springbootjpa.repository.CustomerRepository; +import java.util.List; +import java.util.NoSuchElementException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CustomerService { + + private final CustomerRepository customerRepository; + + @Transactional + public void createCustomer(CustomerCreateRequest customerCreateRequest) { + Customer customer = Customer.builder() + .name(customerCreateRequest.getName()) + .age(customerCreateRequest.getAge()) + .nickName(customerCreateRequest.getNickName()) + .address(customerCreateRequest.getAddress()) + .build(); + + customerRepository.save(customer); + } + + public List readAllCustomer() { + List customers = customerRepository.findAll(); + + return customers.stream() + .map(CustomerResponse::new) + .toList(); + } + + public CustomerResponse readCustomer(Long id) { + Customer customer = customerRepository.findById(id) + .orElseThrow(() -> new NoSuchElementException("찾는 사용자가 없습니다.")); + + return new CustomerResponse(customer); + } + + @Transactional + public void updateCustomer(CustomerUpdateRequest customerUpdateRequest) { + Customer customer = customerRepository.findById(customerUpdateRequest.getId()) + .orElseThrow(() -> new NoSuchElementException("업데이트 할 사용자가 없습니다.")); + + customer.changeNickName(customerUpdateRequest.getNickName()); + customer.changeAddress(customerUpdateRequest.getAddress()); + } + + @Transactional + public void deleteCustomer(Long id) { + customerRepository.findById(id) + .orElseThrow(() -> new NoSuchElementException("삭제할 사용자가 없습니다.")); + + customerRepository.deleteById(id); + } +} From 12ff6c0888885a547a9f663c21fcfe8670218841 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:21:47 +0900 Subject: [PATCH 06/11] =?UTF-8?q?refactor:=20=EC=97=AD=EC=A7=81=EB=A0=AC?= =?UTF-8?q?=ED=99=94=20Getter=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/controller/CustomerController.java | 4 +--- .../com/programmers/springbootjpa/domain/Address.java | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java index fe219ce7b..c25708b19 100644 --- a/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java +++ b/src/main/java/com/programmers/springbootjpa/controller/CustomerController.java @@ -7,7 +7,6 @@ import jakarta.validation.Valid; import java.util.List; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -25,7 +24,6 @@ @RestController public class CustomerController { - @Autowired private final CustomerService customerService; @PostMapping @@ -41,7 +39,7 @@ public ResponseEntity readCustomer(@PathVariable Long id) { return ResponseEntity.ok(customerResponse); } - + @GetMapping public ResponseEntity> readAllCustomer() { List customerResponses = customerService.readAllCustomer(); diff --git a/src/main/java/com/programmers/springbootjpa/domain/Address.java b/src/main/java/com/programmers/springbootjpa/domain/Address.java index 1dd6d30fc..8a00c4540 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Address.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Address.java @@ -1,11 +1,19 @@ package com.programmers.springbootjpa.domain; +import jakarta.persistence.Column; import jakarta.persistence.Embeddable; +import lombok.Getter; @Embeddable +@Getter public class Address { + @Column(name = "street_address", nullable = false) private String streetAddress; + @Column(name = "detailed_address", nullable = false) private String detailedAddress; + @Column(name = "zip_code", nullable = false) private Integer zipCode; + + } From 0bee2e9a8de7a77b271ce53f95a3e2c64c930936 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:22:40 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20Customer=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A9=94=EC=86=8C=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 --- .../com/programmers/springbootjpa/domain/Customer.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/programmers/springbootjpa/domain/Customer.java b/src/main/java/com/programmers/springbootjpa/domain/Customer.java index 0de58146a..9d2e9eaac 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Customer.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Customer.java @@ -39,4 +39,12 @@ public Customer(String name, Integer age, String nickName, Address address) { this.nickName = nickName; this.address = address; } + + public void changeNickName(String nickName) { + this.nickName = nickName; + } + + public void changeAddress(Address address) { + this.address = address; + } } From 417d0e2a02a2f51c5d78d1311fe0e6de1a25bb4e Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:23:00 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20Customer=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A9=94=EC=86=8C=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 --- .../dto/response/CustomerResponse.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java diff --git a/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java b/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java new file mode 100644 index 000000000..53a2914e5 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java @@ -0,0 +1,23 @@ +package com.programmers.springbootjpa.dto.response; + +import com.programmers.springbootjpa.domain.Address; +import com.programmers.springbootjpa.domain.Customer; +import lombok.Getter; + +@Getter +public class CustomerResponse { + + private final Long id; + private final String name; + private final Integer age; + private final String nickName; + private final Address address; + + public CustomerResponse(Customer customer) { + this.id = customer.getId(); + this.name = customer.getName(); + this.age = customer.getAge(); + this.nickName = customer.getNickName(); + this.address = customer.getAddress(); + } +} From e2487919411bbeedd987b4f005f4e85ec0e5f0c8 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:24:23 +0900 Subject: [PATCH 09/11] =?UTF-8?q?Revert=20"feat:=20Customer=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A9=94=EC=86=8C=EB=93=9C=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 This reverts commit 417d0e2a02a2f51c5d78d1311fe0e6de1a25bb4e. --- .../dto/response/CustomerResponse.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java diff --git a/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java b/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java deleted file mode 100644 index 53a2914e5..000000000 --- a/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.programmers.springbootjpa.dto.response; - -import com.programmers.springbootjpa.domain.Address; -import com.programmers.springbootjpa.domain.Customer; -import lombok.Getter; - -@Getter -public class CustomerResponse { - - private final Long id; - private final String name; - private final Integer age; - private final String nickName; - private final Address address; - - public CustomerResponse(Customer customer) { - this.id = customer.getId(); - this.name = customer.getName(); - this.age = customer.getAge(); - this.nickName = customer.getNickName(); - this.address = customer.getAddress(); - } -} From effad6138c2e57f38592dc112b6fd5392c1dd111 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 27 Jul 2023 03:27:40 +0900 Subject: [PATCH 10/11] =?UTF-8?q?feat:=20CustomerResponse=20dto=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/CustomerResponse.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java diff --git a/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java b/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java new file mode 100644 index 000000000..53a2914e5 --- /dev/null +++ b/src/main/java/com/programmers/springbootjpa/dto/response/CustomerResponse.java @@ -0,0 +1,23 @@ +package com.programmers.springbootjpa.dto.response; + +import com.programmers.springbootjpa.domain.Address; +import com.programmers.springbootjpa.domain.Customer; +import lombok.Getter; + +@Getter +public class CustomerResponse { + + private final Long id; + private final String name; + private final Integer age; + private final String nickName; + private final Address address; + + public CustomerResponse(Customer customer) { + this.id = customer.getId(); + this.name = customer.getName(); + this.age = customer.getAge(); + this.nickName = customer.getNickName(); + this.address = customer.getAddress(); + } +} From 209b83feff381a3eadea02df747d5038104e45fa Mon Sep 17 00:00:00 2001 From: changhyeon Date: Fri, 28 Jul 2023 00:19:47 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat:=20=EC=98=81=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EC=BB=A8=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EB=AA=85?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springbootjpa/domain/Address.java | 9 +- .../springbootjpa/PersistenceContextTest.java | 124 ++++++++++++++++++ .../SpringbootJpaApplicationTests.java | 13 -- 3 files changed, 132 insertions(+), 14 deletions(-) create mode 100644 src/test/java/com/programmers/springbootjpa/PersistenceContextTest.java delete mode 100644 src/test/java/com/programmers/springbootjpa/SpringbootJpaApplicationTests.java diff --git a/src/main/java/com/programmers/springbootjpa/domain/Address.java b/src/main/java/com/programmers/springbootjpa/domain/Address.java index 8a00c4540..47b087c2b 100644 --- a/src/main/java/com/programmers/springbootjpa/domain/Address.java +++ b/src/main/java/com/programmers/springbootjpa/domain/Address.java @@ -2,10 +2,13 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; @Embeddable @Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Address { @Column(name = "street_address", nullable = false) @@ -15,5 +18,9 @@ public class Address { @Column(name = "zip_code", nullable = false) private Integer zipCode; - + public Address(String streetAddress, String detailedAddress, Integer zipCode) { + this.streetAddress = streetAddress; + this.detailedAddress = detailedAddress; + this.zipCode = zipCode; + } } diff --git a/src/test/java/com/programmers/springbootjpa/PersistenceContextTest.java b/src/test/java/com/programmers/springbootjpa/PersistenceContextTest.java new file mode 100644 index 000000000..a0de5a140 --- /dev/null +++ b/src/test/java/com/programmers/springbootjpa/PersistenceContextTest.java @@ -0,0 +1,124 @@ +package com.programmers.springbootjpa; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springbootjpa.domain.Address; +import com.programmers.springbootjpa.domain.Customer; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.EntityTransaction; +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; + +@SpringBootTest +public class PersistenceContextTest { + + @Autowired + EntityManagerFactory entityManagerFactory; + + @Test + @DisplayName("고객을 영속 상태로 만들 수 있다.") + void persistCustomer() { + // given + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction entityTransaction = entityManager.getTransaction(); + + entityTransaction.begin(); + Customer customer = Customer.builder() + .name("이현호") + .nickName("황창현") + .age(27) + .address(new Address("서울특별시 영등포구 도신로", "XX빌딩", 10000)) + .build(); + + // when + entityManager.persist(customer); + entityTransaction.commit(); + + Customer persistedCustomer = entityManager.find(Customer.class, 1L); + + // then + assertThat(persistedCustomer).usingRecursiveComparison().isEqualTo(customer); + } + + @Test + @DisplayName("고객을 준영속 상태로 만들 수 있다.") + void semiPersistCustomer() { + // given + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction entityTransaction = entityManager.getTransaction(); + + entityTransaction.begin(); + Customer customer = Customer.builder() + .name("이현호") + .nickName("황창현") + .age(27) + .address(new Address("서울특별시 영등포구 도신로", "XX빌딩", 10000)) + .build(); + + // when + entityManager.persist(customer); + entityTransaction.commit(); + + entityManager.detach(customer); + boolean isSemiPersisted = entityManager.contains(customer); + + // then + assertThat(isSemiPersisted).isFalse(); + } + + @Test + @DisplayName("고객을 비영속 상태로 만들 수 있다.") + void nonPersistCustomer() { + // given + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction entityTransaction = entityManager.getTransaction(); + + entityTransaction.begin(); + Customer customer = Customer.builder() + .name("이현호") + .nickName("황창현") + .age(27) + .address(new Address("서울특별시 영등포구 도신로", "XX빌딩", 10000)) + .build(); + + // when + entityTransaction.commit(); + + boolean isNonPersisted = entityManager.contains(customer); + + // then + assertThat(isNonPersisted).isFalse(); + } + + @Test + @DisplayName("고객을 영속성 컨텍스트에서 삭제할 수 있다.") + void removeCustomerFromPersistenceContext() { + // given + EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityTransaction entityTransaction = entityManager.getTransaction(); + + entityTransaction.begin(); + Customer customer = Customer.builder() + .name("이현호") + .nickName("황창현") + .age(27) + .address(new Address("서울특별시 영등포구 도신로", "XX빌딩", 10000)) + .build(); + + // when + entityManager.persist(customer); + entityTransaction.commit(); + entityManager.remove(customer); + + boolean isRemovedFromPersistenceContext = entityManager.contains(customer); + Customer actualCustomer = entityManager.find(Customer.class, 1L); + + // then + assertThat(isRemovedFromPersistenceContext).isFalse(); + assertThat(actualCustomer).isNull(); + } + +} diff --git a/src/test/java/com/programmers/springbootjpa/SpringbootJpaApplicationTests.java b/src/test/java/com/programmers/springbootjpa/SpringbootJpaApplicationTests.java deleted file mode 100644 index b530064fb..000000000 --- a/src/test/java/com/programmers/springbootjpa/SpringbootJpaApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.programmers.springbootjpa; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SpringbootJpaApplicationTests { - - @Test - void contextLoads() { - } - -}