JPA, ORM, JDBC

Mijeong Ryu·2023년 7월 15일
0

JDBC(Java Database Connectivity)란 무엇인가요?
JDBC는 자바 언어를 통해 데이터베이스에 접속하고 SQL 쿼리를 실행하기 위한 자바 API입니다.
JDBC는 데이터베이스 연결, 쿼리 실행, 결과 처리 등을 위한 다양한 인터페이스와 클래스를 제공합니다.

ORM(Object-Relational Mapping)이란 무엇인가요?
(OOP객체를 관계형 데이터와 매핑 시켜주는 기술, 쿼리가 아닌 메서드로 데이터를 조작한다.)
ORM은 객체와 데이터베이스 간의 매핑을 자동화하는 기술입니다. 객체와 데이터베이스의 구조와 관계를 매핑하여 데이터를 객체로 다룰 수 있게 합니다.
ORM은 객체 지향적인 프로그래밍 모델을 사용하므로, 객체 간의 관계를 쉽게 표현하고 데이터베이스에 반영할 수 있습니다. (단점으로는 DBMS의 고유 기능을 이용하기 어렵고 시스템이 복잡할 경우 난이도가 올라간다, 복잡한 쿼리문은 sql이 직관적일 수 있다. 장점은 dbms를 교체하는 거대한 작업에도 수정할 부분이 훨씬 줄어든다.)

JPA(Java Persistence API)란 무엇인가요?
JPA는 자바에서 제공하는 ORM 기술의 표준 인터페이스입니다. JPA는 ORM을 구현한 여러 프레임워크들을 사용할 수 있도록 표준 인터페이스를 제공합니다.
JPA는 객체와 데이터베이스 간의 매핑을 자동화하고, 개발자가 데이터베이스에 대한 저수준의 코드를 작성하지 않고도 데이터를 조작할 수 있게 합니다.

JDBC와 ORM(JPA)의 차이점은 무엇인가요?
JDBC는 자바 언어를 통해 데이터베이스에 접속하고 SQL 쿼리를 실행하기 위한 API입니다. 개발자가 직접 SQL 쿼리를 작성하고 매핑 설정을 관리해야 합니다.
ORM은 객체와 데이터베이스 간의 매핑을 자동화하여 개발자가 SQL 쿼리를 작성하거나 매핑 설정을 작성하지 않고도 데이터를 조작할 수 있게 합니다.

JPA와 Hibernate의 관계는 무엇인가요?
Hibernate은 JPA의 구현체 중 하나로, JPA를 구현한 ORM 프레임워크입니다.
JPA는 자바 표준 인터페이스로, JPA를 구현한 여러 ORM 프레임워크 중 하나로 Hibernate를 선택하여 사용할 수 있습니다. Hibernate는 JPA의 기능을 제공하면서 확장된 기능을 사용할 수 있습니다.

JPA에서 엔티티(Entity)란 무엇인가요?
JPA에서 엔티티는 데이터베이스의 테이블과 매핑되는 객체를 말합니다.
엔티티는 @Entity 어노테이션을 사용하여 정의하며, JPA는 엔티티의 상태 변화를 추적하여 데이터베이스에 반영합니다.

JPA의 영속성 컨텍스트(Persistence Context)란 무엇인가요?
영속성 컨텍스트는 JPA에서 엔티티를 관리하는 환경을 말합니다.
영속성 컨텍스트는 엔티티의 생명 주기를 추적하고, 엔티티와 데이터베이스 간의 변경을 관리합니다.
영속성 컨텍스트는 1차 캐시, 지연 로딩, 동일성 보장 등의 기능을 제공하여 성능과 일관성을 향상시킵니다.

JPA에서 지연 로딩과 즉시 로딩의 차이는 무엇인가요?
지연 로딩(Lazy Loading)은 연관된 엔티티를 실제로 사용할 때까지 데이터베이스에서 로딩을 미루는 방식입니다. 연관된 엔티티가 실제로 필요한 경우에만 데이터베이스 쿼리를 실행합니다.
즉시 로딩(Eager Loading)은 연관된 엔티티를 즉시 로딩하는 방식입니다. 엔티티를 조회할 때 연관된 엔티티도 함께 로딩됩니다.
지연 로딩은 필요한 시점에 데이터베이스 쿼리를 실행하여 성능을 최적화할 수 있지만, 즉시 로딩은 데이터베이스 조회 성능을 희생하고 객체 그래프를 즉시 사용할 수 있는 장점이 있습니다.

