JPA 프로그밍 기본 편 : 값 타입과 불변 객체
임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 side effect가 발생할 수 있다.
두 개의 엔티티에서 동일한 값 타입을 참조하게 되면, 하나의 엔티티에 해당하는 값 객체 값을 변경하면 나머지 하나의 객체에 영향을 미치게 된다.
Address address = new Address("city", "address", "1000");
Member merber1 = new Memeber("name1", address);
Member merber2 = new Memeber("name2", address);
member1.getAddress().setCity("city1"); // member2의 city값도 같이 변경된다.
그 이유는 당연하게도 자바에서 객체는 참조값을 복하기 때문이다.
Address a1 = new Address();
Address a2 = a1; // 참조값 전달
따라서 값 객체의 경우에는 불변 객체(immutable object)로 설계해야 한다.
그렇게 하려면 생성자로만 값을 설정하고 수정자를 만들지 않으면 된다.
ex) String, Ingeger..
값을 변경할고 싶을 때는 새로운 인스턴스를 만들어서 저장하면 된다.
Address address = new Address("city", "address", "1000");
Member merber1 = new Memeber("name1", address);
Member merber2 = new Memeber("name2", address);
member1.setAddress( new Address("city1", "address", "1000")); // m1만 변경된다.
클린 아키텍처 7장 : 단일 책임 원칙(SRP)
함수는 반드시 하의 일만 해야 한다는 것은 SRP 원칙이 아니다.
SRP는 단일 모듈은 변경의 이유가 오직 하나뿐이어야 한다.
종종 이름만 보고 함수가 한 가지 일만 해야 한다고 생각하는 경우가 있는데 이는 잘못된 상식이다.
사용자 입장에서 변경하는 이유가 하나여야 한다는 게 좋은 표현이라고 생각한다.
변경을 원하는 집단은 actor라고 한다.
실무에서는 주로 요청하는 팀이 될 수도 있고, 코드 레벨에서는 응집성을 기반으로 나뉘는 코드이다.
클린 아키텍처 8장 : 개방-폐쇄 원칙(OCP)
확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
코드를 추가할 때 다른 영역에 영향이 가지 않도록 쉽게 추가할 수 있어야하고, 코드를 수정할 때 다른 영역에 영향을 주면 안 된다는 뜻이다.
이렇게 하기 위해서는 제어의 역전을 이용하고, 의존성의 방향을 단방향으로 만들어 저수준이 고수준에 영향을 미치지 못하도록 해야 한다.
'TIL' 카테고리의 다른 글
2022/02/05 TIL (0) | 2022.02.05 |
---|---|
2022/02/04 TIL (JAVA8) (0) | 2022.02.05 |
2022/02/02 TIL (0) | 2022.02.03 |
2022/02/01 TIL (0) | 2022.02.02 |
2022/01/31 TIL (0) | 2022.01.31 |