불변객체사용하라 - 책 예시 코드 구현 (식별자 가변성)
2022. 6. 9. 22:28
책
가변객체의 위험성 -> 식별자 가변성 말그대로 식별자로서 사용되는 객체가 (가변객체이기 때문에) 변경되는 것이 허용되어있게 되는 것이고 , 이로 인해 예측하지 못한 일들이 벌어진다는 것이다. Cash 타입의 객체들은 "값 객체" 처럼 생각하고 작성하였다. private class Cash { private int cash; public Cash(int cash) { this.cash = cash; } public void setCash(int cash) { this.cash = cash; } public void mul(int operand) { this.cash *= operand; } @Override public boolean equals(Object o) { if (this == o) return..
[elegant]ch02_ ~ 2.6.4
2022. 6. 9. 01:24
책/엘레강트 오브젝트
가능하면 적게 캡슐화 객체는 함께 동작하는 객체들의 집합체 이기 때문에, 객체에는 캡슐화된 객체들이 있어야 한다 . 객체는 상태(내부의 객체)를 이용해 식별되어야 하는데, Java 에서는 껍질(==이나 Object 클래스의 기본적인 equals() 정의를 생각해보면 된다 ) 로 비교하고 있어 결함이 존재한다는 얘기를 하고 있다. 책에서 “상태로 객체를 식별" 한다는 것은 값객체에 대한 말인가? 엔티티와 값객체를 구분하면서 쓰여진 것인지 그 의도가 분명하지 않다는 생각이 들었다. 객체에 너무 많은 상태가 존재하는 것 보다는, 일부 상태를 캡슐화한 이루어져야 한다. 그 이유는 너무 많은 상태를 가진 객체는 인간의 인지적 한계로 이해하기 어렵기 때문이다. 상태를 객체들로 쪼개놓으면, 개별적인 객체들을 이해하기..
Self-invocation 과 @Transactional
2022. 6. 6. 03:03
Spring
로그인을 구현하지 않았기 때문에 게시글을 작성하는 작성자에 대한 writerId 를 전달 받아와야만 한다. writerId 를 받아와 게시글을 작성하는 서비스 메소드 뿐만 아니라, 후에 로그인 구현을 할 것을 생각하고 ( 이게 잘못되었던 걸까..) Writer 를 인자로 받는 메소드 또한 정의해 놓았다. 컨트롤러에서부터 Authentication 이라던가 Authmember 라던가 LoginMember 라던가 User 객체를 받아올 것으로 생각 했다. 그래서 이 메소드를 내부적으로 호출하도록 하였는데 여기서 @Transactional 과 this…() 에 대한 지적을 받았다 @Transactional public PostDto.PostInfo store(String title, User writer, S..
[elegant] 1. Birth 와 관련 자료 발표 영상
2022. 6. 5. 16:29
책/엘레강트 오브젝트
이 책은 객체가 살아있는 생명체인 것 처럼 표현한다. 객체가 태어나고 학습하고 취업하고 은퇴한다는.. 일종의 객체의 생명주기? 로 컨텐츠를 설명하고 있다. 그 중 첫 번째 챕터인 Birth 내용을 정리한다 +++(추가) 교육을 수강하며 ch01 과 관련하여 발표했던 자료가 있어 첨부한다 https://present.do/documents/62dd647c85df05656ca15627?page=0 객체의 가시성 객체의 가시성? 숫자 5 는 extra 라는 Cash 타입 객체 의 내부에 캡슐화 되어있다.반면 외부세계는, extra 객체가 어떻게 캡슐화 되어 있는가에 따라 extra 내부에 존재하는 5 를 직접적으로 볼 수도, 간접적으로 볼 수도 있을 것이다. if(price < 100){ Cash extra ..
[Java] ImmutableCollection 과 UnmodifiableCollection 과 Immutability
2022. 5. 31. 01:32
Java
테스트 코드를 작성할 때면 List.of 를 무지성으로 사용하고는 했었다. 해당 정적팩토리 메소드를 통해 리턴되는 리스트는 불변 객체라고는 알고 있었지만, 어떤 의미에서의 불변인지.. 해당 컬렉션에 담겨있는 element는 변경이 가능한 것 같은데 왜 Immutable 이라는 이름이 붙어있는지 궁금해졌다. 그래서 교육 방학 첫날(?) release note 를 통해 알아보았다 ImmutableCollection @jdk.internal.ValueBased static abstract class AbstractImmutableCollection extends AbstractCollection { // all mutating methods throw UnsupportedOperationException @O..
[JPA]EntityManager merge와 persist
2022. 5. 10. 15:28
JPA
JPA 강의 듣고 공부하면서 velog 에 썻던 글이길래 티스토리에 복붙 + 그 때는 사실 그래서 이 차이가 어떤 결과를 낳는데? 라고 생각하며 사실상 글 번역 정도였었어서 몇가지를 더 추가했다. 무려 12년 전 글이다. - JPA EntityManager: Why use persist() over merge()? 상황 JpaRepository를 extend하는 UserRepsoitory interface를 생성하였다. 해당 repository를 사용하여 save 하면, 기존에 존재하던 object의 경우, 데이터를 update하고, 새로운 것일 경우 insert하는 것을 확인했다. SimpleJpaRepository.class 라는 클래스를 살펴보면, save() method에서는 em.persist(..
[Java] 주어진 배열에서 특정 값을 갖는 index 찾기 (stream) (참조글 읽어보기)
2022. 3. 8. 11:32
Java
g라는 int형 배열에서 g[idx] 값이 0인 idx 를 "루트노드" 라고 하고, 이 루트노드를 찾는 상황이라고 가정. 이제까지 for문을 사용해 탐색해왔는데 요즘도 이렇게 하나? 라는 생각이 들었다. python에서 range 사용하는 것 처럼 할 수는 없을까? stream에 있을 것 같은데..라고 생각하며 찾아보았다. IntStream 이라는 것은 처음 사용해보았다. public static int findRoot(int[] g){ return IntStream.range(0, g.length) .filter(i -> g[i] == 0) .findAny().getAsInt(); } 물론 findAny() 는 Optional을 리턴하기 때문에 Optional로 리턴하게 하여, null인 경우에 대한 ..