전체 글
-
아이템18. 상속보다는 컴포지션을 사용하라Java/이펙티브 자바 2023. 8. 23. 12:27
핵심 정리 - 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. ㆍ상위 클래스에서 제공하는 메서드 구현이 바뀐다면... ㆍ상위 클래스에서 새로운 메서드가 생긴다면... - 컴포지션 (Composition) ㆍ새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조. ㆍ새 클래스의 인스턴스 메서드들은 기존 클래스에 대응하는 메서드를 호출해 그 결과를 반환한다. ㆍ기존 클래스의 구현이 바뀌거나, 새로운 메서드가 생기더라도 아무런 영향을 받지 않는다. 완벽 공략 요약 - p119, 데코레이터 패턴 - p119, 컴포지션과 전달 조합은 넓은 의미로 위임(delegation)이라고 부른다. - p119, 콜백 프레임워크와 셀프 문제 완벽 공략 - 데코레이터 패턴 기존 코드..
-
아이템17. 변경 가능성을 최소화 하라.Java/이펙티브 자바 2023. 8. 15. 10:07
핵심 정리 - 불변 클래스 - 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. - 불변 클래스를 만드는 다섯 가지 규칙 ㆍ객체의 상태를 변경하는 메서드를 제공하지 않는다. ▷ setter를 제공하지 않는다. ㆍ클래스를 확장할 수 없도록 한다 ▷ 상속을 할 수 없게 만든다. ( 1. final class 2. private contructor ) ㆍ모든 필드에 final로 선언한다. ㆍ모든 필드를 private으로 선언한다. ▷ public이면 필드 참조를 할 수도 있기에 우리는 필드 참조를 원치않는다. ㆍ자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. ▷ getter를 만들어 주지 않거나 방어적인 복사를 해서 사용 public fin..
-
아이템16. public 클래스에서는 public 필드가 아닌 접근 메서드를 사용하라.Java/이펙티브 자바 2023. 8. 13. 11:59
핵심 정리 - 클라이언트 코드가 필드를 직접 사용하면 캡슐화의 장점을 제공하지 못한다. - 필드를 변경하려면 API를 변경해야 한다. - 필드에 접근할 때 부수 작업은 할 수 없다. - paackage-private 클래스 또는 private 중첩 클래스라면 데이터 필드를 노출해도 문제가 없다. 완벽 공략 - p103, 아이템 67에서 설명하듯, 내부를 노출한 Dimesion 클래스의 심각한 성능문제는 오늘날까지도 해결되지 못했다. public class DimensionExample { public static void main(String[] args) { Button button = new Button("hello button"); button.setBounds(0, 0, 20, 10); Dimen..
-
10장 인덱스 사용DB & SQL/SQL 레벨업 2023. 8. 9. 12:13
34. 인덱스와 B-tree - RDB에서 사용하는 인덱스는 구조에 따라 다음 세 가지로 분류할 수 있다. ㆍB-tree 인덱스 ㆍ비트맵 인덱스 ㆍ해시 인덱스 1. 만능형 : B-tree - B-tree 인덱스는 이름 그대로 데이터를 트리 구조로 저장하는 형태의 인덱스이다. - 균형잡힌 뛰어난 범용성을 인정받아 가장 많이 사용된다. - 데이터베이스에서 '인덱스'라고 말하면 대부분 B-tree 인덱스를 지칭하는 것이다. - 실제로 특별한 수식을 붙이지 않은 채 CREATE INDEX 구문을 실행하면, 모든 DBMS에서 암묵적으로 B-tree 인덱스가 만들어진다. - B-tree가 검색 알고리즘으로서는 뛰어나게 성능이 좋은 편은 아니다. - B+tree의 검색 성능이 뛰어난 이유 ㆍB+tree는 루트와 리프..
-
9장 갱신과 데이터 모델DB & SQL/SQL 레벨업 2023. 8. 9. 11:59
26. 갱신은 효율적으로 1. NULL 채우기 2. 반대로 NULL을 작성 27. 레코드에서 필드로의 갱신 1. 필드를 하나씩 갱신 2. 다중 필드 할당 - 여러 개의 필드를 리스트화하고 한 번에 갱신하는 방법 - 이렇게 하면 서브쿼리를 한꺼번에 처리할 수 있어 성능도 향상되고 코드도 간단해진다. 3. NOT NULL 제약이 걸려있는 경우 MERGE 구문 사용 - NOT NULL의 경우에 대응하는 한가지 방법이 MERGE 구문을 사용하는 것이다 - 본래 MERGE 구문은 UPDATE와 INSERT를 한번에 시행하려고 고안된 기술이다. ㆍ하지만 UPDATE 또는 INSERT만 수행해도 구문 상에는 문제가 없다. 28. 필드에서 레코드로 변경 29. 같은 테이블의 다른 레코드로 갱신 1. 상관 서브쿼리 사용..
-
7. 마지막 세션Kotlin/실전! 코틀린과 스프링 부트로 ... 개발 2023. 8. 8. 20:29
추가 - 테스트와 영속성 컨텍스트 - 테스트 코드와 LazyInitializationException ㆍ테스트 코드에서 A 엔티티를 불러오고 B객체에 접근을 하면 영속성 컨텍스트가 종료되어 버려서 지연 로딩 객체를 초기화할 수 없게 될 경우 - 테스트 코드에서 영속성 컨텍스트를 쓰고 싶은 상황이 분명 있음! @Transactional fun saveUserAndLoanTwoBooks() { val newUser = User("A", 123) val books = bookRepository.saveAll(listOf(Book("책1", COMPUTER), Book("책2", COMPUTER))) books.forEach { book -> newUser.loanBook(book) } // UserLoanHi..
-
6. 네 번째 요구사항 추가하기 - QuerydslKotlin/실전! 코틀린과 스프링 부트로 ... 개발 2023. 8. 8. 20:07
37. Querydsl 도입하기 1. JPQL과 Querydsl의 장단점을 이해할 수 있다. 2. Querydsl을 Kotlin + Spring Boot 와 함께 사용할 수 있다. 3. Querydsl을 활용해 기존에 존재하던 Repository를 리팩토링 할 수 있다. JPQL은 무슨 단점이 있을까? - 문자열이기 때문에 '버그'를 찾기가 어렵다! - JPQL 문법이 일반 SQL와 조금 달라 복잡한 쿼리를 작성할 때마다 찾아보아야 한다. Spring Data JPA는 무슨 단점이 있을까? - 조건이 복잡한 동적쿼리를 작성할 때 함수가 계속해서 늘어난다. - 프로덕션 코드 변경에 취약하다. JPQL과 Spring Data JPA의 단점 정리! 1. 문자열로 쿼리를 작성하기에 버그를 찾기 어렵다. 2. 문..
-
8장 SQL의 순서DB & SQL/SQL 레벨업 2023. 8. 8. 11:16
23. 레코드에 순번 붙이기 - 최근 SQL은 순서와 순번을 다루기 위한 기능들을 추가하고 있다. ㆍ예를 들어 시퀀스 객체 또는 ID 필드와 같은 순번을 붙일 수 있는 기능을 비롯해, 지금까지 사용해왔던 윈도우 함수 역시 이러한 요구에 대응한 기능이다. 1. 기본 키가 한 개의 필드일 경우 윈도우 함수 사용 # 기본 키가 한 개의 필드일 경우(ROW_NUMBER) SELECT student_id, ROW_NUMBER() OVER (ORDER BY student_id) AS seq FROM Weights; 상관 서브쿼리를 사용 - MySQL처럼 ROW_NUMBER 함수를 사용할 수 없는 환경에서는 상관 서브쿼리를 사용해야 한다 # 기본 키가 한 개의 필드일 경우(상관 서브쿼리) SELECT student_..