정적 멤버 클래스로 DTO 관리하기 최근 프로젝트 리팩토링을 진행하면서 DTO 클래스가 많아 관리에 어려움을 겪었다. 문제 상황 엔터티 속성 중 일부를 나타내는 VO 클래스에 새로운 속성이 추가됨 엔터티 변경에 따라 DTO 및 DTO assembler의 변경이 요구됨 많고 분산되어 있는 DTO, 가독성이 떨어지고 관리가 어려운 문제 발생 비슷하고 중복된 필드가 많아 실수도 잦음 수많은 DTO들 변경이 요구되는 파일을 모두 열어봐야 하는 상태 @Getter public class BoardResponseDto { private Long boardIdx; private User author; private String boardTitle; private String boardContents; private ..
로드리게즈 리스트 영화 감독 로버트 로드리게즈가 대학 시절 를 만들 때 생긴 말이다. 활용할 수 있는 모든 '자산'을 적은 다음, 그 리스트에 맞춰 영화를 만드는 것을 의미한다. 로드리게즈는 친구가 키우는 동물들, 술집, 목장, 버스 등 주위에 쉽게 구할 수 있는 것들을 활용해서 를 만들었다. 7000달러로 만든 이 영화로 선댄스 영화제에서 수상하고, 이후 '저예산 영화'라는 새로운 패러다임을 만들어냈다. 한계 안에는 자유가 들어 있다 "거북이, 개, 술집, 목장만 활용해야 하는 상황일 때 나는 더 자유로울 수 있었다. 한계는 곧 자유였다." 알리바바 그룹 창업자, 마윈 회장 또한 이렇게 말했다. "우리 회사가 살아남을 수 있었던 이유는 세 가지다. 돈도 없고, 기술도 없고, 계획도 없었기 때문이다. 모..
ArrayList에 요소가 추가되는 과정 살펴보기 최근 배열에 대해 복습하면서 ArrayList에 대해 잘못 이해하고 있었다는 것을 깨달았다. 구체적으로 파헤쳐보기 전에 기본적인 배열 개념에 대해 간략히 정리해봤다. 배열 연속된 메모리 공간에 위치한 같은 타입 요소들의 모음 숫자 인덱스를 통한 랜덤 접근 가능 참조 O(1), 탐색 O(n) 정적 배열 크기가 고정된 배열 동적 배열 동적으로 요소 할당이 가능한 배열 Java에는 ArrayList. 요소를 추가할 때 기존 저장 용량을 초과하면 자동으로 용량이 늘어남 지금까지는 ArrayList도 LinkedList처럼 요소가 포인터로 연결된 형태라고 생각해왔다. 같은 List타입인데다가 중간 삽입/삭제 등의 api가 제공되는 것이 이유였다. (내부 동작은 그..
아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 자바 8 전에는 인터페이스에 메서드를 추가시키면, 기존 구현체를 깨뜨릴 수밖에 없음 이후 자바 8에 디폴트 메서드가 추가되면서 쉽게 메서드를 추가시킬 수 있게 되었지만, 여전히 위험성은 존재 디폴트 메서드를 추가한다는 것은 구현체에 대한 아무런 정보 없이 무작정 메서드가 삽입되는 것 대부분 잘 작동하지만, 모든 상황에서 잘 작동되는 디폴트 메서드를 작성하는 것은 어려움 디폴트 메서드에 의한 문제점 예시 자바 8 Collection 인터페이스의 removeIf 메서드 default boolean removeIf(Predicate
당신과 나는 슈퍼히어로가 아니다. 하지만 동시에 '평범한 사람'도 아니다. 저자 팀 페리스 2013년은 내게 유난히 힘든 해였다. 그해 내가 만든 노트를보면 어느 3개월 동안 내가 얼마나 힘들었는지 구체적으로 나타나 있다. 2013년 내게 일어난 일들 드라마를 보며 눈물을 흘리곤 함 일주일에 2 ~ 3 일은 지각 모든 걸 버리고 떠나는 것을 진지하게 고려함 비관적인 생각을 떨치지 못해 난생처음으로 심리치료사에게 상담 받음 긴급한 업무가 있어도 웹서핑을 하는 데 시간을 씀 매일 카페인을 너무 많이 섭취. 하루 평균 8잔의 커피를 마심 일주일 내내 똑같은 청바지만 입고 다님 그런데, 3개월의 마지막 8주 동안 나는 또 다른 노트에 다음과 같은 기록을 남기고 있었다. 소극적 소득이 20퍼센트 이상 늘었음 꿈꾸..
잘 설계된 컴포넌트는 외부로부터 내부 구현이 잘 숨겨져 있어서 구현과 API가 깔끔히 분리되어 있다. 이것을 정보은닉, 또는 캡슐화라고 한다. 정보 은닉의 장점 시스템 개발 속도 향상 시스템 관리 비용 절감 성능 최적화에 도움을 줌 소프트웨어 재사용성 향상 큰 시스템 제작의 난이도 감소 접근 제한 수준 private : 멤버를 선언한 톱레벨 클래스만 접근 가능 package-private(default) : 멤버가 소속된 패키지 안의 모든 클래스에서 접근 가능 protected : package-private의 접근 범위 포함, 이 멤버를 선언한 클래스의 하위 클래스에서도 접근 가능 public : 모든 곳에서 접근 가능 접근 제한자 활용 원칙 모든 클래스와 멤버의 접근성을 가능한 한 좁힌다. publi..
정적 팩터리나 생성자를 통한 객체 생성은 선택적 매개변수가 많을 때 적절히 대응하기가 어려운 단점이 있다. 이를 해결하기 위해 책에서는 세가지 패턴을 소개한다. 점층적 생성자 패턴 필수 매개변수만 받는 생성자 부터 시작해 선택 매개변수를 전부 다 받는 생성자까지 매개변수를 늘려나가는 방식 인스턴스를 만들려면 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출 이 경우, 보통 사용자가 설정하길 원하지 않는 매개변수 까지 포함할 수도 있는데, 어쩔 수 없이 그런 매개변수도 값을 지정해줘야 함. 즉, 점층적 생성자 패턴은 매개변수의 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵게 된다. public class NutritionFacts { private final int serving..
Optional은 무엇인가요? Optional는 'T타입의 객체'를 감싸는 래퍼 클래스이다. Optional의 용도 (옵셔널 반환은 신중히 하라, 이펙티브 자바 아이템 55) 자바 8전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때, 예외를 던지거나 null을 반환했다. 두 방법 모두 허점이 있다. 예외는 진짜 예외 상황에만 사용해야 한다. (이펙티브 자바 아이템 69) 또, 예외 생성 시 스택 추적에 비용이 든다. null을 반환할 수 있는 메서드 호출 시, null 처리 코드를 추가해야 한다. 만약, 무시하고 처리하지 않으면 나중에 원인과는 상관없는 곳에서 NPE가 발생할 수 있다. Optional는 null이 아닌 T타입 참조를 하나 담거나, 아무것도 담지 않을 수 있다. 이를 이용해 보통은 ..