728x90
반응형
< SimpleProductService.java >
package kr.co.hanbit.product.management.application;
import kr.co.hanbit.product.management.domain.Product;
import kr.co.hanbit.product.management.infrastructure.ListProductRepository;
import kr.co.hanbit.product.management.presentation.ProductDto;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SimpleProductService {
private final ListProductRepository listProductRepository;
private final ModelMapper modelMapper;
@Autowired
SimpleProductService(ListProductRepository listProductRepository, ModelMapper modelMapper) {
this.listProductRepository = listProductRepository;
this.modelMapper = modelMapper;
}
public ProductDto add(ProductDto productDto) {
//1. ProductDto를 Product로 변환하는 코드
Product product = modelMapper.map(productDto, Product.class);
//2. 레포지토리를 호출하는 코드
Product savedProduct = listProductRepository.add(product);
//3. Product를 ProductDTO로 변환하는 코드
ProductDto savedProductDto = modelMapper.map(savedProduct, ProductDto.class); // 에러 1
//4. DTO를 반환하는 코드
return savedProductDto;
}
public ProductDto findById(Long id) {
Product product = listProductRepository.findById(id);
ProductDto productDto = modelMapper.map(product, ProductDto.class); // 에러 2
return productDto;
}
public List<ProductDto> findAll() {
List<Product> products = listProductRepository.findAll();
List<ProductDto> productDtos = products.stream() // 에러 3
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
return productDtos;
}
public List<ProductDto> findByNameContaining(String name) {
List<Product> products = listProductRepository.findByNameContaining(name);
List<ProductDto> productDtos = products.stream() // 에러 4
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
return productDtos;
}
}
총 4개의 에러가 발생했는데, 에러의 내용이 전부 동일하다.
Local variable 'savedProductDto' is redundant
* redundant : 불필요한, 쓸모없는
- 한마디로, 'savedProductDto' 변수가 불필요하다는 의미이다.
에러 1
ProductDto savedProductDto = modelMapper.map(savedProduct, ProductDto.class);
// 32번줄, savedProductDto
Local variable 'savedProductDto' is redundant
에러 2
ProductDto productDto = modelMapper.map(product, ProductDto.class);
// 40번줄, productDto
Local variable 'productDto' is redundant
에러 3
List<ProductDto> productDtos = products.stream()
// 46번줄, productDtos
Local variable 'productDtos' is redundant
에러 4
List<ProductDto> productDtos = products.stream()
// 54번줄, productDtos
Local variable 'productDtos' is redundant
그렇다면, 이러한 문제를 해결하기 위해서는 어떻게 해야 할까 ?
불필요한 변수 할당을 제거하고 바로 리턴하는 방식으로 코드를 간결하게 만들면 된다.
에러 1 : add()
< 기존 코드 >
ProductDto savedProductDto = modelMapper.map(savedProduct, ProductDto.class);
return savedProductDto;
이는 해당 변수를 바로 리턴할 수 있음에도 불구하고, 별도의 변수에 할당하는 것이 중복이라는 의미이다.
불필요한 변수 할당을 제거하고 바로 리턴하는 방식으로 코드를 수정해보자.
< 수정 코드 >
return modelMapper.map(savedProduct, ProductDto.class);
에러 2 : findById()
< 기존 코드 >
public ProductDto findById(Long id) {
Product product = listProductRepository.findById(id);
ProductDto productDto = modelMapper.map(product, ProductDto.class);
return productDto;
}
findById()에서 발생하는 redundant 에러를 해결하기 위해,
중간 변수 productDto를 제거하고 직접 return 문에서 modelMapper.map 메서드를 호출해보자.
< 수정 코드 >
public ProductDto findById(Long id) {
Product product = listProductRepository.findById(id);
return modelMapper.map(product, ProductDto.class);
}
이는 코드의 간결성을 높이고 불필요한 변수를 제거해준다.
에러 3 : findAll()
< 기존 코드 >
public List<ProductDto> findAll() {
List<Product> products = listProductRepository.findAll();
List<ProductDto> productDtos = products.stream()
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
return productDtos;
}
productDtos 변수를 제거해보자.
< 수정 코드 >
public List<ProductDto> findAll() {
List<Product> products = listProductRepository.findAll();
return products.stream()
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
}
에러 4 : findByNameContaining()
< 기존 코드 >
public List<ProductDto> findByNameContaining(String name) {
List<Product> products = listProductRepository.findByNameContaining(name);
List<ProductDto> productDtos = products.stream()
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
return productDtos;
}
productDtos 변수 제거
< 수정 코드 >
public List<ProductDto> findByNameContaining(String name) {
List<Product> products = listProductRepository.findByNameContaining(name);
return products.stream()
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
}
< 수정본 SimpleProductService.java >
package kr.co.hanbit.product.management.application;
import kr.co.hanbit.product.management.domain.Product;
import kr.co.hanbit.product.management.infrastructure.ListProductRepository;
import kr.co.hanbit.product.management.presentation.ProductDto;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SimpleProductService {
private final ListProductRepository listProductRepository;
private final ModelMapper modelMapper;
@Autowired
SimpleProductService(ListProductRepository listProductRepository, ModelMapper modelMapper) {
this.listProductRepository = listProductRepository;
this.modelMapper = modelMapper;
}
public ProductDto add(ProductDto productDto) {
//1. ProductDto를 Product로 변환하는 코드
Product product = modelMapper.map(productDto, Product.class);
//2. 레포지토리를 호출하는 코드
Product savedProduct = listProductRepository.add(product);
//3. Product를 ProductDTO로 변환 후 반환하는 코드
// 수정 1
return modelMapper.map(savedProduct, ProductDto.class);
}
// 수정 2
public ProductDto findById(Long id) {
Product product = listProductRepository.findById(id);
return modelMapper.map(product, ProductDto.class);
}
// 수정 3
public List<ProductDto> findAll() {
List<Product> products = listProductRepository.findAll();
return products.stream()
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
}
// 수정 4
public List<ProductDto> findByNameContaining(String name) {
List<Product> products = listProductRepository.findByNameContaining(name);
return products.stream()
.map(product -> modelMapper.map(product, ProductDto.class))
.toList();
}
}
728x90
반응형
'[Language] > Java | Spring | JSP' 카테고리의 다른 글
[Java Swing] 0. Swing으로 버튼 만들기 (JButton Component) (0) | 2024.06.18 |
---|---|
[Java Swing] Eclipse에서 Java Swing 설치하기 (1) | 2024.06.18 |
Field 'modelMapper' may be 'final' : final 선언 (0) | 2024.05.27 |
BeanCreationException : modelMapper Bean 생성 에러 (0) | 2024.05.26 |
[MAC/Homebrew] JAVA 11 설치 (0) | 2023.10.25 |