본문 바로가기

전체 글150

[이펙티브자바] 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라. 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라. 핵심정리 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 "삽입"될 뿐이다. 디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다. ex) Collection 클래스의 removeIf 디폴트 메서드 Collection 인터페이스를 구현한 synchronizedCollection 입장에서는 매우 위험 synchronizedCollection은 동기화를 통해서 한번에 오직 한 쓰레드만 해당 오퍼레이션을 실행해야 하는데, removeIf 메서드 내에는 동기화 관련 로직이 없기 때문에 안전하지 않은 접근이 됨 (CurrentModificationExcept.. 2023. 4. 2.
[이펙티브자바] 아이템18. 상속보다는 컴포지션을 사용하라. 아이템18. 상속보다는 컴포지션을 사용하라. 핵심정리 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 인터페이스 상속(implementation) 얘기가 아니라 구체적인 구현 상속에 한해서 상위 클래스에서 제공하는 메서드 구현이 바뀐다면... 상위 클래스에서 새로운 메서드가 생긴다면... 예시) HashSet의 addAll 메소드 내부 로직에서 add 메소드 호출하는 것을 알고 사용해야 함. -> 만약 addAll의 내부 구현이 바뀐다면 하위 클래스들의 로직도 바뀌어야 함 - 캡슐화 깨지는 것 super.addAll 호출 시, 내부적으로 상속하여 overriding add를 호출하여 count가 두 번 집계됨 상속을 받지 않고 위임한 composition에서는 sideEffect.. 2023. 3. 19.
[이펙티브자바] 아이템15. 클래스와 멤버의 접근 권한을 최소화하라 아이템15. 클래스와 멤버의 접근 권한을 최소화하라. 핵심정리1: 구현과 API를 분리하는 “정보 은닉”의 장점 (모듈화, 캡슐화) l 시스템 개발 속도를 높인다 (여러 컴포넌트를 병렬로 개발할 수 있기 때문) n 인터페이스 정의서를 바탕으로 서로 다른 모듈을 동시에 개발할 수 있음 l 시스템 관리 비용을 낮춘다 (컴포넌트를 더 빨리 파악할 수 있기 때문) n 인터페이스 위주로 코드를 살펴보면 코드 파악과 디버깅이 용이함 l 성능 최적화에 도움을 준다 (프로파일링을 통해 최적화할 컴포넌트를 찾고 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 개선할 수 있기 때문) n 성능의 병목 지점 파악이 용이함 (병목이 일어나는 컴포넌트만 개선하면 됨) l 소프트웨어 재사용성을 높인다 (독자적인 컴포넌트라면) l.. 2023. 3. 12.
[JPA] 자바 ORM 표준 JPA 프로그래밍 : 값 타입 목차 기본값 타입 임베디드 (복합 값 타입) 값 타입과 불변 객체 값 타입의 비교 값 타입 컬렉션 실전 예제 - 6. 값 타입 매핑 기본값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본(primitive) 타입 (int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type,.. 2022. 3. 4.
[JPA] 자바 ORM 표준 JPA 프로그래밍 : 프록시와 연관관계 관리 목차 프록시 즉시 로딩과 지연 로딩 지연 로딩 활용 영속성 전이 : CASCADE 고아 객체 영속성 전이 + 고아 객체, 생명주기 실전 예제 프록시 프록시 기초 em.find() vs em.**getRerence()** em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 Member member = new Member(); member.setUsername("hello"); em.persist(member); em.flush(); em.clear(); // select query 나가지 않음! 프록시객체 반환됨. Id는 이미 알고 있는 값 Member findMember = em.getRefere.. 2022. 2. 22.
[JPA] 자바 ORM 표준 JPA 프로그래밍 : 고급매핑 목차 상속관계 매핑 @MappedSuperclass 실전 예제 - 4. 상속관계 매핑 상속관계 매핑 관계형 데이터베이스는 상속 관계가 없음 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 (JPA에서 세 방법 지원) 각각 테이블로 변환 → 조인 전략 통합 테이블로 변환 → 단일 테이블 전략 (JPA 기본 전략) 서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS.. 2022. 2. 17.
[JPA] 자바 ORM 표준 JPA 프로그래밍 : 다양한 연관관계 매핑 연관관계 매핑시 고려사항 3가지 다중성 다대일 : @ManyToOne (가장 많이 사용) 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany (실무에서 사용하지 않음) 단방향, 양방향 테이블 외래키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 ( 사실 단방향 참조가 2개 있는 구조!) 연관관계의 주인 테이블은 외래키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A → B, B → A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘 중 테이블의 외래키를 관리할 곳을 지정해야 함 연관관계의 주인 : 외래키를 관리하는 참조 주인의 반대편 : .. 2022. 2. 10.
[도서] 켄트 벡의 구현패턴 - 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 켄트 벡의 구현패턴 - 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 내용 정리 http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960770317 켄트 벡의 구현 패턴 - 교보문고 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 | [ 책 소개 ] 기능적으로 올바르게 동작한다고 해서 모두 훌륭한 코드는 아니다. 훌륭한 코드는 프로그래머의 의도를 일관되게 전달해서, 다른 www.kyobobook.co.kr 커뮤니케이션을 돕는 프로그래밍 기법 단계 생각을 하며 프로그래밍하는 것. 다른 사람들의 중요성을 인정하는 것. 다른 사람의 존재도 내 존재만큼 중요하다는 생각을 한 후 그러한 생각을 실천으로.. 2022. 2. 10.
[JPA] 자바 ORM 표준 JPA 프로그래밍 : 연관관계 매핑 기초 목표 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 용어 이해 방향(Direction) : 단방향, 양방향 다중성(Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해 연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리 주인이 필요 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다. - 조영호 (객체지향의 사실과 오해) 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. 객체는 참조를 사용해서 연관된 객체를 찾는다. 테이블과 객체 사이에는 이런 큰 간격이 있다. 회원 저장시: 팀 저장 → 저장된 팀 ID 조회.. 2022. 1. 31.