전체 글 318

JPQL 기초

특징 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리 한다. SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. SELECT 문 SELECT m FROM Member AS m where m.username = 'Hello' SELECT m FROM Member m where m.username = 'Hello' // AS는 생략할 수 있다. JPQL 키워드는 대소문자를 구분하지 않고 엔티티와 필드는 대소문자를 구분한다. JPQL은 별칭을 필수로 사용해야 한다. TypeQuery, Query 반환할 타입을 명확하게 지정할 수 있으면 TypeQuery, 반환 타입을 명확하게 지정할 수 없으면 Query 객체를..

JVM/JPA 2023.06.25

값 타입 컬렉션 @ElementCollection @CollictionTable

값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @Elementcollection, @CollectionTable 어노테이션을 사용한다. 값 타입 컬렉션은 영속성 전이와 고아 객체 제거 기능을 필수로 가지고 있다. 값 타입 컬레션도 조회할 때 페치 전략을 선택할 수 있는데 LAZY가 기본이다. 값 타입 컬렉션에 변경 사항이 발생하면 값 타입 컬렉션이 매핑된 테이블의 연관된 모든 데이터를 삭제하고, 현재 값 타입 컬렉션 객체이 있는 모든 값을 데이터베이스에 다시 저장한다. 따라서 값 타입 컬렉션이 매핑된 테이블에 데이터가 많다면 일대다 관계를 고려해야 한다. 예제 Member 엔티티 하나의 3개의 테이블을 사용하고 있는 예제이다. @Entity public class Member { @Id @Genera..

JVM/JPA 2023.06.25

임베디드 타입(복합 값 타입) @Embedded, @Embeddable

새로운 값 타입을 직접 정의해서 사용하는 것을 임베디드 타입이라고 한다 주의 임베디드 타입의 인스턴스를 여러 엔티티에서 공유하는 것은 데이터 무결성에 굉장히 치명적이다. 인스턴스를 복제해서 사용하거나 임베디드 타입에서 setter를 없애자. 예제 코드 @Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Embedded Period workPeriod; @Embedded Address homeAddress; @Embedded @AttributeOverrides({ // 같은 타입을 사용할 경우 컬럼명을 재정의한다. 위치는 엔티티 필드에!! @AttrbuteOverride(name="city", col..

JVM/JPA 2023.06.24

영속성 전이, 고아 객체

CascadeType.ALL + orphanRemoval = true를 동시에 사용하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다. 영속성 전이: cascade 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용하는 옵션이다. 부모 엔티티와 함께 자식 엔티티도 저장하거나 삭제할 수 있다. 종류 CascadeType.ALL 모두 Cascade를 적용한다. CascadeType.PERSIST Save, Persist 시 함께 영속화한다.. CascadeType.MERGE 업데이트 시 함께 업데이트한다. CascadeType.REMOVE 삭제 시 함께 삭제된다 CascadeType.REFRESH 새로고침 시 함께 새로고침 한다. CascadeType.DET..

JVM/JPA 2023.06.23

즉시 로딩, 지연 로딩, 프록시

JPA 기본 페치 전략 연관된 엔티티가 하나면 즉시 로딩을, 컬렉션이면 지연 로딩을 사용한다. 모든 연관관계에 지연 로딩을 사용하고 개발 완료단계에 꼭 필요한 곳에만 즉시 로딩을 사용하는 것을 권장한다. 즉시 로딩 JPA는 선택적 관계면 외부 조인을 사용하고 필수 관계면 내부 조인을 사용한다. 외부 조인보다 내부 조인이 성능가 최적화에서 더 유리하므로 NULL을 허용하지 않는다면 JPA에게 확실히 알려주는 게 좋다. 컬렉션 즉시 로딩은 항상 외부 조인을 사용한다. @JoinColumn(nullable = false) 혹은 @ManyToOne(optional = false) 프록시 프록시는 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 엔티티 생성을 요청하는데 이것을 초기화라 한다. EntityManag..

JVM/JPA 2023.06.23

@SecondaryTable, @SecondaryTables

하나의 엔티티에 필드를 여러 테이블에 나누어 매핑할 때 사용한다. 테이블당 엔티티를 각각 만들어서 일대일 매핑하는 것을 권장한다. 이 방법은 항상 두 테이블을 조회하므로 최적화하기 어렵다. @SecondaryTable 속성 기능 기본값 name 매핑할 다른 테이블의 이름 pkJoinColumns 매핑할 다른 테이블의 기본 키 컬럼 속성 예제 코드 @Entity @Table(name = "BOARD") @SecondaryTable(name = "BOARD_DETAIL", pkJoinColumns = @PrimaryKeyJoinColumn(name = "BOARD_DETAIL_ID")) public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") ..

JVM/JPA 2023.06.19

@JoinTable

조인 테이블은 주로 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 사용한다. 그렇지만 일대일, 일대다, 다대일 관계에서도 사용한다. 속성 기능 name 연결 테이블의 이름 joinColumns 현재 엔티티를 참조하는 외래키 inverserJoinColumns 반대 방향 엔티티를 참조하는 외래 키 일대일 조인 테이블 만일 이런 구조를 고민하고 있다면 Child를 연관관계의 주인으로 만들자. @Entity public class Parent { @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; private String name; @OneToOne @JoinTable(name = "PARENT_CHILD", joinColumns = @J..

JVM/JPA 2023.06.19

Session Manger 를 이용하여 EC2에 연결하기

AWS Systems Manager에서는 Session Manager라는 기능을 제공하는데 사전에 SSM-Agent가 설치된 EC2 SSH를 연결할 수 있는 기능을 제공한다. Session Manager를 사용하기 위해서는 EC2와 IAM, 그리고 로컬 컴퓨터에 각각의 준비가 되어있어야 한다. SSM 특징 인바운드 포트를 열거나 SSH 키를 관리할 필요 없이 관리형 인스턴스에 안전하게 연결한다. Bastion Host 나 Key Pair 가 필요 없다. SSH가 아닌 HTTP를 사용하여 접속이 가능하다. 선택한 목적 또는 활동에 따라 AWS 리소스를 그룹화하여 중앙 집중식 관리가 가능하다. 주의 인터넷으로 아웃바운드 허용해주어야 한다. 퍼블릭 IP가 필요 없다고 하지만 퍼블릭 IP가 없으면 연결할 수 없..

DevOps/AWS 2023.06.18

AWS Aurora DB

AWS가 MySQL 및 PostgreSQL을 호환해서 만든 RDBMS로 RDS와는 다른 AWS만의 RDBMS로 기존 소스들을 AWS에 맞게 고쳐서 만들어졌다. 특징 성능 오로라는 기존의 MySQL과 PostgreSQL 데이터베이스보다 뛰어난 성능을 제공합니다. 오로라는 분산 스토리지 및 복제 기능을 활용하여 처리량과 응답 시간을 향상시킵니다. 또한 자동 스케일링 기능을 통해 워크로드의 요구에 따라 자동으로 리소스를 조정할 수 있습니다. 확장성 오로라는 수평 및 수직 확장이 가능합니다. 수평 확장을 통해 여러 개의 인스턴스를 사용하여 데이터베이스 처리 능력을 증가시킬 수 있으며, 수직 확장을 통해 인스턴스 유형을 업그레이드하여 더 많은 리소스를 할당할 수 있습니다. 내구성 오로라는 데이터를 여러 가용 영역..

DevOps/AWS 2023.06.18

@MapsId

일대일 식별 관계에서 부모의 PK를 자식의 PK로 사용할 때 사용된다. @MapsId 는 FK와 매핑한 연관관계를 PK 에도 매핑하겠다는 뜻이다. 예제 코드 @Entity public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") private Long id; private String title; @OneToOne(mappedBy = "board") private BoardDetail boardDetail; } @Entity public class BoardDetail { @Id private Long boardId; @MapsId // BoardDetail.boardId 매핑 @OneToOne @JoinColumn(name = "BOARD..

JVM/JPA 2023.06.18
728x90