본문 바로가기

개발

(66)
[이펙티브 자바 스터디] 아이템 31~35 아이템 31. 한정적 와일드 카드를 사용해 API 유연성을 높여라 매개변수화 타입의 문제점 불공변이라 유연하지 않다. 복습 매개변수화 타입은 불공변(invariant)이다. 즉, "Type2가 Type1의 하위타입"은 List가 List의 하위 타입임을 보장하진 않는다. 왜 하위 타입임을 보장할 수 없을까 예를 들어, List와 List을 살펴보자. List에는 어떤 객체든지 넣을 수 있으나, List에는 String만 넣을 수 있다, 즉, 리스코프 치환 원칙에 어긋나므로, List은 List의 하위타입이 될 수 없다. 불공변의 예시 // 예시 public class Stack { public Stack(); public void push(E e); public E pop(); public boolean..
[JPA 기본] 5. 연관관계 매핑 기초 단방향 연관관계 목표 - 객체와 테이블 연관관계 차이를 이해한다. - 객체의 참조와 테이블의 외래 키를 매핑한다. 용어 - 방향: 단방향 , 양방향 - 다중성: 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) - 연관관계의 주인(Owner): 양방향 연관관계에서는 관리의 주인이 필요하다. 객체를 테이블에 맞추어 모델링할 경우의 문제점. - 식별자로 다시 조회하는데, 이는 객체 지향적인 방법은 아니다. 객체와 테이블의 데이터 검색 방식 - 테이블: 외래 키로 조인을 사용하여 연관 테이블을 찾는다. - 객체: 참조를 사용하여 연관 객체를 검색 객체지향 모델링시 주의점 1:N에서 N의 위치를 파악해야한다. 예. TEAM, MEMBER -> MEMBER 가 N 양방향 연관관계와 연관관계의 ..
[이펙티브자바]아이템28. 배열보다는 리스트를 사용하여라. 배열 VS 제네릭 비교 1. 배열은 공변, 제네릭은 불공변이다. 배열은 공변(covariant)이다. 즉, A가 B의 하위 타입이면 A[]는 B[]의 하위 타입이다. 반면 제네릭은 불공변(invariant)이다. 즉, A가 B의 하위 타입이라도, List 와 List는 하위 관계가 성립되지 않는다. Object[] arr = new Long[1]; arr[0] = "문자열"; // 런타임 에러 발생 List ol = new ArrayList(); ol.add("문자열"); // 컴파일 에러 발생 리스트를 사용할 경우 컴파일 타임 에러를 사용하여 버그를 방지할 수 있다. 2 배열은 실체화(relify)되는 반면, 리스트는 그렇지 않다. 배열은 런타임에 타입을 체크한다. 하지만 제네릭은 원소타입을 컴파일 타..
[이펙티브자바]아이템27. 비검사 경고를 제거하라 최대한 많은 비검사 경고를 지우자. - 모든 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있는 잠재적 가능성이 있다. 따라서 최선을 다해 제거하자. - 비검사 경고 예시) 아래 코드에서 HashSet의 타입을 명시해주라는 경고가 뜬다. // Set로 형변환이 필요하다는 경고 발생 Set exaltation = new HashSet(); // 다이아몬드 연산자를 사용한 수정 (자바 7부터 지원) Set exaltation = new HashSet(); 경고를 제거할 수 없지만, 타입 안전하다고 확신한다면 @SupressWarnings("unchecked") 애너테이션을 달아 경고를 숨기자. - 예외가 일어나지 않을 것이라 확신한다면 불필요한 경고는 지우는것이 좋다. 잠재적인 버그에..
[이펙티브자바]아이템26. 로타입은 사용하지 말라 제네릭(Generic)이란? (사전적 의미) - generic은 직역하면 '포괄적인. 일반적인' 의미이다. 제네릭(Generic)이란? (프로그래밍에서의 의미) - 하나의 자료구조에서 여러가지 타입을 지원하기 위해 탄생 - 특정 타입을 미리 지정해주는 것이 아니라, 사용자가 필요한 타입을 지정하도록 하는 것 // 같은 ArrayList인데 타입만 다르다. 하나의 자료 구조로 통일할 수는 없을까? ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); 제네릭타입(Generic Type) 제네릭 클래스, 제네릭 인터페이스를 통틀어 일컫는 말. 제네릭 클래스, 제네릭 인터페이스 - 클래스, 인터페이스 선언에 타입 매개변수가 쓰일 경우. - ..
[JPA 기본] 4. 엔티티 매핑 객체와 테이블 매핑 방법 @Entity 정의 JPA를 사용해서 테이블과 매핑할 클래스 Entity 사용시 주의사항 - public이나 protected 접근제어자가 붙은 기본 생성자는 필수 (리플렉션 사용에 필요) - final 클래스, enum, interface, inner 클래스 사용 불가. - 저장할 필드에 final 사용 불가 name 속성 - 기본 값: 클래스 이름을 그대로 사용한다. - 별도의 이름을 지정하고 싶을 경우 name 속성 사용 // Member 그대로 사용 @Entity public class Member { .... } // 별도의 이름 지정 @Entity(name="Users") public class Member { .... } @Table 정의 엔티티와 매핑할 테이블 지정..
[JPA 기본] 3. 영속성 관리 영속성 컨텍스트 JPA 중요 개념 2가지 1. 객체와 관계형 데이터베이스 매핑하기(Object Relational Mapping) 2. 영속성 컨텍스트 -> 이번 포스팅에서 소개 예정 엔티티 매니저 팩토리와 엔티티 매니저의 동작 원리 (1)클라이언트의 요청이 온다. (2) 엔티티 매니저 팩토리는 요청별로 엔티티 매니저를 만든다. (3)각 매니저는 커넥션 풀의 커넥션을 이용하여 DB와 통신한다. 영속성 컨텍스트 - 정의: 엔티티를 영구 저장하는 환경 - 코드 EntityManger.persist(entity) ** 영속성 컨텍스트에 entity를 저장한다. DB에 직접저장하는 것이 아님을 주의하자. ** 트랜젝션에서 commit하는 시점에 DB에 쿼리 전달 된다. 엔티티 매니저 & 영속성 컨텍스트 - 엔티..
[책 요약]이펙티브자바 21~25 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라. 인터페이스 내 디폴트 메서드의 등장 자바 8 이전에는 기존 구현체를 수정하지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 자바 8 이후, 핵심 컬렉션 인터페이스에 디폴트 메서드가 여러개 추가 되었다. 디폴트 메서드가 기존 구현체에 런타임 오류를 일으킬 수도 있다. 예. apache.commons.collections4.SynchronizedCollection 위 클래스는 객체의 동기화를 제공한다. 그런데 4.4 버전 이전에는 removeIf가 구현체에 없어서, 인터페이스에서 제공하는 디폴트 메서드를 사용하였다. 그 결과 동기화가 없어서, 클라이언트는 예상했던 결과를 받지 못할 수도 있다. 예를 들어, 멀티 스레드 환경에서 Synchroni..