본문 바로가기

전체글236

[스프링 핵심 원리 - 기본편] 관심사의 분리 로미오와 줄리엣 공연을 하면 로미오 역할을 누가 할지 줄리엣 역할을 누가 할지는 배우들이 정하는게 아닙니다. 이전 코드는 마치 로미오 역할(인터페이스)를 하는 레오나르도 디카프리오(구현체, 배우)가 줄리엣 역할(인터페이스)을 하는 여자 주인공(구현체, 배우)을 직접 초빙하는 것과 같습니다. 디카프리오는 공연도 해야하고 동시에 여자 주인공도 공연에 직접 초빙해야 하는 다양한 책임을 가지고 있습니다. 관심사 분리 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 합니다. 디카프리오는 어떤 여자 주인공이 선택되더라도 똑같이 공연을 할 수가 있어야 합니다. 공연을 구성하고, 담당 배우를 섭외하고, 역할에 맞는 배우를 지정하는 책임을 담당하는 별도의 공연 기획자가 나올시점입니다. 공연 기획자를 만들고, 배우와.. 2021. 9. 9.
[스프링 핵심 원리 - 기본편] 새로운 할인 정책 적용과 문제점 할인 정책을 애플리케이션에 적용 할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 합니다. 문제점 발견 우리는 역할과 구현을 충실하게 분리했습니다. => OK 다형성도 활용하고, 인터페이스와 구현 객체를 분리했습니다. => OK OCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했습니다. => 그렇게 보이지만 사실은 아닙니다. DIP: DIP를 지킨 것 같지만 추상(인터페이스) 뿐만 아니라 구체(구현) 클래스에도 의존하고 있습니다. 추상(인터페이스) 의존: DiscountPolicy 구체(구현) 클래스: FixDiscountPolicy, RateDiscountPolicy OCP: 지금 코드는 기능을 확장해서 변경하면, 클라이언트 코드에 영향을 줍니다. 따라서 OCP를 위.. 2021. 9. 9.
[테스트] Mockito를 사용하여 단위 테스트하기 저 같은 경우 비즈니스 로직을 테스트 할 때는 통합 테스트를 하지 않고 단위 테스트를 진행합니다. 이 때 Service 클래스는 Repository 계층 또는 외부 API 등을 의존하고 있기 때문에 Mockito를 이용하여 이들을 Mocking 해주어야 합니다. Service 코드 /** * 외부채널 추가 연동 */ @Transactional public BranchChannelOpenResponseDto openBranchChannel(BranchChannelOpenRequestDto requestDto) { // BranchChannelId 생성(복합키) BranchChannelId branchChannelId = BranchChannelId.create(requestDto); // BranchCha.. 2021. 9. 9.
[사용자 수에 따른 규모 확장성] 로그, 메트릭 그리고 자동화 웹 사이트와 함께 사업 규모가 커지고 나면, 로그나 매트릭(metric), 자동화(automation) 같은 도구에 필수적으로 투자해야 합니다. 로그: 에러 로그를 모니터링하는 것은 중요합니다. 시스템의 오류와 문제들을 보다 쉽게 찾아낼 수 있도록 하기 때문입니다. 에러 로그는 서버 단위로 모니터링 할 수도 있지만, 로그를 단일 서비스로 모아주는 도구를 활용하면 더 편리하게 검색하고 조회할 수 있습니다. 메트릭: 메트릭을 잘 수집하면 사업 현황에 관한 유용한 정보를 얻을 수도 있고, 시스템의 현재 상태를 손쉽게 파악할 수도 있습니다. 메트릭 가운데 특히 유용한 것을 몇 가지 살펴보면 다음과 같습니다. 호스트 단위 메트릭: CPU, 메모리, 디스크 I/O에 관한 메트릭이 여기 해당합니다. 종합(aggreg.. 2021. 9. 9.