본문 바로가기

TIL

[TIL 2022-2-25] JPA 값 타입, PriorityQueue

JPA 값 타입은 불변객체여야한다.

임베디드 타입을 포함한 모든 값 타입은 불변객체여야 한다.(값을  변경할 수 없는 객체, 생성자 또는 정적팩터리 메서드를 만들어 인스턴스를 생성한 이후에 setter 등으로 값을 변경할 수 없어야함)

 

값타입은 참조가 달라도 그 안에 값이 같으면 같은 것으로 봐야하므로 equals()를 재정의 해줘야한다.

 

 

값 타입 컬렉션

@ElementCollection,  @CollectionTable 을 통해 지정해준다. 값 타입 컬렌션읜 영속성 전이(Cascade) 와 고아 객체 제거 기능을 필수로 가진다.(라이프사이클을 주인 객체에 의존). 기본적으로 지연 로딩으로 설정되어있다. 

 

다 정리하면 엔티티 타입 객체는 스스로 라이프사이클을 관리하지만 값 타입은 모든 것을 주인 객체에 의존한다.

 

값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다.

 

특정상황에서 간단한 상황에서 사용한다고 하는데 아직 그 상황이 직관적으로 느껴지진 않는 것 같다. 일단 앞으로 개발할 때 엔티티로 개발해보고 값타입이 더좋을 상황이 있을지 생각해 봐야겠다.

 

 

참고

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com


프로그래머스 level 2 - 더 맵게

https://programmers.co.kr/learn/courses/30/lessons/42626

 

코딩테스트 연습 - 더 맵게

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같

programmers.co.kr

힙과 관련된 문제였는데 Java.util 에 PriorityQueue를 활용해서 아래와 같이 풀 수 있었다.

- 원소를 추가하는 offer(), add() 두가지 메소드가 있는데 add() 에서 결국 offer()를 호출하기 때문에 아무거나 써도 상관없다.

PriorityQueue의 add() 메소드 

 

- 만약 최대힙을 구현하고자 한다면 아래와 같이 선언한다.

    PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

 

가장 우선순위에 있는 값을 제거하고 반환하는데에는 poll(), remove() 메소드가 있다. poll은 만약 큐가 비어있으면 null을, remove는 NoSuchElementException 예외를 발생시킨다. remove 메소드를 보면 내부에서 poll()을 호출하고, 반환값이 null 이면 예외를 던지는 것을 확인할 수 있다.

AbstractQueue의 remove()메소드

 

 

조건문의 연산순서 참고

https://jeong-pro.tistory.com/138

 

Java 성능 좋은 분기문을 쓰는 방법, if문에서 연산 순서 (if문에서 좋은 퍼포먼스를 만들기, && ||

Java에서 좋은 if문 코드를 작성하는 방법 코드 분석을 하다가 우연히 if문의 '||' 연산자와 '&&' 연산자를 보면서 최적화에 대해 생각해보게 되었다. 여러 참고 사이트를 보면서 나름대로 정리를

jeong-pro.tistory.com