자바/JPA 10

JPA Entity 정적 팩토리 메소드에 관하여

JPA의 Entity를 새롭게 생성하려면 다음과같은 3가지 선택지가 주어진다. 1. 생성자로 생성하기 2. 정적 팩토리 메소드로 생성하기 3. @Builder 로 생성하기 그 중에서도 정적 팩토리 메소드 부분을 소개하겠다. 개인적으로도 이 방식이 더 마음에 든다. 정적 팩토리 메소드의 생김새 다음과 같이, public static(정적) 을 사용한다. 그렇다면 정적 팩토리 메소드를 왜 사용할까?? 정적 팩토리의 장점 3가지를 살펴보려고한다. 1. 자유롭게 메소드명을 설정할수 있다. 첫번째가 생성자 메소드고, 두번째가 정적 팩토리 메소드이다. 생성자 메소드 같은경우엔, 반드시 자신의 클래스명을 입력해야한다. 반면에, 정적 팩토리 메소드는 메소드명을 작성할수 있기때문에, 좀 더 직관적인 사용이 가능하다. 솔..

자바/JPA 2022.09.19

Querydsl 기능 (2)

Querydsl 서브쿼리 작성법이다. 서브쿼리를 작성하는법은 기존 네이티브SQL과 흡사하다. Querydsl의 Case작성방법이다. 간단한 Case문은 when()에다 조건문을, then() 에 결과를 넣으면된다. 그 밖의 결과값은 otherwise()를 사용한다. 좀더 복잡한 쿼리를 작성하고싶을땐 CaseBulder를 사용한다. CaseBuilder에는 between , gt, goe , lt, lot , ne , in, notin 등등 다양한 조건에대해 결과값을 넣어줄수있다. 쿼리dsl에서 고정적인 문자값 또는 상수값을 넣고싶다면 Expressions.constant()를 사용하자. 또한 조회한 값에 추가로 문자열을 붙이고싶다면 concat()을 사용하요 덧붙히면된다. 이 Querydsl의 기능은 만..

자바/JPA 2022.07.27

Querydsl 기능 (1)

Querydsl의 정렬기능 쿼리dsl 에서 정렬은 orderBy()로 정렬할수있다. 정렬의 조건은 여러개 설정할수있고, 첫 파라미터가 먼저 적용이된다. 사진은 1. 나이순으로 역순 2. 나이이름으로 오름차순이다. 쿼리 dsl 의 페이징기능이다. offset()은 페이지를 읽을 첫 시작점을, limit()는 몇개의 페이지를 읽을지 제한을 거는것이다. 쿼리 dsl에는 sum , avg , max, min, count 와같은 집합기능을 쓸수있다. select에 타입이 다양한 값이 들어오면, 자동으로 튜플형태로 리스트를 반환한다. 이럴땐 튜플을 꺼내와서 값이 정확한지 확인을 해봐야한다. 그룹핑을 할때, 일반 SQL문과같이 gruopBy를 사용한다. 이 쿼리는 잘보면 최적화가 되어있지않다. member -> te..

자바/JPA 2022.07.27

스프링 JPA Querydsl 소개

JPA의 데이터를 넣을때 쿼리문 , 즉 SQL문은 필수적인 요소다. 간단한 데이터 CRUD는 SQL문을 만들 필요가없지만, 다양한 조건과 테이블 병합, 최적화를 하려면 JPQL 과 Querydsl이 필요하다. JPQL vs Querydsl 전자에 써잇는 queryFactory(JPAQueryFactory)를 이용한 쿼리문이 Querydsl 후자에 써잇는 EntityManager를 이용한 createQuery가 JPQL이다. 둘 다 Member테이블에서 이름이 member1 이며, 나이 10을 뽑는 동일한 쿼리다. 둘 중에 추천하는것은 역시 Querydsl 이다. Querydsl의 눈에 띄는 장점은 역시 1.높은 생산성과 낮은 난이도이다. JPQL은 쿼리스트링을 작성할때, 한문자 한문자 일일이 다쳐야한다...

자바/JPA 2022.07.25

JPA 값타입

JPA 에서 쓰이는 값타입을 분류를 해보자. 엔티티 타입: • @Entity로 정의하는 객체 • 데이터가 변해도 식별자로 지속해서 추적 가능 • 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 : int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 엔티티 타입은 값타입이 여러개가 모여 생성된다고 보면된다. 여기서 값타입을 더욱 세부 분류해보자. • 기본값 타입 • 임베디드 타입(embedded type, 복합 값 타입) • 컬렉션 값 타입(collection value type 기본값타입 • 예): String name, int ag..

자바/JPA 2022.06.27

