http://www.yes24.com/Product/Goods/18249021
객체지향의 사실과 오해 - YES24
『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장
www.yes24.com
"객체지향의 사실과 오해"는 인프런 김영한님의 JPA강의에서 추천한 책이다.
사람은 자동차 문을 열면 안된다. 객체지향에서는 자동차도 객체이기 때문에 사람이 자동차에게 문을 열어달라고 요청해야한다.
자동차가 예외를 확인한 후 문을 여는 것이 옳다.
위 내용을 읽고 나의 코드를 리팩토링 해봤다.
기존 코드
도메인
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@ToString
@Builder
public class Review {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long review_id;
private String name;
private int designEvaluationScore;
private int ideaEvaluationScore;
private String letterEvaluation;
private int totalScore;
private LocalDateTime rated = LocalDateTime.now();
}
서비스
@Service
@RequiredArgsConstructor
public class ReviewService {
private final ReviewRepository reviewRepository;
public void writeReview(ReviewVO reviewVO) {
Review review = new Review();
review.setName(review.getName());
review.setDesignEvaluationScore(reviewVO.getDesign_evaluation_score());
review.setIdeaEvaluationScore(reviewVO.getIdea_evaluation_score());
review.setLetterEvaluation(reviewVO.getLetter_evaluation());
review.setTotalScore(reviewVO.getTotal_score());
reviewRepository.save(review);
}
}
리뷰서비스에서 VO를 받아 setter 함수를 사용해서 Review 객체를 하나하나 세팅해주고 repository에 save를 요청한다.
리팩토링 코드
도메인
public static Review updateReview(String name, int totalScore, int designEvaluationScore,
int ideaEvaluationScore, String letterEvaluation) {
if (StringUtils.isBlank(name))
throw new IllegalArgumentException("name 은 빈값이 될 수 없습니다: " + name);
return Review.builder()
.name(name)
.designEvaluationScore(designEvaluationScore)
.ideaEvaluationScore(ideaEvaluationScore)
.letterEvaluation(letterEvaluation)
.rated(LocalDateTime.now())
.totalScore(totalScore)
.build();
}
서비스
@Service
@RequiredArgsConstructor
public class ReviewService {
private final ReviewRepository reviewRepository;
public void writeReview(ReviewVO reviewVO) {
var review = Review.updateReview(
reviewVO.getName(),
reviewVO.getTotal_score(),
reviewVO.getDesign_evaluation_score(),
reviewVO.getIdea_evaluation_score(),
reviewVO.getLetter_evaluation());
reviewRepository.save(review);
}
}
도메인에 리뷰를 추가하는 메서드를 만들고 예외처리를 한다.
도메인에 VO를 직접 넘기지 않는 이유는 도메인은 항상 순수해야한다.
도메인에서 VO를 매개변수로 받아서 getter와 setter를 사용하면 순수해야하는 도메인이 vo를 참조하게된다.
'Spring > Spring Boot' 카테고리의 다른 글
Effective Java를 읽으며 코드 리펙토링 (0) | 2022.10.08 |
---|---|
[Spring Boot] 요청, 응답 시 Json에 루트 추가하기 (0) | 2022.09.24 |
[학교 관리 프로젝트] 도메인 단위 테스트와 테스트 코드를 가독성있고 빠르게 작성하는 방법 (0) | 2022.08.31 |
[게시판 RESTful API] - RestController와 Service를 구현해보자 (3) (0) | 2022.08.20 |
[게시판 RESTful API] - domain을 만들며 Entity를 알아보자. (2) (0) | 2022.08.20 |