분류 전체보기 55

JPQL - (기본 문법, 쿼리 API, 페이징 API, 집합과 정렬)

기본 문법과 쿼리 API JPQL도 SQL과 비슷하게 SELECT, UPDATE, DELETE 문을 사용할 수 있다. 참고로 엔티티를 저장할 때는 EntityManager.persist() 메소드를 사용하면 되므로 INSERT 문은 없다. select_문 :: = select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update_절 [where_절] delete_문 :: = delete_절 [where_절] SELECT 문 SELECT 문은 다음과 같이 사용한다. SELECT m FROM Member AS m where m.username = 'Hello' 엔티티와 속성은 대소문자를 구분한다. (Member, username..

JPA 2023.09.25

객체지향 쿼리 언어 소개

JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. EntityManager.find() 메소드를 사용하면 식별자로 엔티티 하나를 조회할 수 있다. 이렇게 조회한 엔티티에 객체 그래프 탐색을 사용하면 연관된 엔티티들을 찾을 수 있다. 이 둘은 가장 단순한 검색 방법이다. 식별자로 조회 EntityManager.find() 객체 그래프 탐색 a.getB().getC() 이 기능만으로 애플리케이션을 개발하기는 어렵다. 예를 들어 나이가 24살 이상인 회원을 모두 검색하고 싶다면 좀 더 현실적이고 복잡한 검색 방법이 필요하다. 결국 데이터는 데이터베이스에 있으므로 SQL로 필요한 내용을 최대한 걸러서 조회해야 한다. 하지만 ORM을 사용하면 데이터베이스 테이블이 ..

JPA 2023.09.22

값 타입

값 타입은 3가지로 나눌 수 있다. 기본값 타입(자바 기본 타입, 래퍼 클래스, String) 임베디드 타입 컬렉션 값 타입 1. 기본값 타입 @Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int age; ... } Member 엔티티에서 String, int가 값 타입이다. Member 엔티티는 id라는 식별자 값도 가지고 생명주기도 있지만 값 타입인 name, age 속성은 식별자 값도 없고 생명주기도 회원 엔티티에 의존한다. 따라서 회원 엔티티 인스턴스를 제거하면 name, age 값도 제거된다. 그리고 값 타입은 공유하면 안된다. 2. 임베디드 타입(복합 값 타입) 새로운 ..

JPA 2023.09.22

자바의 Stream Method

여러가지 자바의 스트림 메소드를 알아보도록 하겠다. 일단 User 엔티티를 하나 생성한다. public class User { private int id; private String name; private String email; public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name =..

JAVA 2023.09.12

getOrDefault 함수

"java.util.Map" 인터페이스의 "getOrDefault(Object key, V defaultValue)" 메서드는 맵에서 지정된 키에 해당하는 값을 가져오는 메서드이다. 이 메서드는 키가 맵에 존재하면 해당 값을 반환하고, 키가 맵에 존재하지 않으면 지정된 기본값('defaultValue')을 반환한다. 메서드 시그니처는 다음과 같다. V getOrDefault(Object key, V defaultValue) key: 찾고자 하는 엔트리의 키 defaultValue: 키가 맵에 존재하지 않을 때 반환하는 기본값 다음은 예시이다. Map map = new HashMap(); map.put("apple", 5); map.put("banana", 3); int count = map.getOrDe..

JAVA 2023.09.11

영속성 전이: CASCADE

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다. JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. // 부모 엔티티 @Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent") private List children = new ArrayList(); ... } //자식 엔티티 @Entity public class Child { @Id @GeneratedValue private Long id; @ManyToOne private Parent parent; ... } 부모 엔티티가 여러가지 자식 엔티티를 가지고 있다...

JPA 2023.07.31

즉시 로딩과 지연 로딩

즉시 로딩 즉시 로딩(Eager Loading)을 사용하려면 @ManyToOne의 fetch 속성을 FetchType.EAGER로 지정한다. // 즉시 로딩 설정 @Entity public class Member { ... @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team; ... } 위의 코드에서 회원과 팀을 즉시 로딩으로 설정했다. // 즉시 로딩 실행 코드 Member member = em.find(Member.class, "member1"); Team team = member.getTeam(); //객체 그래프 탐색 따라서 em.find(Member.class, "member1")로 회원을 조회하는..

JPA 2023.07.31

프록시

객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 하지만 자주 함께 사용하는 객체들은 조인을 사용해서 함께 조회하는것이 효과적이다. JPA는 즉시 로딩과 지연 로딩이라는 방법으로 둘을 모두 지원한다. 프록시 엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다. 예를 들어 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라 사용될 때도 있지만 그렇지 않을 때도 있다. //회원 엔티티 @Entit..

JPA 2023.07.28

@SecondaryTable : 엔티티 하나에 여러 테이블 매핑

@SecondaryTable을 사용하면 한 엔티티에 여러 테이블을 매핑할 수 있다. @Entity @Table(name = "BOARD") @SecondaryTable(name = "BOARD_DETAIL", pkJoinColumns = @PrimaryKeyJoinColumn(name = "BOARD_DETAIL_ID")) public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") private Long id; private String title; @Column(table = "BOARD_DETAIL") private String content; ... } Board 엔티티는 @Table을 사용해서 BOARD 테이블과 매핑했다. 그리고 @S..

JPA 2023.06.13

조인 테이블

데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 1. 조인 컬럼 사용(외래 키) 2. 조인 테이블 사용(테이블 사용) ▼ 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 외래키에 null을 허용하는 관계를 선택적 비식별관계라한다. 회원과 사물함을 조인할 때 외부조인(OUTER JOIN)을 사용해야한다. 실수로 내부 조인을 사용하면 사물함과 관계가 없는 회원은 조회되지 않는다. 그리고 회원과 사물함이 아주 가끔 관계를 맺는다면 외래 키 값 대부분이 null로 저장되는 단점이 있다. ▼ 조인 테이블 사용 조인 테이블이라는 별도의 테이블을 사용해서 연관관계를 관리한다. 조인 컬럼을 사용하는 방법은 단순히 외래키 컬럼만 추가해서 연관관계를 맺지만..

JPA 2023.06.13