JPA의 영속성 전이(Cascade)란 무엇인가요?
영속성 전이는 엔티티 간의 연관 관계에서 한 엔티티의 상태 변화가 연관된 엔티티에도 전파되는 것을 말합니다.
예를 들어, 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하고 싶은 경우에 영속성 전이를 사용할 수 있습니다.
영속성 전이는 CascadeType 속성을 사용하여 설정하며, ALL, PERSIST, MERGE, REMOVE 등 다양한 옵션을 제공합니다.

MyBatis와 JPA의 차이점은 무엇인가요?
MyBatis는 SQL Mapper로서, SQL을 직접 작성하고 매핑하는 방식을 사용합니다. 개발자가 직접 SQL 쿼리를 작성하고 매핑 설정을 작성해야 합니다. (myBatis : SQL 분리를 목적으로 XML로 관리하는 방식 )
JPA는 객체와 데이터베이스 간의 매핑을 자동화하고 객체 지향적인 방식으로 데이터를 조작할 수 있도록 지원합니다. SQL을 직접 작성하지 않고 JPA를 사용하여 데이터 조작을 할 수 있습니다.

ORM 프레임워크를 사용하는 이유는 무엇인가요?
ORM 프레임워크를 사용하면 객체와 데이터베이스 간의 매핑을 자동화하여 개발자가 SQL 쿼리를 작성하고 매핑 설정을 관리하는 번거로움을 줄일 수 있습니다.
객체 지향적인 방식으로 데이터를 다룰 수 있으며, 객체의 생명 주기를 관리하고, 데이터베이스와의 상호작용을 추상화하여 개발 생산성을 향상시킬 수 있습니다.

ORM 프레임워크를 사용할 때 고려해야 할 사항은 무엇인가요?
데이터베이스와의 성능 이슈나 복잡한 쿼리 등 특정 상황에서 ORM의 성능이나 유연성에 제한이 있을 수 있습니다.
ORM 프레임워크의 설정이나 매핑 관련된 작업에 익숙해져야 하며, 잘못된 사용이나 성능 최적화 부족으로 인한 부작용에 대한 이해도 필요합니다.

JPA에서 영속성 컨텍스트의 상태 변화는 어떤 것들이 있나요?
JPA에서 영속성 컨텍스트의 상태 변화는 총 4가지로 구분됩니다.
비영속 (Transient): 영속성 컨텍스트와 관계가 없는 상태로, 데이터베이스에 저장되지 않은 상태입니다. 즉, 객체는 생성 되었지만 영속성 컨텍스트에 의해 저장되지 않은 상태입니다.
영속 (Persistent): 영속성 컨텍스트에 관리되는 상태로, 데이터베이스와 동기화되지 않은 변경 사항을 가지고 있을 수 있습니다.
준영속 (Detached): 영속성 컨텍스트와 관계는 있지만, 영속성 컨텍스트에서 분리된 상태입니다. 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다.
삭제 (Removed): 영속성 컨텍스트에서 삭제된 상태로, 데이터베이스에서도 삭제될 예정입니다.

JPA에서 연관 관계의 종류는 어떤 것들이 있나요?
JPA에서 연관 관계의 종류는 크게 단방향 연관 관계와 양방향 연관 관계로 나뉩니다.
단방향 연관 관계는 한 엔티티에서 다른 엔티티로의 연관 관계를 설정하는 것입니다.
양방향 연관 관계는 두 엔티티 간에 서로를 참조하고 있는 연관 관계를 설정하는 것입니다. 양방향 연관 관계는 @OneToOne, @OneToMany, @ManyToOne, @ManyToMany 어노테이션으로 설정할 수 있습니다.

JPA에서 지연 로딩과 즉시 로딩의 선택 기준은 무엇인가요?
지연 로딩은 연관된 엔티티를 실제로 사용할 때까지 로딩을 미루는 방식이며, 즉시 로딩은 연관된 엔티티를 즉시 로딩하는 방식입니다.
지연 로딩은 데이터베이스 쿼리를 최적화하여 필요한 시점에만 데이터를 로딩하므로, 성능 최적화에 유리한 경우에 선택합니다.
즉시 로딩은 연관된 엔티티를 자주 사용하거나, 연관된 엔티티의 수가 적을 때 유리합니다.

