# Hibernate

✏️ JDBC, JPA/Hibernate, Mybatis의 차이
⭐️ 영속성(Persistence) 영속성(Persistence)란 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다. 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어 버리게 된다. 때문에 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 데이터를 영구하게 저장하여 영속성을 부여한다. Persistence Layer 프로그램 아키텍처에서 데이터에 영속성을 부여해주는 계층을 말한다. JDBC를 이용하여 직접 구현할 수 있지만 Persistence framework를 이용한 개발이 많이 이루어진다. >계층 참고 프레젠테이션 계층 (Presentation laye

JPA - 영속성 컨택스트(비영속과 영속)
1. 엔티티 매니저 팩토리와 엔티티 매니저 JPA의 작동순서를 크게 봤을 때 다음과 같다. EntityManagerFactor에 의해 EntityManager가 생성되고 EntityManager를 통해 영속성 컨텍스트에 접근한다. EntityManager가 영속성 컨텍스트가 아니다! 영속성 컨텍스트는 EntityManger 내부에 존재하고, EntityManager를 이용하여 영속성 컨텍스트를 관리하는 것이다. 요청이 들어올 때마다 EntiryManagerFactory는 EntityManager를 생성하여 각 용청에 할당한다. 2. 영속성 컨텍스트 엔티티를 영구 저장하는 환경 영속성 컨텍스트에서

JPA와 Hibernate, 그리고 Session Factory
📍 JPA (Jakarta Persistence API) JPA는 자바 플랫폼에서 관계형 데이터베이스를 다루기 위한 자바 API. JPA는 객체 관계 매핑(ORM)을 제공하며, 데이터베이스의 테이블과 자바 객체 간의 매핑을 쉽게 하게 만들어 줌. JPA를 사용하면 개발자는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호 작용할 수 있음. JPA는 Java EE(이전에는 Java EE라고 불렸지만 Jakarta EE로 이름이 변경됨) 및 Java SE 응용 프로그램에서 사용할 수 있으며, 여러 구현체 중에서 가장 유명한 것 중 하나가 Hibernate임. JPA에 대해 조금 더 상세하게 쓴 내 포스팅 📍 Hibernate **Hibernate는 JPA 스펙의 구현체 중

코드로 보는 OSIV (Open Session In View)
OSIV(Open-Session-In-View) OSIV(Open Session In View) 란?? OSIV(Open Session In View)은 영속성 컨텍스트 관리 영역을 뷰(View)까지 확장하는 기능이다. Open Session In View라 불리는 이유는 JPA의 구현체인 Hibernate 에서 EntityManager의 구현체로 Session 을 사용한다. JPA에서는 OEIV(Open-EntityManager-In-View) 로 부르지만 통상적으로 Open-Session-In-View 로 부른다. Spring-Boot 의 프로퍼티 기반 OSIV 설정 과정 Spring-Boot 는 프로퍼티를 기반으로 한 자동 설정을 지원한다. JpaBa

왜 ORM, JPA인가?
ORM 개념 Object-Relational Mapping DB 데이터와 객체를 매핑하여 객체-데이터 간 관계를 바탕으로 SQL을 자동으로 생성하는 기술 ORM 종류 JPA (feat. Hibernate, Spring Data JPA) Java Persistence API 자바 ORM 기술 표준(기술 명세) Hibernate는 JPA의 구현체. (서로 다른 관계가 아니라 JPA라는 기술 명세를 구현한 것이 Hibernate) Hibernate말고도 DataNucleus, EclipsLink 등의 다른 JPA 구현체도 있다. Spring Data JPA는 Spring Framework에서 제공하는, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있게해주는 모듈이다. JPA를 + Hibernate 같은 구현체를 쉽게 사용할 수 있도록 추상화한 것이다. Repository 추상화 -> interface 선언만으로 구현

[SpringBoot] Hibernate와 JPA의 개요
Hibernate란? >데이터베이스에서 java 객체를 유지/저장하기 위한 프레임워크 📌 장점 low-level의 모든 SQL을 처리한다 개발해야하는 JDBC 코드의 양을 최소화한다 ORM을 제공한다 📌ORM(Oriented-Relational Mapping) java 클래스와 데이터베이스 테이블 간의 매핑을 정의한다 클래스와 테이블 간의 매핑을 설정하면, 객체를 데이터베이스에 저장하고 검색할 수 있다 JPA란? >Java Persistence API 자바 기

[Studies] MyBatis Framework
When the scale of an application was small, using JDBC was sufficient for development. However, as the number of internet users exploded and application functionality became more complex, the limitations of developing with traditional JDBC became apparent. When developing with the traditional JDBC approach, not only did developers have to implement numerous repetitive SQL statements, but the SQL queries themselves also became intricate. As a result, naturally, database-related frameworks like M

[JPA] Hibernate schema-validation 오류
그동안 JPA 구현체인 Hibernate를 자주 사용하며 ddl-auto 옵션을 지정하여 편리하게 DB Table을 생성(H2 In-memory DB를 사용하여 테스트하는 경우) 또는 검증했습니다. validate 옵션을 사용해 검증을 하는 과정에서 위와 같은 오류를 만나게 되었습니다. 분명 schema에 해당 테이블이 존재했지만 Hibernate는 테이블이 누락되었다고 인식하였습니다. 간단하게 해결 가능한 문제이지만 혹시나 비슷한 오류를 마주치거나 나중에도 다시 볼 수 있게 글로 정리해 보았습니다. 📌 Hibernate 우선 Hibernate에 대해 간단하게 알아보도록 하겠습니다. Hibernate는 객체 관계형 매핑(ORM: Object-Relational Mapping)
AWS_SAA_준비(17)
EC2 절전 모드(Hibernate) 인스턴스 중지 EBS 디스크 데이터는 다시 시작할 때까지 그대로 유지 인스턴스 종료 루트 불륨이 삭제되게 했다면 인스턴스도 삭제 그렇게 설정하지 않은 다른 볼륨은 그대로 남음 인스턴스 다시 시작하면 운영 체제 먼저 부팅, EC2 사용자 데이터 스크립트 실행, 그 뒤 애플리케이션 실행, 캐시 구성되는 과정이 오래 걸림 인스턴스 절전(Hibernate) RAM에 있던 In-memory는 그대로 보존 루트 경로의 EBS 볼륨에 기록 됨 루트 EBS 볼륨을 암호화 필수, 볼륨 용량도 RAM을 저장하기 충분해야 함 인스턴스 부팅이 더 빨라짐 인스턴스 RAM 크기는 최대 150GB 오래 실행되는 프로세스를 갖고 있고 중지하지 않을 때 RAM 상태를 저장하고 싶을 때 빠르게 재부팅을 하고 싶을 때 서비스 초기화가 시간을 많이 잡아먹어

[JPA] org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
오늘도 시작된 오류타임~! 심지어 이거 전에 마주친 오류임 ㅎ~!ㅋㅋㅋㅋ!!!!!!!!!! 🖕🖕🖕🖕 그때 적어놨으면 쉽게 해결했을텐데 또 오류 기록 안해서 같은 오류도 두번 검색해서 찾아내쥬 ㅎㅎㅋ~! 내 수준 알만하고주 잘 저장된다.. 오류 없이.. 안녕하세요? 바보입니다?

JPQL - fetch join 기본
이번에는 JPQL에서 굉장히 중요한 페치 조인에 대해서 알아보자. JPQL - 페치 조인(fetch join) 기본 SQL 조인 종류 X JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 페치조인 ::= [ LEFT [OUTER] | INNER ] JOIN FETCH 조인 경로 엔티티 페치조인 엔티티 페치 조인 회원을 조회하면서 연관된 팀도 함께 조회 (SQL 한 번에) SQL을 보면 회원 뿐만 아니라 팀(T.*)도 함께 SELECT [JPQL] select m from Member m join fetch m.team [SQL] SELECT M.\, T.\ FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID 회원과 그와 관련된 팀을 조회한다고 가

페이징 API
페이징 API JPA는 페이징을 다음 두 API로 추상화 setFirstResult(int startPosition) : 조회 시작 위치(0부터시작) setMaxResults(int maxResult) : 조회할 데이터 수 페이징 테스트를 위해 100개의 엔티티 정보를 DB에 저장 페이징 API를 이용하여 조회 조회 결과 
JPQL 프로젝션
프로젝션 SELECT 절에 조회할 대상을 지정하는것 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입 SELECT m FROM Member m -> 엔티티 프로젝션 SELECT m.team FROM Member m -> 엔티티 프로젝션 SELECT m.address FROM Member m -> 임베디드 타입 프로젝션 SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션 DISTINCT 로 중복 제거 프로젝션 - 여러 값 조회 SELECT m.username, m.age FROM Member m Query 타입으로 조회 Object[] 타입으로 조회 new 명령어로 조회 단순 값을 DTO로 바로 조회 SELECT new jpql.MemberDTO(m.username, m.age) FROM Member m 패키지 명을 포함한 전체 클래

JPQL 기본 문법
최근 JPA에 관심이 생겨서 공부중인데 JPA가 제공하는 쿼리 중 JPQL의 기본문법에 대해서 정리해봄. JPQL(Java Persistence Query Language) JPQL 은 객체지향 쿼리언어. 따라서 테이블을 대상으로 쿼리하는것이 아니라 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다 JPQL은 결국 SQL로 변환된다. JPQL 문법 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자 구분O (Member, age) JPQL키워드는 대소문자 구분X (SELECT , FROM, where) 엔티티 이름을 사용함, 테이블 이름이 아님(Member) 별칭은 필수 (m) (as는 생략가능) TypedQuery, Query TypedQuery : 반환 타입이 명확할 때 Query : 반환 타입이 명확하지 않을 때

JPA, Hibernate란 무엇이고 왜 사용하는가?
프로젝트를 진행하면서 이전에는 Mybatis를 사용해서 DB연결을 했는데, JPA와 Hibernate를 사용해보려고 한다. 이것들의 정의와 왜 사용하는지에 대해 알아보자 📌JPA란? JPA(Java Persistence API)는 자바 진영의 ORM(Object Relational Mapping:객체 관계 매핑)의 기술의 표준을 말한다. 간단히 말하면 객체관계 매핑을 구현한 API라고 이해하면 된다. 📌JPA의 특징 JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때 쿼리문을 개발자가 직접 작성하지 않아도 된다. JPA가 개발자 대신 적절한 SQL을 생성해서 객체를 자동으로 Mapping하여 DB에 전달한다. 개발자가 직접 JDBC API를 활용할 때 발생하는 패러다임 불일치 문제를 해결해준다. JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 내부적으로 JDBC
JPA 연관관계 매핑
JPA 에서 가장 중요한 개념이라고 하면 연관관계 매핑과 영속성 컨텍스트가 있다. 이번 포스팅에서는 이 중에서 연관관계 매핑에 대해서 이야기해보려고 한다. ** 객체지향 프로그램에서의 객체와 RDB 에서의 테이블이 서로 연관관계를 맺는 방법이 다르다.** 그렇기 때문에 이 둘의 차이를 채우기 위한 매핑과정이 필요하고 이를 ORM 인 JPA 가 수행하게 된다. 연관관계에서는 아래와 같은 용어들이 등장한다. 방향(Direction) : 단방향 연관관계, 양방향 연관관계 다중성(Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 연관관계의 주인(Owner) 데이터 중심의 모델링 JPA 에서 해주는 연관관계 매핑에 대해서 알아보기에 앞서 잘못된 연관관계 방법에 대해서 살펴보려고 한다. 위 예시는 객체를 RDB 의 **테이블에 맞춰

[JPA] JPA, Hibernate과 Spring Data JPA에 대한 이해
프로젝트를 시작하여 JPA, Hibernate, Spring Data JPA에 대해 제대로 이해하지 못하고 활용하고 있다는 생각이 들었다. 따라서 이번 기회에 이를 정리해 보고자 한다. 1. JPA(Java Persistent API)는 인터페이스이다. ORM(Object-Relation Mapping) JPA를 이해하기 전 ORM(Object-Relation Mapping)의 개념에 대해 이해할 필요가 있다. 간단히 정리하면 아래와 같은 특징이 있다. 객체와 RDB(Relational Database, 관계형 데이터베이스)의 데이터를 자동으로 매핑한다. 객체지향프로그램의 클래스와 RDB의 테이블 사용한다. ORM을 사용하면 SQL Query가 아닌 코드로 데이터 조작할 수 있다. JPA(Java Persistent API) JPA는 Java ORM 기술에 대한 명세이다. 즉, Java 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의

DSL(Domain Specific Language)
DSL 특정 도메인(산업, 분야등 특정 영역)에 특화된 언어 > Dave Thomas “문제 영역의 해결에는 그 영역의 언어를 전제로 둬야하며, 거기에서 프로그래밍 솔루션을 꺼내는 것이 중요하다.” > 내부 DSL 호스트 언어 구문을 이용하여 자체적으로 의존하는 무언가를 만드는 경우에 해당 내부 DSL에서는 API와 DSL의 경계가 모호해 비슷하게 생각하는 경향 존재 → 좀 더 일반 사용자가 알아보기 쉬운 API가 내부 DSL로 생각하면 됨 호스트 언어 능력과 지금까지 사용하던 도구를 그대로 사용할 수 있다는 점, 처리 결과를 쉽게 예측할 수 있어서 해당 언어를 잘 알면 원활한 사용 가능 내부 DSL 형태 메타 프로그래밍의 형태로 언어에 미니 언어를 만들 수 있음 💡[MetaProgramming](https://www.notion.so/MetaProgramming-7eea4d54d30a40788d3f074b3a53d47

ORM, JPA, Hibernate, JPQL, QueryDSL 총 정리
프로젝트를 진행하다가, 정적쿼리를 문자열로 생성하는 JPQL 대신 DTO를 활용해서 필요한 데이터를 자바 코드로 동적으로 조회하는 QueryDSL이 현재 많이 사용된다고 들었다. 이에 전자의 기법은 런타임 에러가 발생해 프로그램에 치명적인 위험을 가한다고 하는데, 이를 보완하기 위해 나온 QueryDSL의 장점에 대해 알아보자! 먼저 그 이전에 ORM과 이러한 객체 관계 매핑(ORM)을 활용하여 데이터베이스의 데이터를 객체로 조회하고 조작하는 방식을 JPA(Java Persistence API)를 알아보자 ORM 프레임워크란 ORM 프레임워크는 Object-Relational Mapping(객체-관계 매핑)을 지원하는 소프트웨어 도구나 라이브러리 ORM 프레임워크는 객체 지향 프로그래밍 언어(예: 자바)와 관계형 데이터베이스 간의 매핑 작업을 자동화하고, 객체와 테이블 간의 변환을 처리하여 개발자가 별도의 SQL 문을 작성하지 않고도 데이터베이스를 조작할 수 있도록 도와

ORM
ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것 객체 지향 프로그래밍 : 클래스 사용 관계형 데이터베이스 : 테이블 사용 → 객체 모델과 관계형 모델 간의 불일치 존재 ORM 장단점 장점 객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있도록 함 재사용 및 유지보수의 편리성이 증가 DBMS에 대한 종속성 감소 단점 ORM 프레임워크 JAVA : JPA, Hibernate, EclipseLink, DataNucleus, Ebean 등 C++ : ODB, QxOrm 등 Python : Django, SQLAlchemy, Storm 등 iOS : DatabaseObjects, Core Data 등 .NET : NHibernate, Database