본문 바로가기

Java11

아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 의존 객체 주입이란 인스턴스를 생성할 때 필요한 자원을 넘겨주는 방식이다. 이 방식의 변형으로 생성자에 자원 팩터리를 넘겨줄 수 있다. 의존 객체 주입을 사용하면 클래스의 유연성, 재사용성, 테스트 용이성을 개선할 수 있다. 완벽 공략 팩터리 메소드 패턴 구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정한다. 2022.01.04 - [GoF의 디자인 패턴] - 팩토리 메소드(Factory method) 패턴 스프링 IoC Inversion of Control 자기 코드에 대한 제어권을 자기 자신이 가지고 있지 않고 위부에서 제어하는 경우 제어권: 인스턴스를 만들거나, 어떤 메소드를 실행하거나, 필요로하.. 2022. 7. 17.
아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. 생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다. 상속을 방지할 때도 같은 방법을 사용할 수 있다. public class UtilityClass { // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용) private UtilityClass() { throw new AssertionError(); } } 2022. 5. 17.
아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(ingleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. private 생성자 + public static final 필드 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } } 장점 간결하고 싱글턴임을 API에 드러낼 수 있다. 단점 싱글턴을 사용하는 클라이언트가 테스트하기 어려워진다. 리플렉션으로 private 생성자를 호출할 수 있다. 역직렬화 할 때 새로운 인스턴스가 생길 수 있다. private 생성자 + 정적 팩터리 메서드 public class Elvis { private static final Elvis INSTANCE = new Elvis(); pri.. 2022. 5. 16.
아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안 점층적 생성자 패턴(생성자 체이닝) 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수를 1개에서 전부 다 받는 생성자까지 늘려가는 방식이다. 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. public class NutritionFacts { private int servingSize; private int servings; private int calories; private int fat; private int sodium; private int carbohydrate; public NutritionFacts(int servingSize, int servings) {.. 2022. 4. 21.
아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자이지만, 정적 팩터리 매서드(static factory method)를 제공하는 방법도 있다 정적 팩터리 메서드는 디자인 패턴에서의 팩터리 메서드(Factory Method)와 다르다. 디자인 패턴 중에는 이와 일치하는 패턴은 없다. 장점 1: 이름을 가질 수 있다 정적 팩터리 메서드는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 시그니처가 같은 생성자는 여러 개 만들 수 없으므로, 필요하다면 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자. // 생성자: 반환될 객체의 특성 불분명 BigInteger bigInteger1 = new BigInteger(3, 1, new Random()); /.. 2022. 4. 5.
OSIV와 성능 최적화 OSIV란 하이버네이트: Open Session In View JPA: Open EntityManager In View OSIV ON spring.jpa.open-in-view : true (기본값) 동작 원리 클라이언트의 요청이 들어오면 영속성 컨텍스트를 생성한다. 이때 트랜잭션은 시작하지 않는다. 서비스 계증에서 트랜잭션을 시작하면 생성해둔 영속성 컨텍스트에 트랜잭션을 시작한다. 비즈니스 로직을 실행하고 서비스 계층이 끝나면 트랜잭션을 커밋하면서 영속성 컨텍스트를 플러시한다. 이때 트랜잭션만 종료하고 영속성 컨텍스트는 살려둔다. 클라이언트의 요청이 끝날 때 영속성 컨텍스트를 종료한다. 장점 영속성 컨텍스트가 유지되지 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능하다. 단점 .. 2022. 3. 25.
아이템 14. Comparable을 구현할지 고려하라 Comparable 인터페이스 Comparable을 구현해다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻한다. Comparable을 구현한 객체들의 배열은 손쉽게 정렬할 수 있다. (Arrays.sort(a);) 자바 플랫폼 라이브러리의 모든 값 클래스와 열거 타입(아이템 34)이 Comparable을 구현했다. public interface Comparable { int compareTo(T t); } compareTo 메서드의 일반 규약 이 객체와 주어진 객체의 순서를 비교한다. 이 객체가 주어진 객체보다 작으면 음의 정수를, 같으면 0을, 크면 양의 정수를 반환한다. 이 객체와 비교할 수 없는 타입의 객체가 주어지면 ClassCastException을 던진다. sgn(부호 함수): .. 2022. 3. 9.
JPA 지연 로딩과 조회 성능 최적화 (2) 지연 로딩 @OneToMany 연관관계에 대한 성능 최적화 내용이다. 엔티티 직접 노출 엔티티를 API의 응답 값으로 반환하는 방법이다. @GetMapping("/api/v1/orders") public List orderV1() { List orders = orderRepository.findAll(); for (Order order : orders) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderItems(); orderItems.forEach(o -> o.getItem().getName()); } return orders; } @OneToMany 연관 관계인 엔티티의 값을 .. 2022. 3. 7.
JPA 지연 로딩과 조회 성능 최적화 (1) 지연 로딩 @ManyToOne, @OneToOne 연관관계에 대한 성능 최적화 내용이다. @OneToMany 연관관계는 다음 포스트에서 정리할 예정이다. 예제 도메인 @Entity @Table(name = "orders") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL).. 2022. 3. 6.
아이템 13. clone 재정의는 주의해서 진행하라 Cloneable 인터페이스 Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스(mixin interface, 아이템 20)이다. Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하면 CloneNotSupportedException을 던진다. 여러 문제점에도 불구하고 Cloneable 방식은 널리 쓰이고 있다.clone 믹스인 인터페이스: 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된 타입' 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 줄 수 있다. 의도한 목적을 제대로 이루지 못한 이유 clone 메서드가 선언된 곳인 Clona.. 2022. 2. 12.