본문 바로가기

전체 글

(126)
Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 [Why] 클래스의 유연성, 재사용성, 테스트 용이성이 개선되기 때문 [When] 사용하는 자원(상태)에 따라 동작이 달라지는 클래스 [How] 의존성의 복잡도를 해결하기 위해서 Spring 과 같은 프레임워크를 사용한다. 생성자, 정적 팩터리, 빌더 패턴 등 객체 생성 관련 메서드에 필요한 자원을 파라미터로 제공한다.
Item4. 인스턴스화를 막으려거든 pricate 생성자를 사용하라 [Why] 정적 멤버나 정적 메서드로 구성된 유틸리티 클래스는 인스턴스로 사용하지 않도록 설계한 경우가 있다. 이렇게 인스턴스를 막게 설계된 클래스를 설계한데로 사용하기 위해서 [When] 객체 생성을 제한하고 싶을 때 유틸리티 클래스의 인스턴스화를 막고 싶을 때 [How] private 생성자를 통해서 클라이언트가 객체를 생성하지 못하도록 명시한다.
QueryDsl 간단한 내용 요약 공식 메뉴얼 version 5 http://querydsl.com/static/querydsl/5.0.0/reference/html_single/ build.gradle querydsl Q class build 하는 방법 https://velog.io/@juhyeon1114/Spring-QueryDsl-gradle-%EC%84%A4%EC%A0%95-Spring-boot-3.0-%EC%9D%B4%EC%83%81 Querydsl 공부하면서 새롭게 만난 객체들 JPAQueryFactory : 버전 4에 추가된 객체로서 쿼리를 생성하는데 도움을 준다. @QueryProjection : dto 객체의 Q class 파일을 빌드하도록 선언하는 역할 BooleanExpression : where 조건에 사용하는 조건..
SELECT 최적화 SELECT 처리 순서 하나의 실행 계획 단위에서 키워드가 적용되는 순서는 다음과 같다. WHERE → JOIN → GROUP BY → DISTINCT → HAVING → ORDER BY → LIMIT 원하는 키워드를 먼저 실행하고 싶다면 서브 쿼리를 이용하여 실행 계획을 분리하여 순서를 임의 변경하여 실행할 수 있다. 하지만 서브 쿼리를 이용하면 조인을 사용하는 것보다 성능 상 좋지 않기 때문에 잘 판단하여 쿼리를 작성하는 것이 좋다. MySQL의 LIMIT VS Oracle ROWNUM MySQL의 LIMIT은 오라클의 ROWNUM과 성격이 달라서 WHERE 조건으로 사용되지 않고 항상 모든 처리의 결과에 대하여 레코드 건수를 제한하는 형태로 사용한다. 각 키워드의 성능 최적화 방식 성능을 이끌어 내..
Item 55. 옵셔널 반환은 신중히 하라 [WHY] Optional을 사용한다고 무조건 득이 되는 것이 아니기 때문이다. Collection, Stream, 배열, Optional 같은 컨테이너 타입은 Optional을 사용할 필요가 없다. Wrapper 클래스에 Optional을 적용하는 것 보다 Primitive 타입을 Optional에서 사용하도록 구현한 OptionalInt와 같은 클래스를 사용하는 것이 좋기 때문 null을 박싱한 Optinal을 사용하면 안되기 때문 [WHEN] 결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 하는 경우 사용자에게 반환 값의 여부를 확인해야 한다는 것을 명시하는 상황 [HOW] Optional 의 메서드를 활용하자. get() 값을 조회한다. orElse() 값을 조회한다. 없다면 기..
Item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 [WHY] 1. null을 반환하는 메서드를 사용할 때면 방어 코드를 넣어야 하기 때문이다. - 코드가 지저분해주고 API를 사용하는 사용자 입장에서 사용하기 어렵다. - 잘못된 사용으로 버그의 원인이 될 가능성이 있다. 2. null을 반환함으로서 객체 생성 비용을 줄여 성능에 도움을 줄 수 있으나 더 좋은 기법이 있기 때문이다. [WHEN] 컬렉션이나 배열을 반환할 때 [HOW] 1. 간단한 방법 컬렉션 : 빈 컬렉션을 반환할 때마다 생성하여 요소의 개수가 0개이든 N개이든 넣어서 반환한다. private final List cheeseInStock = new LinkedList(); public List getCheese() { return new ArrayList(cheeseInStock); } ..
Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 클래스를 만드는 방법 1. public static final 필드 public class Elvis { public static final Elvis INSTANCE = new Elvis(); public void leaveTheBuilding(){ } } AccessibleOject.setAccessible을 사용해 private 생성자를 호출할 가능성이 존재함 싱글턴임이 API에 명백히 드러난다. 간결하다. 2. 정적 팩터리 방식 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){} public static Elvis getInstance(){ return INSTANCE; }//Supp..
Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 방법 1 점층적 생성자 패턴 public class Member { private String name; // 필수 private int age; // 필수 private String address; // 선택 private String phone; // 선택 private String email; // 선택 // 필수 매개변수를 가지는 생성자 public Member(String name, int age) { this(name, age, null, null, null); } // 선택 매개변수 address가 추가된 생성자 public Member(String name, int age, String address) { this(name, age, address, null, null); } // 선택 매..