전체 글

척척석사

    [도메인 주도 설계 철저 입문] 5. 레파지토리 - 데이터와 관계된 처리를 분리하자

    [도메인 주도 설계 철저 입문] 5. 레파지토리 - 데이터와 관계된 처리를 분리하자

    프로그램을 실행할 때, 메모리에 로드된 데이터는 프로그램을 종료하면 그대로 사라져버린다. 특히 엔티티는 생애주기를 갖는 개체이기 때문에 프로그램의 종료와 함께 사라지면 안된다. 이를 위해서는 데이터를 데이터스토어에 저장하고 불러올 수 있어야한다. 데이터스토어로부터 불러오고, 저장하는 등의 행위를 추상화한 객체가 레파지토리 객체이다. 레파지토리의 역할과 책임 이 레파지토리 객체는 도메인 개념으로부터 유래한 것이 아니라, 기술적 문제를 해결하기 위해 탄생한 객체이다. 따라서 도메인을 잘 서술한 코드를 헤집어놓지 않으면서, 기술적 코드를 잘 분리해는 역할을 담당한다고 볼 수 있다. 특히 특정 db 에 의존적일 수 밖에 없는데, 이 때문에 더 다루기 까다롭게 되는 코드가 되어버릴 때가 많다. 그래서 레파지토리 ..

    [도메인 주도 설계 철저 입문] 4. 도메인 서비스 - 부자연스러운 도메인 객체의 행동을 맡기자

    [도메인 주도 설계 철저 입문] 4. 도메인 서비스 - 부자연스러운 도메인 객체의 행동을 맡기자

    값 객체나, 엔티티 같은 도메인 객체에는 객체의 행동읠 정의할 수 있다. 예를 들어 사용장명으로 사욯라 수 잇는 문자열의 길이나 문자의 종류에 제한이 있다며 ㄴㅇ이런한 지식은 사용자명을 나타내는 값 객체에 정의할 수 있다. 근데 시스템에는 도메인 객체로 구현하기 어색한 행동도 있다. 도메인 서비스는 이런 어색함을 해결해주는 객체다. 예를 들어 사용자 이름 중복 여부 기능을 추가한다고 하자. 이 코드를 User 라는 도메인 객체에 추가하게 된다면 아래와 같이 할 수 있다. class User { private UserId id; private UserName name; public User(Integer id, String name) { if (Objects.isNull(id) || Objects.isNu..

    [도메인 주도 설계 철저 입문] 3. 엔티티 - 생애주기를 갖는 객체

    [도메인 주도 설계 철저 입문] 3. 엔티티 - 생애주기를 갖는 객체

    도메인 주도 개발에서 말하는 엔티티는 도메인 모델을 구현한 도메인 객체를 의미한다. 이전 장에서 다뤘던 값 객체도 도메인 객체를 의미한다. 값 객체와 엔티티의 차이점 값 객체와 엔티티의 차이점은 "동일성"을 식별할 수 있는지에 달려있다. 예를 들어 값 객체는 이름, 학년 등의 특정 성질을 띄는 값을 캡슐화한 것이라면, 엔티티는 회원을 예로 들 수 있다. 값 객체는 변하지 않는 값이고 (수정이 아닌 새로 생성, premitive type 을 예로 들면 쉬울 듯) 엔티티는 수정 가능하다. 또 속성이 같아도 다른 엔티티일 수 있는데 예로 같은 이름값이어도 다른 사람일 수 있는 것처럼 말이다. 따라서 엔티티를 식별할 수 있는 고유필드가 필요한데, 사람의 경우는 주민등록번호 등이 될 수 있다. 개발을 할 때, 이..

    [도메인 주도 설계 철저 입문] 2. "값 객체"의 개념 & 적용 예시

    [도메인 주도 설계 철저 입문] 2. "값 객체"의 개념 & 적용 예시

    흔히 프로그램을 작성하다보면, 사용자의 이름이나 나이 등을 원시타입(String, int) 등에 그대로 저장하는 경우가 있는데, 이런 경우에는 해당 값의 특성을 제대로 나타낼 수 없다. 이것은 여러 개발자가 함께 작업할 때 그 단점이 명확하게 나타나는데, 만약 String name 이라고 했을 때, 이름 값이 성과 이름을 포함하는 이름인지, 한국인 이름만 포함하는 이름인지 알 수 없기 때문에, db 를 조회해서 기존 data 가 어떤 식으로 저장되어 있는지 조회해야하는 등의 불편함이 있다. 따라서 원시타입을 그대로 사용하는 것이 아니라 해당 특성 값을 잘 나타낼 수 있도록 하면서, 동시에 유효성 검사도 진행할 수 있는 "값 객체"를 활용하는 것이 좋다. 값 객체를 도입했을 때의 장점 표현이 분명해진다. ..

    [도메인 주도 설계 철저 입문] 1. 도메인 주도 설계 읽게 된 이유

    [도메인 주도 설계 철저 입문] 1. 도메인 주도 설계 읽게 된 이유

    www.inhabas.com rest 개편 작업 중, 파일 업로드 및 다운로드에 관한 모듈을 따로 생성해야할 필요가 느껴졌다. 그러면서 프로젝트 구조에 관한 고민을 하게 됐다. (아래 글 참고) [Spring boot] 6. 멀티모듈? MSA? 좋은 아키텍쳐? 도대체 뭐야?! 프로젝트 구조 변경을 고민하게 된 배경이 몇가지 있다. (1) layer 는 구분이 가지만, 파일이 많아져서 해당 layer 안의 특정 도메인을 한눈에 찾기가 어려워지고 있다. 또 그렇다보니 어떤 도메인 letsmakemyselfprogrammer.tistory.com 기존에는 모노리식으로 작업하고 있었다. 물론 최대한 영역을 나누어, 의미상 모듈처럼 분리될 수 있도록 "최대한" 의존성을 나누며 작업하고 있었다. ​ 프로젝트 폴더 ..

    [Java의 정석] 05. 배열

    모르는 것만 짧고 빠르게 정리한 노트입니다. 1.2 배열의 선언과 생성 byte, short, int, long 타입 배열 : 0으로 초기화 char 타입 배열 : null('/u0000')로 초기화 float, double 타입 배열 : 0.0 으로 초기화 boolean : false 로 초기화 참조 타입 배열 : null 로 초기화 1.3 배열의 길이와 인덱스 - 배열은 한번 생성하면 길이를 변경할 수 없다. - 배열의 길이는 JVM 이 별도로 갖고 있다. - (배열이름).length 로 값을 읽을 수 있다. (상수이기 때문에 변경은 불가능하다.) 1.4 배열의 출력 - 배열 이름을 그대로 println 하게 되면, '배열타입@배열주소' 와 같이 출력된다. - 하지만 char[] 배열은 string ..

    [Java의 정석] 04. 조건문

    모르는 것만 짧고 빠르게 정리한 노트입니다. 2.1 enhanced for statement for (타입_변수명 : 배열_또는_컬렉션) { // do something } - read only, jdk 1.5 부터 추가됨. 2.6 이름 붙은 반복문 Loop1 : for (int i = 2; i

    [Java의 정석] 03. 연산자

    모르는 것만 짧고 빠르게 정리한 노트입니다. 1.4 연산자 우선순위 - instanceof 는 비교연산자 , = 와 우선순위가 동일하다. 1.5 일반 산술 변환 - 피연산자의 타입이 다르면, 더 큰 타입으로 자동 형변환된다. (overflow 방지) - 피연사자의 타입이 int 보다 작은 타입이면 int 로 변환된다. 3.1 사칙 연산자 - 상수 또는 리터럴 간의 연산은, 컴파일러가 최적화를 진행한다. char c1 = 'a' // char c2 = c1 + 1; // compile error! 명시적 형변환 필요! char c2 = 'a' + 1; // java complier 에 의해 'b'로 치환됨. 3.2 나머지 연산자 - 우항은 0이 될 수 없다. - 음수도 가능한데, 양수일 때와 절대값이 동일..