본문 바로가기

공부 기록/Java

(37)
[JPA] 7장 - 고급 매핑(1) - 상속 관계 매핑 상속 관계 매핑 - ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. - 슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다. => 각각의 테이블로 변환, 통합 테이블로 변환, 서브타입 테이블로 변환 조인 전략 - 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략 - 조회할 때 조인을 자주 사용한다. - 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없으므로 타입을 구분하는 컬럼을 추가해야 한다. @Entity @Inheritance(strategy = InheritanceType.JOINED) @Discrimi..
[이펙티브 자바 3/E] 아이템20 - 추상 클래스보다는 인터페이스를 우선하라 - 자바가 제공하는 다중 구현 메커니즘 두 가지 => 인터페이스, 추상 클래스 - 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. (자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있게 됨) - 가장 큰 차이점 : 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다. 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 인터페이스의 장점 - 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. - 믹스인(mixin) 정의에 안성맞춤이다. * 믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된 타입' 외에도 특정 선택적 ..
[이펙티브 자바 3/E] 아이템19 - 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 - 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다. - 재정의 가능한 메서드 => public과 protected 메서드 중 final이 아닌 모든 메서드 - 더 넓게 말하면, 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. 예를 들어 백그라운드 스레드나 정적 초기화 과정에서도 호출이 일어날 수 있다. - 내부 메커니즘을 문서로 남기는 것만이 상속을 위한 설계의 전부는 아니다. - 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드 형태로 공개해야 할 수도 있다. (드물게는 protected 필드로 공개해야 할 수도..
[JPA] 6장 - 다양한 연관관계 매핑(2) - 일대일, 다대다 일대일 [1:1] 주 테이블에 외래 키 - 객체지향 개발자들이 선호하는 방식 단방향 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private Strisng username; @OneToOne @JoinColumn(name = "LOCKER_ID") private Locker locker; ... } @Entity public class Locker { @Id @GeneratedValue @Column(name = "LOCKER_ID") private Long id; private String name; ... } 양방향 @Entity public class Member { @Id..
[이펙티브 자바 3/E] 아이템18 - 상속보다는 컴포지션을 사용하라 - 이 장에서의 '상속'은 인터페이스 상속이 아닌 클래스가 다른 클래스를 확장하는 구현 상속을 말한다. - 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. - 구현 상속의 문제를 모두 피해 가는 묘안이 있다. 기존 클래스를 확장하는 대신, 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게 하자. 기존 클래스가 새로운 클래스의 구성요소로 쓰인다는 뜻에서 이러한 설계를 컴포지션(composition; 구성)이라 한다. - 새 클래스의 인스턴스 메서드들은 (private 필드로 참조하는) 기존 클래스의 대응하는 메서드를 호출해 그 결과를 반환한다. 이 방식을 전달이라 하며, 새 클래스의 메서드들을 전달 메서드라 부른다. => 새로운 클래스는 기존 클래스의 내부 구현 방식의 영향에서 ..
[이펙티브 자바 3/E] 아이템17 - 변경 가능성을 최소화하라 - 불변 클래스 : 인스턴스의 내부 값을 수정할 수 없는 클래스 불변 클래스를 만드는 규칙 1. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 2. 클래스를 확장할 수 없도록 한다. 3. 모든 필드를 final로 선언한다. 4. 모든 필드를 private으로 선언한다. 5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. - 함수형 프로그래밍 : 피연산자에 함수를 적용해 그 결과를 반환하지만, 피연산자 자체는 그대로인 프로그래밍 패턴 => 코드에서 불변이 되는 영역의 비율이 높아지는 장점을 누릴 수 있다. - 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요가 없다. => 안심하고 공유할 수 있다. => 방어적 복사(아이템 50)도 필요 없다.(clone 메서드나 복사 ..
[JPA] 6장 - 다양한 연관관계 매핑(1) - 다대일, 일대다 다대일 - 데이터베이스 테이블의 일, 다 관계에서 외래 키는 항상 다쪽에 있다. => 연관관계의 주인은 항상 다쪽이다. 다대일 단방향 [N:1] - 회원 엔티티 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; ... } - 팀 엔티티 @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; ....
[이펙티브 자바 3/E] 아이템16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - '퇴보한' 클래스는 public이어서는 안 된다. class Point { public double x; public double y; } - 이런 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못한다(아이템 15). - 접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화한다. class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public void setX(double x) { this.x = ..