개발은 재밌어야 한다
반응형
article thumbnail
이펙티브자바 Item20. 추상 클래스보다는 인터페이스를 우선하라
JAVA/이펙티브자바 2024. 10. 7. 23:35

추상 클래스, 인터페이스 비교공통점:타입을 정의하기 위한 다중 구현 메커니즘인스턴스 메소드(디폴트 메서드)를 구현 형태로 제공차이점:추상 클래스:추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스 > 새로운 타입 정의에 제약인터 페이스:어떤 클래스 타입에 있건 인터페이스를 정의한 클래스는 해당 인터페이스 타입 가능 취급 > 다중 상속 가능인터페이스 장점 : 기존 클래스도 인터페이스 타입이 될 수 있다.기존 클래스에도, 새로운 인터페이스를 구현하도록 하면 되기 때문에 기존 클래스도 인터페이스 타입이 될 수 있다.Comparable, Iterable, AutoCloeable 인터페이스가 새로 추가되었을 때, 자바의 수많은 기존 클래스가 해당 인터페이스들을 구현한 채 릴리즈 되었다..

article thumbnail
이펙티브자바 Item19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라
JAVA/이펙티브자바 2024. 10. 7. 23:35

상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야한다.@implSpec 사용 → 자바독 도구가 생성을 해줌public class ExtendableClass { /** * This method can be overridden to print any message * * @implSpec * Please use System.out.println(). */ protected void doSomething() { System.out.println("hello"); } }문서로 남기는 것 말고도 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅을 잘 선별하여 protected메서드 형태로 공개해야 할 수도 있다• 훅 : hook: 클래스의 내부 동작 과정 중간에 끼어들 ..

article thumbnail
이펙티브자바 Item18. 상속보다는 컴포지션을 사용하라
JAVA/이펙티브자바 2024. 10. 7. 23:33

상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다상속은 캡슐화를 깨트리게 된다내부구현이 노출된다하위 클래스가 상위 클래스에 강하게 의존 및 결합이 되는 설계이다메서드 호출과 달리 상속은 캡슐화를 깨뜨린다.캡슐화 : 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.문제 1. 상위 클래스가 어떻게 구현되느냐에 따라 하위클래스의 동작에 이상이 생길 수 있다문제 2. 다음 릴리스에서 상위 클래스에 새로운 메서드를 추가한다면?하위 클래스에서 재정의하지 못한 그 새로운 메서드를 사용해 허용되지 않은 원소를 추가할 수 있다문제 1 예시public class InstrumentedHashSet extends HashSet ..

article thumbnail
이펙티브자바 Item17. 변경 가능성을 최소화 하라
JAVA/이펙티브자바 2024. 10. 7. 23:32

불변클래스란?인스턴스의 내부 값을 수정할 수 없는 클래스불변클래스 예시 → String, 박싱 클래스, BigInterger, BigDecimal가변클래스보다 설계하고 구현하고 사용하기 쉽다오류가 생길 여지가 적고 안전하다클래스를 불변으로 만드는 5가지 규칙객체의 상태를 변경하는 메서드를 제공하지 않는다setter가 존재하지 않아야한다클래스를 확장할 수 없도록 한다class의 선언을 final로 선언하는 방법 존재생성자를 private으로 막아 상속을 막는다**> 정적 팩토리 메서드 사용**모든필드를 private로 선언한다시스템이 강제하는 수단을 이용해서 설계자의 의도를 명확히 드러내도록 한다.모든필드를 final로 선언한다클라이언트에서 직접 접근해 수정하는 것을 막아준다.public final로 선언..

article thumbnail
이펙티브자바 Item16. public클래스에는 public필드가 아닌 접근자 메서드를 사용하라
JAVA/이펙티브자바 2024. 10. 7. 23:30

