프로젝트 개요 : 이것이 취업을 위한 백엔드 개발이다 클론코딩 - 상품관리 애플리케이션
프로젝트 환경 : IntelliJ, SpringBoot, MySQL
프로젝트 코드 : https://github.com/smkim9202/ProductManagement
상품 조회하기
상품 번호 기준으로 하나의 상품 조회
ListProductRepository.java
public Product findById(Long id){
Product foundProduct = null;
for (Product product : products) {
if (product.sameId(id)) {
foundProduct = product;
break;
}
}
if (foundProduct == null) {
throw new NoSuchElementException();
}
return foundProduct;
}
findById 메서드
Product가 들어 있는 리스트에서 상품번호 기준으로 하나의 Product를 뽑는 메서드
파라미터로 받은 id와 일치하는 id를 가진 Product를 찾아 반환 => Product에 smaeId 메서드 추가 필요
만약 찾지 못하면 NoSuchElementException이라는 예외를 던짐
Product.java
public Boolean sameId(Long id) {
return this.id.equals(id);
}
sameId 메서드
파라미터로 받은 id값을 Product 인스턴스의 id와 비교하여 같으면 참, 다르면 거짓이 반환되는 메서드
SimpleProductService.java
public ProductDto findByid(Long id){
Product product = listProductRepository.findById(id);
ProductDto productDto = modelMapper.map(product, ProductDto.class);
return productDto;
}
ProductController.java
@RequestMapping(value = "/products/{id}", method = RequestMethod.GET)
public ProductDto findProductById(@PathVariable Long id){
return simpleProductService.findByid(id);
}
/{id}
패스 베리어블
{}안에 있는 값과 매개변수의 변수 이름이 같으면 요청된 값이 매개변수로 들어와서 실행
전체 상품 목록 조회
ListProductRepository.java
public List<Product> findAll() {
return products;
}
SimpleProductService.java
public List<ProductDto> findAll(){
List<Product> products = listProductRepository.findAll();
List<ProductDto> productDtos = new ArrayList<>();
for (Product product : products) {
productDtos.add(modelMapper.map(product, ProductDto.class));
}
return productDtos;
}
Product 리스트를 ProdductDto 리스트로 변환하여 보내기 위해 for문 사용
ProductController.java
@RequestMapping(value = "/products", method = RequestMethod.GET)
public List<ProductDto> findAllProduct(){
return simpleProductService.findAll();
}
상품추가와 경로는 같으나 HTTP 메서드가 다름 : /products
추가 : POST
전체 조회 : GET
검색 조회 - 상품 이름 부분 검색
Product.java
public Boolean containsName(String name){
return this.name.contains(name);
}
containsName 메서드
파라미터로 받은 name값을 Product 인스턴스와 비교하여 포함되어 있으면 참, 포함되어 있지 않으면 거짓
ListProductRepository.java
public List<Product> findByNameContaining(String name){
List<Product> foundProducts = new ArrayList<>();
for (Product product : products) {
if (product.containsName(name)) {
foundProducts.add(product);
}
}
return foundProducts;
}
simpleProductService.java
public List<ProductDto> findByNameContaining(String name){
List<Product> products = listProductRepository.findByNameContaining(name);
List<ProductDto> productDtos = new ArrayList<>();
for (Product product : products) {
productDtos.add(modelMapper.map(product, ProductDto.class));
}
return productDtos;
}
ProductController.java
@RequestMapping(value = "/products", method = RequestMethod.GET)
public List<ProductDto> findAllProduct(@RequestParam(required = false) String name){
if(null == name){
return simpleProductService.findAll();
}
return simpleProductService.findByNameContaining(name);
}
상품 전체 조회와 경로도 HTTP 메서드도 같음 : /products, GET
@RequestParam은 기본 속성이 파라미터를 필수로 받는 것으로 필수가 아니면 required속성의 값을 false로 명시
전체 조회 : name이라는 쿼리 파라미터가 넘어 오지 않으면 기존과 동일하게 전체 목록 조회
검색 조회 : name이라는 쿼리 파라미터가 넘어 오면 이름 검색 조회
상품 수정하기
상품 번호 기준으로 나머지 정보 수정
ProductController.java
@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ProductDto updateProduct(@PathVariable Long id, @RequestBody ProductDto productDto){
productDto.setId(id);
return simpleProductService.update(productDto);
}
상품번호 조회와 경로는 같으나 HTTP 메서드가 다름 : /products/{id}
상품번호 조회 : GET
상품 수정 : PUT
상품 호출하고, 호출된 결과 반환 : DTO
상품 수정 : Entity
SimpleProductService.java
public ProductDto update(ProductDto productDto){
Product product = modelMapper.map(productDto, Product.class);
Product updateProduct = listProductRepository.update(product);
ProductDto updateProductDto = modelMapper.map(updateProduct, ProductDto.class);
return updateProductDto;
}
ListProductRepository.java
public Product update(Product product){
Integer indexToModify = products.indexOf(product);
products.set(indexToModify, product);
return product;
}
리스트의 indexOf 메서드
리스트의 요소 중 매개변수로 받은 인스턴스와 동등한 인스턴스의 index를 반환
equals = 동등한 인스턴스 => 상품 객체의 동등성 사용하기 위해서는 equals 오버라이딩 필요
Product.java
id 동등성 추가 : command+N -> equals() and hashCode() - Next - id 필드 체크 후 Next
상품 삭제하기
상품 번호 기준으로 특정 상품 삭제
ProductController.java
@RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
public void deleteProduct(@PathVariable Long id){
simpleProductService.delete(id);
}
상품번호 조회, 수정과 경로는 같으나 HTTP 메서드가 다름 : /products/{id}
상품번호 조회 : GET
상품 수정 : PUT
상품 삭제 : DELETE
SimpleProductService.java
public void delete(Long id){
listProductRepository.delete(id);
}
ListPRoductRepository.java
public void delete(Long id){
Product product = this.findById(id);
products.remove(product);
}
리스트의 remove 메서드
리스트 요소 중 동등한(equals) 요소를 찾아서 지워주는 기능
Soft Delete
실무에서 사용자에게는 데이터가 삭제된 것처럼 보이지만, 내부적으로는 삭제하지 않는 경우를 말함
- 조회시 삭제된 것처럼 보이다 삭제 취소시 조회되도록 하고 싶은 경우나 서비스 내에서 휴면계정으로 보이게 할 경우등 서비스 요구사항에 따라 원상 복구 시켜야 할 가능성이 있어서 사용
- Boolean 타입의 필드 중 하나를 추가하여 해당 필드가 참이면 삭제된 것처럼 조회하는 등의 방법으로 구현
'프로젝트 > clone coding' 카테고리의 다른 글
[백엔드 개발 : ProductManagement] 전역 예외 핸들러 추가 (0) | 2025.03.27 |
---|---|
[백엔드 개발 : ProductManagement] 유효성 검사 추가 (0) | 2025.03.20 |
[백엔드 개발 : ProductManagement] DTO와 getter, setter (0) | 2025.03.18 |
[백엔드 개발 : ProductManagement] 상품 추가 구현(프로젝트 구조 잡기) (0) | 2025.03.17 |
[백엔드 개발 : ProductManagement] 상품관리 애플리케이션 정의 (0) | 2025.03.17 |
프로젝트 개요 : 이것이 취업을 위한 백엔드 개발이다 클론코딩 - 상품관리 애플리케이션
프로젝트 환경 : IntelliJ, SpringBoot, MySQL
프로젝트 코드 : https://github.com/smkim9202/ProductManagement
상품 조회하기
상품 번호 기준으로 하나의 상품 조회
ListProductRepository.java
public Product findById(Long id){
Product foundProduct = null;
for (Product product : products) {
if (product.sameId(id)) {
foundProduct = product;
break;
}
}
if (foundProduct == null) {
throw new NoSuchElementException();
}
return foundProduct;
}
findById 메서드
Product가 들어 있는 리스트에서 상품번호 기준으로 하나의 Product를 뽑는 메서드
파라미터로 받은 id와 일치하는 id를 가진 Product를 찾아 반환 => Product에 smaeId 메서드 추가 필요
만약 찾지 못하면 NoSuchElementException이라는 예외를 던짐
Product.java
public Boolean sameId(Long id) {
return this.id.equals(id);
}
sameId 메서드
파라미터로 받은 id값을 Product 인스턴스의 id와 비교하여 같으면 참, 다르면 거짓이 반환되는 메서드
SimpleProductService.java
public ProductDto findByid(Long id){
Product product = listProductRepository.findById(id);
ProductDto productDto = modelMapper.map(product, ProductDto.class);
return productDto;
}
ProductController.java
@RequestMapping(value = "/products/{id}", method = RequestMethod.GET)
public ProductDto findProductById(@PathVariable Long id){
return simpleProductService.findByid(id);
}
/{id}
패스 베리어블
{}안에 있는 값과 매개변수의 변수 이름이 같으면 요청된 값이 매개변수로 들어와서 실행
전체 상품 목록 조회
ListProductRepository.java
public List<Product> findAll() {
return products;
}
SimpleProductService.java
public List<ProductDto> findAll(){
List<Product> products = listProductRepository.findAll();
List<ProductDto> productDtos = new ArrayList<>();
for (Product product : products) {
productDtos.add(modelMapper.map(product, ProductDto.class));
}
return productDtos;
}
Product 리스트를 ProdductDto 리스트로 변환하여 보내기 위해 for문 사용
ProductController.java
@RequestMapping(value = "/products", method = RequestMethod.GET)
public List<ProductDto> findAllProduct(){
return simpleProductService.findAll();
}
상품추가와 경로는 같으나 HTTP 메서드가 다름 : /products
추가 : POST
전체 조회 : GET
검색 조회 - 상품 이름 부분 검색
Product.java
public Boolean containsName(String name){
return this.name.contains(name);
}
containsName 메서드
파라미터로 받은 name값을 Product 인스턴스와 비교하여 포함되어 있으면 참, 포함되어 있지 않으면 거짓
ListProductRepository.java
public List<Product> findByNameContaining(String name){
List<Product> foundProducts = new ArrayList<>();
for (Product product : products) {
if (product.containsName(name)) {
foundProducts.add(product);
}
}
return foundProducts;
}
simpleProductService.java
public List<ProductDto> findByNameContaining(String name){
List<Product> products = listProductRepository.findByNameContaining(name);
List<ProductDto> productDtos = new ArrayList<>();
for (Product product : products) {
productDtos.add(modelMapper.map(product, ProductDto.class));
}
return productDtos;
}
ProductController.java
@RequestMapping(value = "/products", method = RequestMethod.GET)
public List<ProductDto> findAllProduct(@RequestParam(required = false) String name){
if(null == name){
return simpleProductService.findAll();
}
return simpleProductService.findByNameContaining(name);
}
상품 전체 조회와 경로도 HTTP 메서드도 같음 : /products, GET
@RequestParam은 기본 속성이 파라미터를 필수로 받는 것으로 필수가 아니면 required속성의 값을 false로 명시
전체 조회 : name이라는 쿼리 파라미터가 넘어 오지 않으면 기존과 동일하게 전체 목록 조회
검색 조회 : name이라는 쿼리 파라미터가 넘어 오면 이름 검색 조회
상품 수정하기
상품 번호 기준으로 나머지 정보 수정
ProductController.java
@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ProductDto updateProduct(@PathVariable Long id, @RequestBody ProductDto productDto){
productDto.setId(id);
return simpleProductService.update(productDto);
}
상품번호 조회와 경로는 같으나 HTTP 메서드가 다름 : /products/{id}
상품번호 조회 : GET
상품 수정 : PUT
상품 호출하고, 호출된 결과 반환 : DTO
상품 수정 : Entity
SimpleProductService.java
public ProductDto update(ProductDto productDto){
Product product = modelMapper.map(productDto, Product.class);
Product updateProduct = listProductRepository.update(product);
ProductDto updateProductDto = modelMapper.map(updateProduct, ProductDto.class);
return updateProductDto;
}
ListProductRepository.java
public Product update(Product product){
Integer indexToModify = products.indexOf(product);
products.set(indexToModify, product);
return product;
}
리스트의 indexOf 메서드
리스트의 요소 중 매개변수로 받은 인스턴스와 동등한 인스턴스의 index를 반환
equals = 동등한 인스턴스 => 상품 객체의 동등성 사용하기 위해서는 equals 오버라이딩 필요
Product.java
id 동등성 추가 : command+N -> equals() and hashCode() - Next - id 필드 체크 후 Next
상품 삭제하기
상품 번호 기준으로 특정 상품 삭제
ProductController.java
@RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
public void deleteProduct(@PathVariable Long id){
simpleProductService.delete(id);
}
상품번호 조회, 수정과 경로는 같으나 HTTP 메서드가 다름 : /products/{id}
상품번호 조회 : GET
상품 수정 : PUT
상품 삭제 : DELETE
SimpleProductService.java
public void delete(Long id){
listProductRepository.delete(id);
}
ListPRoductRepository.java
public void delete(Long id){
Product product = this.findById(id);
products.remove(product);
}
리스트의 remove 메서드
리스트 요소 중 동등한(equals) 요소를 찾아서 지워주는 기능
Soft Delete
실무에서 사용자에게는 데이터가 삭제된 것처럼 보이지만, 내부적으로는 삭제하지 않는 경우를 말함
- 조회시 삭제된 것처럼 보이다 삭제 취소시 조회되도록 하고 싶은 경우나 서비스 내에서 휴면계정으로 보이게 할 경우등 서비스 요구사항에 따라 원상 복구 시켜야 할 가능성이 있어서 사용
- Boolean 타입의 필드 중 하나를 추가하여 해당 필드가 참이면 삭제된 것처럼 조회하는 등의 방법으로 구현
'프로젝트 > clone coding' 카테고리의 다른 글
[백엔드 개발 : ProductManagement] 전역 예외 핸들러 추가 (0) | 2025.03.27 |
---|---|
[백엔드 개발 : ProductManagement] 유효성 검사 추가 (0) | 2025.03.20 |
[백엔드 개발 : ProductManagement] DTO와 getter, setter (0) | 2025.03.18 |
[백엔드 개발 : ProductManagement] 상품 추가 구현(프로젝트 구조 잡기) (0) | 2025.03.17 |
[백엔드 개발 : ProductManagement] 상품관리 애플리케이션 정의 (0) | 2025.03.17 |