JPA에서 영속성 전이(Cascade)와 orphanRemoval의 차이점은 무엇인가요?
영속성 전이는 부모 엔티티의 상태 변화가 연관된 자식 엔티티에도 전파되는 기능을 말합니다.
orphanRemoval은 부모와 자식 사이의 연관 관계가 끊어지면 자동으로 해당 자식 엔티티를 삭제하는 기능입니다.
차이점은 영속성 전이는 연관된 엔티티의 상태 변화를 전파시키는 것이고, orphanRemoval은 연관된 엔티티의 연관 관계가 끊어지면 삭제하는 것입니다.

JPA에서 영속성 컨텍스트를 플러시하는 시점은 언제인가요?
JPA에서 영속성 컨텍스트를 플러시하는 시점은 주로 다음과 같습니다.
트랜잭션 커밋 시: 영속성 컨텍스트에 변경된 엔티티를 데이터베이스에 동기화하여 영구 저장소에 반영합니다. 동기화!
명시적인 플러시 호출: EntityManager의 flush() 메서드를 호출하여 영속성 컨텍스트를 강제로 플러시할 수 있습니다.
쿼리 실행 시: 쿼리 실행 전에 영속성 컨텍스트를 플러시하여 최신 상태의 데이터를 조회할 수 있도록 합니다.

JDBC와 ORM(JPA)의 장단점은 무엇인가요?
JDBC의 장점: 직접 SQL 쿼리를 작성하여 데이터베이스에 접근하므로 세밀한 제어가 가능하며, 복잡한 쿼리와 성능 최적화에 용이합니다.

JDBC의 단점: SQL 쿼리 작성과 매핑 설정을 개발자가 직접 해야 하므로 개발 생산성이 떨어지고, 객체 지향적인 접근이 어렵습니다.

ORM의 장점: 객체와 데이터베이스 간의 매핑을 자동화하므로 SQL 쿼리 작성과 매핑 설정의 번거로움을 줄여 개발 생산성을 향상시킵니다. 객체 지향적인 프로그래밍 모델을 사용하여 유지보수와 코드 가독성이 용이합니다.

ORM의 단점: 복잡한 쿼리와 성능 최적화에 한계가 있을 수 있으며, ORM 프레임워크 자체의 학습 비용과 설정 관리가 필요합니다.

JPA에서 영속성 컨텍스트와 데이터베이스 트랜잭션의 관계는 어떤가요?
JPA에서는 영속성 컨텍스트의 변경 내용은 데이터베이스 트랜잭션을 커밋할 때 데이터베이스에 반영됩니다.
트랜잭션 범위 내에서 엔티티를 변경하면 영속성 컨텍스트가 변경 사항을 추적하고, 트랜잭션 커밋 시 변경된 엔티티를 데이터베이스에 자동으로 반영합니다.
롤백이 발생하는 경우에는 영속성 컨텍스트의 변경 내용도 롤백되어 데이터베이스와 일관성을 유지합니다.

쓰기지연이란?
트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
em.find(member)를 사용해 member를 저장해도 바로 INSERT SQL이 DB에 보내지는 것이 아니다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아둔다. 그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 DB에 보낸다. 이것을 트랜잭션을 지원하는 쓰기 지연이라 한다.

플러시란?
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 영속성 컨텍스트의 엔티티를 지우는게 아니라 변경 내용을 데이터베이스에 동기화하는 것이다.

플러시의 흐름
1. 변경 감지가 동작해서 스냅샷과 비교해서 수정된 엔티티를 찾는다.
2. 수정된 엔티티에 대해서 수정 쿼리를 만들거 SQL 저장소에 등록한다.
3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.

플러시하는 방법
1. em.flush()
2. 트랙잭션 커밋시 자동 호출
3. JPQL 쿼리 실행시 자동 호출

영속성 컨텍스트의 특징?
1차캐시: 똑같은 걸 두번 조회하는 경우, 처음 조회할 때 해당 데이터를 1차 캐시에 올려 두 번째 조회 시에는 쿼리문을 수행하지않고 캐시에서 가져옴으로서 생산성을 높입니다.

