TIL46 [Java] Effective Java 3/E 3장 item 21~25 Item 21: 인터페이스는 구현하는 쪽을생각해 설계해라 디폴트 메소드를 통해 기존 인터페이스에 메소드를 추가할 수 있음 유용하다만 기존 구현체와 충돌하지 않는지에 대한 고려 필요함 Item 22: 인터페이스는 타입을 정의하는 용도로만 사용하라 상수 인터페이스는 안티 패턴임 상수 클래스는 인스턴스할 수 없는 유틸리티 클래스로 만들어 사용하자) public class Constants { private Constants(){} // 인스턴스화 방지 public static final int ONE = 1; } Item 23: 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 public class TagClass { enum Type { HOT, COLD } final Type type; String h.. TIL/Java 2024. 1. 20. [Java] Effective Java 3/E 4장 item 15~20 Item 15: 클래스와 멤버의 접근 권한을 최소화하라 public 으로 나오는 것은 유지 보수, 하위 버전 호환의 책임 존재 외부에서 접근할 수 있는 내용은 최소화하자 public 클래스의 인스턴스 필드는 되도록 public 아니어야 함 public 가변 변수를 가진다면 일반적으로 Thread-Safe 하지 않음 Item 16: public 클래스에서는 public 필드가 아닌 접근자 메소드 사용하라 public 필드 바로 접근 X getter 쓸 것 setter는 정말 필요시에 쓸 것 Item 17: 변경 가능성을 최소화하라 객체 상태 변경하는 메소드 제공X 클래스 확장할 수 없도록 모든 필드 final 으로 선언 모든 필드 private 으로 선언 자신 외에는 내부의 가변 컴포넌트에 접근 불가 불변.. TIL/Java 2024. 1. 18. [Java] Effective Java 3/E 3장 item 10~14 3장 모든 객체의 공통 메소드 item 10: equals는 일반 규약을 지켜 재정의하라 equals 메소드를 재정의하며서 발생할 수 있는 문제를 회피하는 방법은 재정의하지 않는 것 equlas 메소드를 재정의하지 않으면 오직 자기 자신과만 같게 된다. equals 메서드를 재정의하지 않는 것이 최선인 Case 각 인스턴스가 본질적으로 고유하다. 인스턴스의 논리적 동치성을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private이거나 package-private이고 equals 메소드를 호출할 일이 없다. equals 메소드를 재정의해야하는 Case 객체 식별성, 물리적으로 두 객체가 같냐? 가 아니라 논리적 동치성, 논리적으로 두 객체가 같냐? .. TIL/Java 2023. 11. 14. 멱등성 API? 멱등(Idempontent)성, 멱등성 API란? 첫 번째 수행한 결과와 그 후 여러 차례 반복하여 수행한 결과가 동일한 작업 또는 그 속성을 의미함 ⇒ 즉 멱등한 API라면 2번 이상 요청해도 결과가 처음 요청과 똑같이 돌아와야 한다. 단순히 돌아온 값만 같을 뿐만 아니라 DB에도 영향 없어야 함. ⇒ 의도하지 않은 문제 발생시키지 않고 요청을 재시도할 수 있음 예를 들어 이미 HTTP 메소드들 중에서 GET, PUT 같이 여러번 호출해도 매번 같은 리소스로 대체되거나 조회되는 경우 멱등성이 보장된 메소드라고 볼 수 있음 반면, 서버 데이터를 변경하는 POST, PATCH 의 경우 호출할 때마다 응답이 달라지기에 멱등하지 않음 API 통신에 멱등성을 보장하고자 한다면? 멱등키를 API 요청에 포함하자 .. TIL/BackEnd 2023. 10. 15. [Java] Effective Java 3/E item 4~6 item4: 인스턴스화를 막으려거든 private 생성자를 사용해라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰는 설계X 하지만 생성자를 명시하지 않으면 자동 생성되기에, private 생성자를 만들어 인스턴스화를 막자 이러한 방법은 상속을 불가능하게 하는 효과도 존재 Plus) 추상 클래스로 만드는 것으로 인스턴스화를 막을 수 없음. 왜냐하면 하위 클래스를 만들어 인스턴스화할 수 있기 때문 + 상속하여 사용하라는 의도로 착각될 수 있음 item5: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 하나 이상의 자원에 의존하는 클래스를 만들 때, 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱클톤 방식이 적합하지 않음 인스턴스를 생성할 때 생성자에 필요한 자원을.. TIL/Java 2023. 5. 28. [Java] Effective Java 3/E item 1~3 Item1: 생성자 대신 정적 팩토리 메소드를 고려하라 클래스 인스턴스를 얻는 전통적인 수단는 public 생성자 이와 별도의 수단으로 클래스는 정적 팩토리 메소드를 제공할 수 있음 정적 팩토리 메소드가 public 생성자에 비해 가지는 장단점 장점 이름을 가질 수 있음 Ex) BigInteger(int, int, Random) vs BigInteger.probablePrime 호출될 때마다 인스턴스를 새로 생성하지 않아도 됨 생성 비용이 큰 객체가 자주 요청되는 상황이라면 성능적으로 좋음 반복되는 요청에 같은 객체를 반환하는 식의 정적 팩토리 방식의 클래스는 인스턴스 통제할 수 있음. 이를 통해 클래스를 싱글톤으로 만들 수도, 인스턴스화 불가로 만들 수도 있음 반환 타입의 하위 타입 객체를 반환할 수 .. TIL/Java 2023. 5. 26. 스프링 프록시 팩토리 💡 프록시(Proxy) 란? 클라이언트가 실제 사용하려는 대상인양 요청을 받아 처리하는 역할. 프록시에게 요청을 넘겨받아 최종 처리하는 오브젝트는 타깃(Target). 타깃과 프록시인지 클라이언트가 구별할 수 없어야 하기에 둘은 같은 인터페이스를 확장해야 함. 프록시는 사용 목적에 따라 2가지로 나뉨 부가적인 기능 부여 ⇒ 데코레이터 패턴 접근 제어 ⇒ 프록시 패턴 프록시 패턴 객체 생성은 비용 ⇒ 최소한, 필요 시점까지 미루는게 좋음 타깃에 대한 접근권한 제어 가능 캐싱 프록시의 단점 프록시가 멤버변수로 타깃 오브젝트 가지기에 타깃 오브젝트에 종속적 똑같은 기능 수행하는 프록시라도 여러 타깃에 적용하려면 타깃의 갯수 만큼 프록시 생성해야 하기에 코드 중복 발생 프록시를 사용하지 않는 메소드에도 타깃으로.. TIL/Spring & Spring Batch 2023. 5. 24. Inner Class로 DTO 관리 프로젝트 내 VO 혹은 DTO 패키지 안에 필요할 때마다 Class파일을 생성하면 DTO 파일들이 마구마구 늘어난다. 여기서 파생되는 문제점들은.. 부분적으로 중복되는 파일 갯수 자체가 많아지고 보기에 안좋다. 더 이상 ClassName이 중복되지 않는 DTO를 만들기가 어려워집니다. 필드들이 겹치는 DTO로 대충 Response를 내리다보니 Over-Fetching을 하게됩니다. Inner Class로 DTO를 관리한다면 조금 더 깔끔한 패키지를 만들 수 있고, DTO ClassName을 정하는게 수월해진다. 그래서 Inner Class로 DTO를 관리하는 것이 좋지 않나? 라는 생각으로 이러한 방법을 검토해보았다. 예시 코드 @Getter @NoArgsConstructor(access = Access.. TIL/TIL 2023. 5. 10. [클린 코드] 6장 객체와 자료 구조 자료 추상화 // 구체적인 Point 클래스 public class Point{ public double x; public double y; } // 추상적인 Point 클래스 public interface Point{ double getX(); double getY(); double setCartesian(double x, double y); double getR(); } 구체적인 Point 클래스는 구현을 노출한다. 변수를 private으로 하여도 각 값마다 get/set 함수를 제공한다면 구현이 외부로 노출된다. 즉 변수 사이에 함수라는 계층을 넣는다고 구현이 감춰지는 것이 아니다! 구현을 감추기 위해서는 추상화가 필요하고, 그 역할을 해주는 것이 추상 인터페이스이다. 사용자는 추상 인터페이스를 통.. 독서 기록/클린 코드 2023. 1. 25. [클린 코드] 5장 형식 맞추기 코드가 깔끔하고, 일관적이며, 질서정연하려면 글과 동일하다 한 사람이 쓴 것 같이 형식은 통일되고 흐름은 비슷해야한다. 즉 코드 형식을 맞추기 위한 규칙을 정하고 팀원들이 이를 충실히 따라야 한다는 것이다. 형식을 맞추는 목적 유지보수 용이성과 확장성을 가지는 것이다. 세로 형식 적절한 행길이를 유지할 것 일반적으로 너무 큰 파일보다 작은 파일이 이해하기 쉽다. 신문 기사처럼 작성할 것 신문은 위에서 아래로 읽기에, 첫 문단에 전체 기사 내요을 요약하고 내려오면서 세세한 사실을 설명. 이와 비슷하게 첫 부분은 고차원 개념과 알고리즘을 설명, 아래로 내려올수록 의도를 세세하게 묘사한다. 마지막에는 가장 저차원 함수와 세부 내역을 설명 개념은 빈행으로 분리 빈 행은 새로운 개념을 시작한다는 시각적 단서 pu.. 독서 기록/클린 코드 2023. 1. 24. [클린 코드] 4장 주석 주석은 필요악 프로그래밍 언어로만 모든 의도를 표현하고 서로 이해할 수 있다면 주석은 필요하지 않음 우리는 프로그래밍 언어로만 의도를 전달하는 것을 실패하고 이를 만회하기 위해 주석을 사용한다. 즉 주석은 존재 자체가 표현을 제대로 하지 못한 실패의 산물이라는 것 주석이 악한 이유 주석은 거짓말을 한다. 오래될수록 코드와 멀어지고 그릇될 가능성이 커진다. 왜냐하면 코드를 유지보수하는 것도 어려운데 주석까지 유지 보수를 하는 것은 현실적으로 불가능하기 때문이다. 부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다. 주석은 나쁜 코드를 보완하지 못한다 보통 주석을 추가하는 경우 코드 품질이 나쁘기 때문에 이를 보완하기에 작성한다. 하지만 주석을 다는 것보다 코드 품질을 올리는 것이 더 중요하다 // 직원이 .. 독서 기록/클린 코드 2023. 1. 23. [클린 코드] 3장 함수 함수는 프로그램의 가장 기본적인 단위 최대한 작게 만들자! 블록과 들여쓰기 if/else 문이나 while문 등에 들어가는 블록은 1줄이어야 한다. 즉 중첩 구조가 생길만큼 함수가 커지면 안된다. 그러므로 들여쓰기 수준도 1단이나 2단을 넘으면 안된다. 그래야 가독성이 좋기 때문이다 하나의 목표에 집중해라 함수는 한가지를 해야 한다. 그 한가지를 잘해야 한다. 그리고 그 한가지만 해야한다. 한 함수내에 추상화 수준이 동일해야 한다 ex) getHtml() 는 추상화 수준이 높다 String pagePathName = PathParser.render(pagepath) 는 추상화 수준이 중간이다. .append("₩n") 같은 코드는 수준이 낮다. 한 함수 안에서 추상화 수준을 섞으면 코드를 읽는 사람이 헷.. 독서 기록/클린 코드 2023. 1. 21. 이전 1 2 3 4 다음 반응형