최신 포스트
- 내 코드가 그렇게 이상한가요? 클래스 설계 원칙 - 내 코드가 그렇게 이상한가요? 3장 요약 클래스 설계 시 지켜야할 법칙1. 클래스 하나로도 잘 동작할 수 있게 설계해야 한다.2. 세팅 없이 바로 사용할 수 있어야 한다. 잘 만든 클래스의 구성요소1. 지역변수2. 지역변수에 잘못된 값이 할당되지 않게 막는 메서드 잘 만든 클래스의 특징1. 지역변수가 불변(immutable)이다.2. 생성자에서 유효성 검사를 한다.3. 자기 자신에 대한 계산은 클래스가 스스로 한다.4. 매개변수도 불변(immutable)이다.5. 매개변수로 원시형보다는 값 객체를 사용한다. 잘 만든 클래스 특징 상세 설명 1 - 지역 변수가 불변(immutable)이다.public class Money { final int amount; final Currency currency;} 잘 만든 클래스 특징 상..
- 도메인 주도 설계 철저 입문 애그리게이트란 - 「도메인 주도 설계 철저 입문」 12장 (1) 애그리게이트란? 애그리게이트는 변경의 단위이다. 11장에서 프로그래밍했던 User나 Circle과 같은 객체가 바로 애그리게이트이다. 출처 :「도메인 주도 설계 철저 입문」 애그리게이트의 특징애그리게이트는 경계와 루트를 갖는다. 애그리게이트의 경계는 애그리게이트에 포함되는 대상을 결정하는 경계이고, 애그리게이트의 루트는 애그리게이트에 포함되는 특정 객체다. 외부에서 애그리게이트를 다루는 조작은 모두 루트를 거쳐야 한다. 변경은 애그리게이트 루트를 통해서만 - 예시 (1) UserUser 애그리게이트의 루트는 User 클래스이다. 따라서 사용자명 변경도 루트인 User에 요청하는 형태여야 한다.이를 위해서 `changeName`과 같은 메소드를 만들면 null 체크 등과 같은 유효성 검사를 할 수 있..
- 웹 ORM 사용 이유와 장점 첫째, SQL 안써도 됨OOP와 RDB 간의 패러다임 불일치 때문에 생기는 여러 부작용 중에 하나가 SQL을 앱에서 직접 써줘야 한다는 것이다. ORM은 클래스와 관계형 DB 테이블을 매핑해주는 접근 방식 혹은 프레임워크로서, 개발자 대신 SQL을 작성해주는 역할도 한다. 둘째, 객체의 정보가 온전히 유지됨 자바 앱은 OOP를 지향하므로, 처음부터 끝까지 현실 세계에 존재하는 객체처럼 데이터를 다룰 수 있어야 한다. 예를 들어서 "상품(Product)"이라는 부모를 가지는 "책(Book)"은 앱 내에서는 처음부터 끝까지 부모가 있는 객체로서 다루어져야 한다. 그러나 DB에서 Select를 할 때 개발자가 부모에 해당하는 데이터를 같이 select 해오지 않으면 해당 객체는 앱에서만큼은 부모가 없는 것처..
- 도메인 주도 설계 철저 입문 도메인 규칙을 코드로 제대로 표현하는 법 - 「도메인 주도 설계 철저 입문」 11장 (4) 말과 코드를 일치 시키기"써클 정원은 30명이다"라는 도메인 규칙은 다음과 같이 표현하는 것이 바람직하다. 규칙에 나오는 "30"이라는 숫자를 코드에 그대로 사용하는 것이다. // 바람직한 예 : 말과 코드가 일치한다.if (member.size() >= 30) { throw new IllegalStateException("정원 초과");} 만약 다음과 같이 말과 코드가 불일치 하게 되면 여러가지 문제가 생긴다. if (member.size() > 29) { throw new IllegalStateException("정원 초과");} 1. `30`으로 코드 전역 검색을 했을 때 코드가 나오지 않음2. 누군가 말과 다른 코드를 보고 오류라고 생각해서 29를 30으로 고칠 우려가 있음 규칙을 도..
- 도메인 주도 설계 철저 입문 테스트 커버리지 높이는 법 - 「도메인 주도 설계 철저 입문」 11장 (3) jacoco 플러그인 세팅`build.gradle` 파일에 다음과 같은 내용들을 추가한다. plugins { id 'jacoco'}tasks.named('test') { finalizedBy(jacocoTestReport)}jacoco { toolVersion = "0.8.12"}test { useJUnitPlatform() finalizedBy jacocoTestReport}jacocoTestReport { dependsOn test reports { xml.required = false csv.required = false html.outputLocation = layout.buildDirectory.dir('jacocoHtm..