본문 바로가기

공부 기록/Java

(37)
[JPA] 4장 - 엔티티 매핑(2) - 필드와 컬럼 매핑 필드와 컬럼 매핑: 레퍼런스 @Column - name : 필드와 매핑할 테이블의 컬럼 이름 - nullable : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙는다. - unique : 한 컬럼에 유니크 제약 조건을 걸 때 사용한다. (두 컬럼 이상을 걸 때는 @Table.uniqueConstraints를 사용한다.) - columnDefinition : 데이터베이스 컬럼 정보를 직접 줄 수 있다. - length : 문자 길이 제약 조건(String 타입에만 사용) - precision, scale : 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. BigDecimal, BigInteger 타입에서 사용하며, precision은..
[JPA] 4장 - 엔티티 매핑(1) @Entity - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. - @Entity 적용 시 주의사항 - 기본 생성자는 필수다.(파라미터가 없는 public 또는 protected 생성자) - final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. - 저장할 필드에 final을 사용하면 안 된다. @Table - @Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다. 다양한 매핑 사용 - @Enumerated : enum 매핑 시 사용하는 어노테이션 - @Temporal : 날짜 타입 매핑 시 사용하는 어노테이션 - @Lob : CLOB, BLOB 타입 매핑 시 사용하는 어노테..
[이펙티브 자바 3/E] 아이템10 - equals는 일반 규약을 지켜 재정의하라 equals 메서드는 재정의하지 않는 것이 최선 - 아래에 열거한 상황 중 하나에 해당한다면 재정의하지 않는 것이 최선이다. 1. 각 인스턴스가 본질적으로 고유하다. => 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스가 여기에 해당한다. 2. 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없다. 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 4. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다. - equals가 실수로라도 호출되는 걸 막고 싶다면 아래와 같이 구현하자. @Override public boolean equals(Object o) { throw new AssertionE..
[이펙티브 자바 3/E] 아이템9 - try-finally보다는 try-with-resources를 사용하라 - try-with-resources 구조를 사용하려면 해당 자원이 AutoCloseable 인터페이스를 구현해야 한다. try-finally 구조를 사용한 예 static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } try-with-resources 구조를 사용한 예 static String firstLineOfFile(String path) throws IOException { try (BufferedReader br = new Buff..
[이펙티브 자바 3/E] 아이템8 - finalizer와 cleaner 사용을 피하라 finalizer와 cleaner - 예측할 수 없고, 느리고, 일반적으로 불필요하다. - 즉시 수행된다는 보장이 없다. => 즉, 제때 실행되어야 하는 작업을 절대 할 수 없다. - 심각한 성능 문제도 동반한다. - finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다. - 자바 언어 명세는 finalizer와 cleaner의 수행 시점뿐 아니라 수행 여부조차 보장하지 않는다. ===> 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존해서는 안 된다. finalizer와 cleaner를 대신해줄 묘안 - AutoCloseable을 구현하고, close 메서드를 호출한다.(일반적으로 예외가 발생해도 제대로 종료되도록 ..
[이펙티브 자바 3/E] 아이템7 - 다 쓴 객체 참조를 해제하라 * 다 쓴 참조 : 문자 그대로 앞으로 다시 쓰지 않을 참조 - 가비지 컬렉션 언어에서는 (의도치 않게 객체를 살려두는) 메모리 누수를 찾기가 아주 까다롭다. 객체 참조 하나를 살려두면 가비지 컬렉터는 그 객체뿐 아니라 그 객체가 참조하는 모든 객체(그리고 또 그 객체들이 참조하는 모든 객체...)를 회수해가지 못한다. ===> 해당 참조를 다 썼을 때 null 처리(참조 해제)하면 된다. - 객체 참조를 null 처리하는 일은 예외적인 경우여야 한다. ===> 다 쓴 참조를 해제하는 가장 좋은 방법은 그 참조를 담은 변수를 유효 범위(scope) 밖으로 밀어내는 것이다. 메모리 누수에 주의해야 하는 경우 1. 자기 메모리를 직접 관리하는 클래스 2. 캐시 3. 리스너(listener) 혹은 콜백(cal..
[이펙티브 자바 3/E] 아이템6 - 불필요한 객체 생성을 피하라 - 기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라. - 재사용은 빠르고 세련되다. 하지 말아야할 극단적인 예 String s = new Stirng("yuri"); 개선된 버전 String s = "yuri"; - 생성자 대신 정적 팩터리 메서드(아이템 1)를 제공하는 불변 클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. - 불변 객체만이 아니라 가변 객체라 해도 사용 중에 변경되지 않을 것임을 안다면 재사용할 수 있다. - 박싱된 기본 타입보다는 기본 타입을 사용하고, 의도치 않은 오토박싱이 숨어들지 않도록 주의하자.
[이펙티브 자바 3/E] 아이템5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 의존 객체 주입 패턴 - 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. ===> 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 사용해야 한다. public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { this.dictionary = Objects.requireNonNull(dictionary); } public boolean isValid(String word) { ... } public List suggestions(String typo) { ... } } - 의존 객체 주입 패턴은 자원이 몇 개든 의존 관..