JPA : 상속관계 매핑

Java에선 부모클래스 와 자식클래스간의 상속관계라는것이 존재한다. 하지만, DB에선 상속관계가 없다. 비슷한 개념으로는 슈퍼클래스와 ,서브클래스 라는 개념이있다. 여기서 등장하는것이 JPA가 스프링단에 있는 상속관계와 DB단에있는 슈퍼,서브클래스 관계를 매핑해주는 기능을 지원해준다. @Inheritance 상속관계를 나타내려면, @Ingeritance 어노테이션을 사용한다. @Ingeritance는 부모에게만 붙는다. • JOINED: 조인 전략 • SINGLE_TABLE: 단일 테이블 전략 • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 상속을 받는전략은 이 3가지가 존재한다. 하지만, JOINED 전략만 사용하는걸 추천한다. 단일테이블 같은경우는 하위클래스의 모든 정보를 담기때문에 테..

자바/JPA 2022.06.15

JPA: 연관관계 매핑 (1:1 , 1:N, N:1, N:M)

데이터베이스에 테이블은 서로 연관관계를 가질 수 있다. 그러므로 우리가 Spring에서 다루는 Entity들 사이에서도 서로 연관관계를 명시해줘야한다. 만약, 연관관계를 매핑안하고 사용할경우 Team 테이블에 멤버가 하나들어가면, Member테이블에도 하나 더 추가해야하는 번거로움이 발생한다. DB는 매핑만해주면 알아서 넣어주기때문에 상관은없지만 객체의 연관관계는 그렇지않다. 그 관계를 명시해줄 어노테이션 4개를 이번포스팅에 남겨보려고한다. @OneToOne @ManyToOne @OneToMany @ManyToMany @OneToOne 1대 1 관계 매핑이다. 코드에서 보이는것과 같이 연관관계 매핑할시에 @JoinColumn이 사용되는데, 이것은 다른 테이블에 어떤속성과 연관을맺을지 그 이름을 정해주는 ..

자바/JPA 2022.06.14

JPA: 엔티티(Entity) 매핑

데이터베이스에 있는 테이블정보와 매핑하려면 Spring단에서 엔터티를 만들어 매핑해야만한다. 그 엔티티를 만들고 매핑하기위한 어노테이션은 다음과같다. • 객체와 테이블 매핑: @Entity, @Table • 필드와 컬럼 매핑: @Column • 기본 키 매핑: @Id • 연관관계 매핑: @ManyToOne,@JoinColumn ... @Entity • @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 유의사항 • 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) • final 클래스, enum, interface, inner 클래스 사용X • 저장할 필드에 final 사용 X 사용법은 Member ..

자바/JPA 2022.06.14

JPA 의 기초(CRUD) 다루어보기

시작하기에앞서서 : JPA를 다루기 앞서 사용할 JPA와 데이터베이스를 준비해야한다. 데이터베이스로는 가볍고 쓰기편한 H2데이터베이스를 사용했다. 1. 외부라이브러리 다운받기 Maven으로 생성할때 hibernate(JPA)와 h2 데이터베이스를 의존시키자. Gradle, Maven 둘다 start.spring.io 사이트를 통해서 JPA와 h2라이브러리를 추가해서 생성하면 편하다. https://start.spring.io/ 2. DB설정하기 Resources-> META-INF -> persistence.xml을 생성해서 설정을해줘야한다. 필수 속성은 Driver , user, password ,url 을 넣어주자. JPA-DB를 연결해줄 필수속성이 있어야 연결이된다. 5번째에 dialect 기능은 ..

자바/JPA 2022.01.07

스프링: 왜 JPA를 쓰는가?

JPA(Java Persistence API)란? Java의 ORM (객체 관계 매핑 Object Relation Mapping) 기술이다. JPA는 이제껏 개발자들이 힘들게 SQL을 작성하고, 객체와 DB간에 매핑과 설정을해주는걸 대신 처리해주는 기술이다. 이걸 통해, 마치 Collection에 데이터를 넣어놧다 조회하고 수정하는 객체지향다운 DB조작이 가능한셈이다. 이전에 JDBC를 이용하여 MYSQL과 연결할때 쓰던 코드다. 이렇게 복잡하고 긴 코드를 JPA가 대신 간편하게 설정해준다. 객체와 관계형 데이터베이스는 서로 다른 패러다임을 가진다. 1. 상속 2. 연관관계 3. 데이터 타입 4. 데이터 식별 방법 상속의 문제 객체 상속 관계에서는 부모와 자식 관계란게 존재한다. 하지만, 데이터베이스엔 ..

자바/JPA 2022.01.05