오블완15 1장 도메인 모델 시작하기 1.1 도메인이란?개발자 입장에서 바라보면 온라인 서점은 구현해야 할 소프트웨어의 대상이 된다. 온라인 서점은 책을 판매하는 데 필요한 상품 조회, 구매, 결제, 배송 추적 등 기능을 제공해야 한다. 이때 온라인 서점은 소프트웨어로 해결하고자 하는 문제 영역, 즉 도메인에 해당한다. 예로 온라인 서점 도메인은 몇 개의 하위 도메인으로 나눌 수 있다. 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라진다. 1.2 도메인 전문가와 개발자 간 지식 공유코딩에 앞서 요구사항을 올바르게 이해하는 것이 중요하다. 간단한 방법으로 개발자와 전문가가 직접 대화하는 것이다. 도메인 전문가만큼은 아니겠지만 이해관계자와 개발자도 도메인 지식을 갖춰야 한다. 전문가나 관련자가 요구한 내용이 항상 올바른 것은 아니며,.. 2024. 11. 27. 5장 반복문 정리중 2024. 11. 24. 4장 집약과 자르기 정리중 2024. 11. 23. 3장 SQL의 조건 분기 2장에서는 조건 분기를 할 때 CASE 식을 설명했죠. 사실 이외에도 사용할 수 있는 구문이 있습니다. 바로 UNION입니다. 하지만 이는 좋은 일이 아닙니다. UNION은 조건 분기를 위해 만들어진 것이 아니기 때문입니다. 많은 사람들이 어떻게 작동할지 쉽게 예측할 수 있다는 이유로 사용하는데, 이번 장에서는 UNION을 사용하지 않고 CASE 방식이라는 SQL의 원래 조건 분기 기능을 몸에 밸 수 있게 하는 것이 목표입니다. 8강 UNION을 사용한 쓸데없이 긴 표현UNION 방식은 성능적인 측면에서 단점을 가지고 있습니다. 외부적으로는 하나의 SQL 구문을 실행하는 것처럼 보이지만, 내부적으로는 여러 개의 SELECT 구문을 실행하는 실행 계획으로 해석되기 때문이죠. 테이블에 접근하는 횟수가 많아.. 2024. 11. 22. 2장 SQL 기초 데이터베이스 이용 시 핵심이 되는 처리가 바로 검색입니다. 데이터가 저장되어 있는 테이블에서 필요한 데이터를 뽑아내는 것인데, 질의(query)라던지 추출(retrieve)이라고 부릅니다. 이를 SELECT 구문이라고 부르고, 문자 그대로 선택한다는 것인데요. SELECT 구문은 2개의 부분으로 구성되어 있습니다. 6장 SELECT 구문6.1 SELECT 구와 FROM 구첫 번째는 SELECT 뒤에 나열되어 있는 부분으로, SELECT 구라고 부릅니다. 데이터베이스에서 검색할 때 반드시 입력되어야 하는 부분입니다. 테이블이 갖고 있는 필드라면 쉼표로 연결해 여러 개 쓸 수 있습니다. 두 번째 부분은 'FROM [테이블 이름]'으로 FROM 구라고 부르며, 데이터를 선택할 대상 테이블을 지정합니다. 반드시.. 2024. 11. 21. 17. 테스트와 개발 방법론 完 TDD는 소프트웨어 개발 방법론 중 하나로, 개발자가 코드를 작성하기 전에 해당 코드의 테스트 케이스를 먼저 작성하게 한 후 해당 테스트를 통과할 수 있는 코드를 작성하는 방식으로 소프트웨어를 개발합니다. 여기서 파생한 개념으로 BDD가 있습니다. BDD는 소프트웨어 개발 과정에서 비즈니스 요구사항과 소프트웨어의 행동을 강조하는 개발 방법론입니다. 개발자는 비즈니스 의도를 명확하게 이해해야 하고, 스펙을 테스트 가능한 형태로 작성할 수 있어야 합니다. 개발팀과 비즈니스팀 간의 빈번한 의사소통 강조, 테스트 케이스 명세 시 Given-When-Then 같은 자연어로 구성된 시나리오를 사용하는 것을 권장합니다. TDD, BDD는 코드의 안정성과 유연성을 높여 소프트웨어의 품질을 향상할 수 있는 가장 현대적인.. 2024. 11. 20. 16장 테스트와 설계 테스트와 소프트웨어 설계는 긴밀한 상관관계를 맺습니다. 상호보완적이죠. 당연한 이유는 좋은 소프트웨어 설계와 테스트가 추구하는 목표가 일정 부분 같기 때문입니다. 즉, 테스트가 추구하는 가치와 좋은 설계가 추구하는 가치에 일정 부분 교집합이 있는 것입니다. 좋은 설계는 시스템이 모듈로 분해되고, 각 모듈이 독립적으로 개발될 수 있게 하는 것을 추구합니다. 유연하게 확장될 수 있는 것을 추구하죠. 확장할 수 있는 시스템이란 다양한 기능을 제공할 수 있다는 의미도 있지만, 다양한 환경에도 이식할 수 있는 시스템이라는 뜻이기도 하죠. 16.1 테스트와 SRP, ISPUserService 컴포넌트의 login, Register 메서드를 분리하는 것이 맞을까요? SRP 관점에서 컴포넌트를 사용하려는 주체가 시스.. 2024. 11. 19. 15. 테스트 가능성 12장 '자동 테스트'에서는 테스트가 필요한 이유가 무엇인지 얘기했습니다. 테스트가 중요한 이유로 '회귀 버그 방지'였습니다. 하지만 실제로 테스트는 추가로 이점을 제공합니다. 예로, 테스트를 이용하면 전체 시스템의 품질을 향상할 수 있습니다. 테스트가 품질을 보증할 수 있어도, 품질을 개선해줄 수 없을 것 같다고 생각할 수 있죠. 테스트는 이미 만들어진 코드에 추가로 더 작성되는 요소이기 때문입니다. 테스트 자체는 수단에 불과합니다. 테스트를 '개발이 완료된 후 작성하는 것'이 아니라 '개발 전 미리 작성하는 것', '개발을 하면서 함께 작성하는 것'으로 보면 이야기가 달라지죠. 개발자는 어떻게 테스트를 작성하면 쉽게 작성할 수 있을지 고민함으로써 코드의 품질을 높일 수 있습니다. 테스트를 '좋은 설계.. 2024. 11. 18. 14. 테스트 대역 테스트 대역에서 말하는 대역은 대역폭 같은 것이 아닙니다. 말 그대로 영화에 나오는 스턴트맨, '대역' 그 자체를 의미하죠. 즉, 오롯이 테스트를 위해 만들어진 가짜 객체나 컴포넌트를 가리키는 용어입니다. 실제 객체를 대신해서 행동하고 실제 객체가 하지 못하는 일을 대신합니다. 예로 메서드를 호출한 결과로 제대로 된 상태 값이 반영됐는지만 확인하고 싶습니다. 테스트를 실행할 때마다 메일이 실제로 발송되지 않았으면 한다고 가정하죠. 이럴 때 테스트 대역을 사용할 수 있습니다. 메일을 발송하는 컴포넌트인 VerificationEmailSender 대역을 만들고 테스트할 때 UserService가 이를 사용하게 만든다고 생각해 봅시다. DummyVerificationEmailSender 컴포넌트가 대역처럼 동.. 2024. 11. 17. [12-17 하] 12. 자동 테스트 & 13. 테스트 피라미드 소프트웨어 공학에서 말하는 테스트는 소프트웨어의 품질과 기능을 확인하고, 버그를 찾아내는 과정을 말합니다. 크게 2가지로 분류하는데, 수동 테스트와 자동 테스트가 있습니다. 수동 테스트는 테스트 담당자가 소프트웨어를 직접 실행해보고 각각의 기능을 평가하여 구현된 기능이 요구사항에 부합하는지 검증하는 과정을 말합니다. 사용자 관점에서 소프트웨어를 다양한 시나리오를 토대로 실행하여, 검증 과정에서 사용자 경험을 직접 평가할 수 있죠. 자동 테스트는 테스트 스크립트, 도구를 사용해 자동으로 테스트하는 과정을 말합니다. 12. 자동 테스트인수 테스트란 무엇일까요? 시스템이 비즈니스 요구사항을 만족해서 소유권을 넘기기 전에 수행하는 테스트 단계를 뜻합니다. 시스템을 인수하기 전에 시스템이 비즈니스 요구사항과 .. 2024. 11. 15. 9. 모듈 9.1 모듈성모듈이란 무엇일까요? 소프트웨어 공학에서 모듈은 프로그램의 기본 구성 요소이면서 라이브러리를 포괄하는 조금 더 큰 규모의 용어입니다. 즉 모듈이란 라이브러리와 프로그램의 구성 요소 사이에 위치하는 개념입니다. 하지만 이는 좀 모호한데 더 구체적으로는 독립성과 은닉성을 만족하며 연관된 코드들의 묶음입니다.1) 독립성 : 모듈은 독립적이어야 한다.2) 은닉성 : 모듈의 사용자는 모듈의 내부 구현을 몰라도 된다. 공개된 인터페이스를 이용해 모듈과 통신한다. 이때 독립성과 은닉성 같은 특성을 모듈성이라고 부릅니다. 즉 연관된 코드 묶음은 모듈성을 만족할 때 모듈이 될 수 있습니다. 모듈 시스템이란 연관된 코드 묶음이 '모듈성'을 갖출 수 있게 도와주는 시스템적인 해결책입니다. 그래서 다음과 같은 기.. 2024. 11. 13. 7. 서비스 서비스의 역할은 크게 3가지 종류의 일을 해야 합니다.1) 도메인 객체를 불러옵니다.2) 도메인 객체나 도메인 서비스에 일을 위임합니다.3) 도메인 객체의 변경 사항을 저장합니다. 7.1 Manager스프링에서 서비스는 왜 서비스라고 부를까요? 컨트롤러는 '제어부', 리포지터리는 '저장소', 컴포넌트는 '구성 요소'입니다. 서비스는 '비즈니스 서비스를 처리하는 곳입니다'라는 답변은 충분한 답변이 되지 못합니다. @Service 애너테이션이 적힌 주석을 보면, 답이 나오죠.1) @Service는 에릭 에반스의 DDD에서 영감을 받아 만들어진 애너테이션입니다.2) 서비스는 J2EE 패턴 중 하나인 비즈니스 서비스 파사드처럼 사용될 수 있다. 스프링 서비스는 DDD에서 파생된 개념이라고 합니다. 이제 DDD를.. 2024. 11. 12. 8. 레이어드 아키텍처 8.1 레이어드 아키텍처의 최소 조건레이어드 아키텍처는 애플리케이션을 레이어로 나누고, 각 레이어에 역할을 정합니다. 꼭 유념해야 할 사실이 하나 있는데, 여러 개발자의 필요에 의해 발전된 아키텍처입니다. 레이어드 아키텍처에서 중요한 것은 레이어 유형을 외우고, 그에 맞게 컴포넌트를 배치 하는 것이 아니라 아래와 같은 사항을 지키는 것이죠.1) 레이어 구조를 사용한다.2) 레이어 간 의존 방향은 단방향으로 유지한다.3) 레이어 간 통신은 인접한 레이어에서만 이뤄지게 한다. 위 2), 3) 같은 제약 즉, 레이어 '구조'에 제약을 더했더니 '아키텍처'가 됐다는 의미입니다. 그래서 '아키텍처'가 뭘까요? 명확한 답은 없지만 아키텍트들이 아키텍처를 설명할 때 공통으로 말하는 내용을 취합해 아키텍처란 무엇인지를.. 2024. 11. 10. [6-11 중] 6. 안티패턴 Spring framework는 자바 기반의 오픈 소스 애플리케이션 프레임워크로서 J2EE 환경에서 시스템 개발을 쉽게 하고 유지보수성을 높이기 위해 개발됐죠. 스프링 이전에 사용하던 J2EE의 EJB는 엔터프라이즈 환경에서 안정성과 확장성을 제공하는 훌륭한 기술 스택이었지만 그만큼 무겁고 사용하기 어려워 비효율적이었습니다. 더불어 EJB는 EJB의 핵심 기술인 컨테이너 기술이 EJB의 제공 업체마다 구현이 달랐고, 그로 인해 사용하는 프로그램 자체가 특정 Vendor의 기술에 종속되는 문제가 발생할 수 있었죠. 스프링은 이러한 한계와 극복을 달성하기 위해 개발됐습니다. 경량화된 구조, 간소화된 설정, 제어 역전, 자동화된 의존성 주입 등 기능을 제공함으로써 EJB 단점을 해결했죠. 하지만 누구나 쉽게 .. 2024. 11. 9. 4. SOLID 4.1.3 리스코프 치환 원칙LSP -> '기본 클래스의 계약을 파생 클래스가 제대로 치환할 수 있는지 확인하라'라는 말은 파생 클래스가 기본 클래스의 모든 동작을 완전히 대체할 수 있어야 합니다. 파생 클래스가 기본 클래스에 할당된 의도와 계약이 무엇이니를 먼저 파악할 수 있어야 합니다. 원시적으로는 코드 작성자에게 직접 물어보기가 있지만, 명백한 한계가 있기에, 불필요한 커뮤니케이션 비용을 발생시킵니다. 이는 그리 선호하는 방법이 아니고, 세련된 방법으로 테스트 코드를 사용하는 것입니다. 초기 코드 작성자가 생각하는 모든 의도를 테스트 코드로 만들어 두는 것입니다. 그렇게 된다면, 파생 클래스를 작성하는 개발자는 테스트를 보고, 초기 코드 작성자의 의도를 파악할 수 있을 것이고, 기본 클래스로 작성된.. 2024. 11. 9. 이전 1 다음