개발자가 말대꾸?
봄 백엔드 개발일기
개발자가 말대꾸?
전체 방문자
오늘
어제
  • 분류 전체보기 (42)
    • 알고리즘 공부 (13)
    • 디자인 패턴 공부 (1)
    • Spring (15)
      • Spring Boot (12)
      • Spring Data (1)
      • Spring Security (1)
    • Java (2)
    • MySQL (5)
    • EDITOR (3)
      • Intellij (3)
      • vscode (0)
    • 기타 (3)
      • 에러 (3)
      • 감상문 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • SpringBoot
  • rest-api
  • JPA Unique 제약조건
  • 인텔리제이 좋은점
  • 라이브 템플릿
  • Java
  • BasicAuthenticationFilter
  • 프로그래머스 2단계
  • JPA
  • intellij live templates
  • IntelliJ
  • 인텔리제이 사용법
  • spring
  • mysql
  • UserDetails 도메인
  • spring boot
  • Jpa 다중 제약조건 설정
  • 권한 프로그래밍
  • BasicAuthorization
  • jsp
  • JPA 여러 컬럼 유니크
  • GrantedAuthority
  • intelliJ 단축키
  • Python
  • SpringSecurity 프로젝트
  • MSA 아키텍처에서 Config Server의 변경 사항을 MSA에게 전달하는 방법
  • 코드 템플릿
  • RabbitMQ Kafka 차이
  • 프로그래머스
  • JPA 여러 컬럼 Unique

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자가 말대꾸?

봄 백엔드 개발일기

Spring/Spring Boot

객체지향의 사실과 오해를 읽으며 코드 리팩토링

2022. 9. 19. 14:38

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
    'Spring/Spring Boot' 카테고리의 다른 글
    • Effective Java를 읽으며 코드 리펙토링
    • [Spring Boot] 요청, 응답 시 Json에 루트 추가하기
    • [학교 관리 프로젝트] 도메인 단위 테스트와 테스트 코드를 가독성있고 빠르게 작성하는 방법
    • [게시판 RESTful API] - RestController와 Service를 구현해보자 (3)
    개발자가 말대꾸?
    개발자가 말대꾸?
    - ing9990.com - 열정적인 ENTP - 주말 코딩, 퇴근 코딩 ing9990

    티스토리툴바