안좋은 클래스 예시class Point{ public double x; public double y;}package-private으로 선언 후에 데이터 접근 제한자는 public 으로 선언한 경우캡슐화의 이점제공 xAPI를 수정하지 않고는 내부 표현을 바꿀 수 없다불변식을 보장하지 않는다접근자와 변경자(mutator)메서드를 활요해 데이터를 캡슐화 한다.public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public void setX(int x) {..

article thumbnail
이펙티브자바 Item15. 클래스와 멤버의 접근 권한을 최소화하라
JAVA/이펙티브자바 2024. 10. 7. 23:26

정보 은닉(캡슐화)이란?내부의 데이터와 구현을 외부로 부터 숨기는 것→ 이를 통해, A는 자신의 역할만 잘 수행하도록 하고, A를 사용하는 B는 A가 내부적으로 어떻게 수행되는지에는 알 필요가 없다정보은닉의 장점시스템 개발속도 향상 → 여러 컴포넌트를 병렬로 개발시스템 관리비용을 낮춘다. → 각 컴포넌트를 빨리 디버깅가능, 교체 용이정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움 → 다른 컴포넌트에 영향을 주지않고 특정 컴포넌트만 최적화 가능소프트웨어 재사용성 향상 → 의존성 없다면 다른곳에서 재사용 가능큰 시스템 제작 난이도 낮춘다 → 개별 컴포넌트 동작 검증 가능클래스와 인터페이스의 접근 제한자 사용 원칙모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.톱레벨 클래스와 인터페이스에..

article thumbnail
이펙티브자바 Item2. 생성자에 매개변수가 많다면 빌더를 고려하라
JAVA/이펙티브자바 2024. 2. 18. 01:03

정적 팩터리와 생성자로 객체생성시 매개변수가 많을때 대응이 어렵다는 제약이 있다.이런 상황에는 점증척 생성자 패턴(telescoping constructor pattern)으로 매개변수에 대응되는 생성자를 늘려가는 방식으로 대응점증척 생성자 패턴(telescoping constructor pattern)이란?생성자를 필수 매개변수 1개만 받는 생성자, 필수 매개변수 1개와 선택 매개변수 1개를 받는 생성자, 선택 매개변수 2개를 받는 생성자 등에 형태로 매개변수 개수만큼 생성자를 늘리는 방식public class NutritionFacts { private final int servingSize; // (ml, 1회 제공량) 필수 private final int servings; ..

article thumbnail
이펙티브자바 Item1. 생성자 대신 정적 팩터리 메서드를 고려하라.
JAVA/이펙티브자바 2024. 2. 18. 00:02

일반적인 인스턴스 생성 방법은 public 생성자다.정적 팩터리 메서드(static factory method) 로도 클래스 인스턴스를 생성 할 수 있다.정적 팩터리 메서드란?객체 생성을 흔히 사용하는 생성자가 아닌 정적(static) 메서드로 객체를 생성하는 메서드정적 팩터리 메서드의 장점1. 이름을 가질 수 있다.일반적으로 생성자의 경우 객체를 생성할 때, 반활될 객체의 특성을 설명할 수 없다. → 이름을 따로 못가지기 때문에ex)public class ExampleCalendar { private int year; private int month;}public static void main(String[] args) { // 생성자로 객체를 생성 ExampleCalendar calendar ..

article thumbnail
MongoDB 인덱스 확인 (TTL 설정 확인)
NoSQL/MongoDB 2024. 1. 19. 18:25

MongoDB에 TTL(Time To Live)로 일정 시간 이후 컬렉션에서 문서를 자동으로 제거할 수 있게 한 인덱스를 설정하였습니다.  설정 주기를 얼마로 했는지 확인하는 방법 (기준: 초) => 해당 collection에서 인덱스들을 조회해서 설정초 확인 db.[collection명].getIndexes() expireAfterSeconds 확인 아래의 경우 5184000초 -> 60일로 설정되어 TTL인덱스에 맞는 createdAt 필드값을 기준으로 60일 주기로 데이터가 삭제된다.

article thumbnail
[MSA] Hystrix 와 resilience4j를 통한 circuit breaker
Spring/Spring 2023. 8. 30. 10:22

MSA 환경에서의 장애 양상MSA에서 더 위험한(빈번한) 실패 시나리오는 서버가 완전히 뻗어버리는게 아니라,버벅거리지만 동작하는 서버가 더 위험할 수 있다. Feign Client와 같이 호출하는 쪽에서는 다른 서비스로 호출을 동기식으로 하기 때문에 응답에 오랜 시간이 걸리더라도 호출을 중단하지 않기 때문입니다. 위 처럼 A,B,C의 서비스가 MSA를 구성하고 있다고 했을때. 서비스 C는 DB를 읽어오는 역할을 하고 있습니다. 지속적으로 DB에서 응답 지연이 발생하고 있는 상황에서 서비스 B가 지속적으로 C를 호출하게 된다면 C에서는 DB에 붙는 커넥션 풀이 고갈되고, B는 C를 반복 호출하면서 C의 스레드 풀을 모두 소진하게 된다.서버 A 역시 B의 스레드 풀이 소진되면 장애가 발생할 가능성이 높습니다..

article thumbnail
MongoDB 샤딩 (샤딩과 복제 차이, 수평파티셔닝이란, 샤딩의 종류)
NoSQL/MongoDB 2023. 4. 26. 15:36

샤딩(Sharding)샤딩이란 데이터를 여러 서버에 분산해서 저장하고 처리할 수 있는 기술을 말한다.  샤딩(Sharding) VS 복제 (Replication)샤딩(Sharding)과 복제(Replication)는 둘 다 데이터베이스의 가용성과 확장성을 높이는 방법이다.둘의 차이가 있다면 복제는 데이터베이스 서버의 데이터를 다른 서버들과 복사하여 저장하는 방식이다. 이렇게 복제된 데이터는 다른 서버에서 읽기 작업을 수행할 수 있으며, 원본 서버가 다운되었을때 백업 서버에서 데이터를 제공하여 가용성을 보장한다. 복제는 데이터의 가용성과 일관성을 보장하며,읽기 작업을 분산시켜 성능을 향상시킬 수 있다. 그러나 쓰기 작업은 일반적으로 원본 서버에서 수행되며, 이는 복제된 서버간의 동기화 문제를 야기할 수도 ..

article thumbnail
엑셀 다운로드 에러 발생 해결 - FontConfiguration에서 NullPointerException 발생
Spring/Spring 2023. 4. 5. 19:19

엑셀 다운로드 기능이 갑자기 안되는 일이 생겨났다에러 로그를 살펴보니 FontConfiguration쪽에서 NPE(NullPointerException)가 발생했다발생로그더보기org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang...

반응형