동일성 보장: 1차캐시에 이미 있는 엔티티이면 그대로 반환하기때문에 여러 번 조회했을 때 동일성을 보장합니다.

트랜잭션을 지원하는 쓰기 지연: 커밋이 되기 전까지는 쿼리문을 쓰기 지연 저장소에 모아뒀다가 커밋하는 시점에 한번에 flush합니다.

변경 감지(Dirty Checking): 영속성 컨텍스트가 관리하는 영속 상태 엔티티를 대상으로, 해당 엔티티가 변경되면 update쿼리를 수행해줍니다.

1차 캐시에 처음 저장할 때 동시에 스냅샷 필드를 저장하는데,그 후 commit이나 flush가 일어날 때 엔티티의 현재 값과 스냅샷을 비교하고 변경 사항이 있으면 update 쿼리를 수행하는 것입니다.

지연로딩: 예를 들어 1:다의 관계가 있을 때, 1만 확인하고 싶을땐 굳이 다의 데이터까지 가져올 필요가 없다. 이럴때 지연로딩으로 설정해두면 다에관해선 가짜 객체인 프록시를 가져옴으로서 해결합니다. 추후 실제로 조회가 필요할때 실제 엔티티를 가져옵니다.

JDBC와 JPA는 다른것인가? 아니다.
JPA는 데이터베이스와 객체를 매핑하는 기술일 뿐, 내부적으로는 데이터베이스와의 통신을 위해 JDBC를 사용한다.
또한 JPA도 JDBC와 마찬가지로 인터페이스이기 때문에 구현체가 필요하고, 그 구현체 중 하나가 Hibernate이다.

JPA(ORM)

  • 장점

1) RDB에 종류와 관계없이 사용 가능하다. 추후 DB 변경이나 코드 재활용에 용이하다.

2) 기본적인 CRUD 제공과 페이징 처리 등 상당 부분 구현되어 있어 비지니스 로직에 집중할 수 있다.

3) 테이블 생성, 변경 등 엔티티 관리가 간편하다.

4) 쿼리에 집중할 필요 없어 빠른 개발이 가능하다.

  • SQL을 몰라도 된다는 뜻은 아니다. JPA는 SQL을 잘할수록 훨씬 더 잘 사용할 수 있다.
    위 말의 뜻은 select * from user 같은 쿼리를 직접 작성할 필요 없이 Java 코드로 간편하게 사용할수 있다는 뜻
  • 단점

1) 어렵다.

: 단방향, 양방향, 임베디드 관계 등 이해해야할 내용이 많으며, 연관관계 이해 없이 잘못 코딩 했을 시 성능상의 문제와 동작이 원하는대로 되지 않는 일이 발생한다.

ex) Board 엔티티에 List의 형태로 Reply 엔티티가 있을 시, 단방향 연관관계인 경우 하나의 reply가 변경되어도 모두 삭제되고 다시 전부 insert되는 경우

하나의 Board 조회 시 reply를 Join이 아닌 여러개의 select문으로 하나하나 읽어오는 문제

MyBatis(SQL Mapper)

  • 장점

1) JPA에 비해 쉽다.

: SQL 쿼리를 그대로 사용하기에 복잡한 Join, 튜닝 등을 좀더 수월하게 작성 가능하다.

2) SQL의 세부적인 내용 변경 시 좀 더 간편하다.

3) 동적 쿼리 사용 시 JPA보다 간편하게 구현 가능하다.

  • 단점

1) 데이터 베이스 설정 변경 시 수정할 부분이 너무 많다. (Oracle의 페이징 쿼리를 MySQL에서 사용 불가능!)

2) Mapper작성부터 인터페이스 설계까지 JPA보다 많은 설계와 파일, 로직이 필요하다.

3) 특정 DB에 종속적이다.

JPQL : 객체 지향적인 쿼리 언어.SQL을 추상화한 것, 좀 더 복잡한 쿼리문 작성 가능, 객체지향적인 특징을 활용해야 할 때, 집계 함수나 그룹화 작업을 수행해야 할 때 이용. (단점 : 코드 복잡해질 수 있음)
JPA : 간편하며, 반복적인 CRUD 작업을 간단히 처리, 데이터베이스에 종속적이지 않음 (단점 : 복잡한 쿼리를 처리하기 어렵다)

0개의 댓글