핵심을 파악해 기술을 이해하려면 그 역사와 배경을 아는 것이 효율적이다.
: persistence(영속성) -> 영구히 저장되는 어떤 것
데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성
JDBC API 명세를 DriveManager가 구현하고 각 제품마다 Drive만 바꿔주면 된다.
DriverManager를 이용해서 Connection인스턴스를 얻고,
Connection을 통해서 Statement를 얻고,
Statement를 이용해서 ResultSet를 얻어 조회하거나 사용하게된다.
이러한 이용에 불편함점이 있었는데, 중복된 코드,쿼리문 작성,Connection 관리, 예외 처리등이 있었다.
JDBC API만을 사용할 때보다, Connection에 대한 Configuration을 JdbcTemplate이라는 클래스에 담아 Spring을 통해 주입받는다. 또, 메소드에 쿼리를 매핑해두고 RowMapper를 통해 쿼리 메소드의 결과를 통해 DB의 각 row마다 하나의 인스턴스화를 지원해준다. 추상화가 많이 이뤄져 이전보다 편하게 사용하고 있는 모습을 볼 수 있다.
개발자는 어떤 DB를 사용할 것인지에 대해 연결 파라미터를 넣어주면 Spring이 알아서 연결을 열어준다. 또, 개발자가 원하는 쿼리를 설정하고 해당 쿼리에 들어가는 파라미터를 넣어주면 Spring이 해당 statement를 알아서 수행해주며, 결과 resultset에 대한 루프, 예외처리, 트랜잭션, 종료까지 많은 부분을 대신해주며 기존 방식에서의 불편을 덜어줬다.
기존 JDBC의 문제점인 String으로 쿼리를 작성하는 대신 java에서 XML로 바꿨다.
객체지향적으로 구현되어 있는 구조에서 관계형데이터베이스와 연결하는 것을 간편하게 하기 위해 등장한 기술이다.
EntityManager는 말 그대로 Entity를 관리해주는 역할을 한다.
Hibernate, JPA 측에서는 Entity의 Context를 4개로 분리한다.Detached, Managed, Removed, Transient.
Entity는 먼저 Persist(entity)를 통해 영속성 컨텍스트에 올라오고 해당 Entity는 EntityManager 에 관리 받는 상태가 된다.그상태에서 Flush()가 발생하면 DB에 접근하고 그 시점에 SQL이 생성되어 동작하게된다.
즉 쿼리를 개발자가 직접 관리하지 않고 EntityManager에게 맡기게 된다.
lazy loading 이란?
중요도가 떨어지거나 당장 화면에 보이지 않는 요소들의 로딩을 우선적으로 시행하지 않으면서 웹페이지 로딩 포퍼먼스를 최적화하는 기술
Dirty Checking 이란?
Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 기술
caching 이란?
동일한 데이터에 반복해서 접근해야 하거나 많은 연산이 필요한 일일 때, 결과를 빠르게 이용하고자 성능이 좋은 / 가까운 곳에 저장하는 것
EntityManager가 복잡하기 때문에 Spring에서 한번 더 추상화를 해 개발자가 보다 편리하게 이를 이용할 수 있도록 제공한다.
Core Concpet로 Repository를 제안
객체지향으로 설계된 프로그램에서 DB에 접근하다보니 너무 많은 기술(EntityManger, Lazy Loading 등) 들이 사용됐다. 이에 DDD 구조로 한꺼번에 Entity를 주고 받는 방식으로 DB에 접근하는 방법을 고안해 냈다.
JDBC API를 직접 구현해서 사용하는 방식으로 동작된다. Spring data이므로 Respository 개념은 가지고 있다.
DDD(Domain-Driven Design) : 프트웨어 개발 방법론 중 하나로, 소프트웨어를 개발할 때 도메인에 집중하여 설계하는 방법
12월 회고 : 싸피에서 1학기 동안 Java, JDBC, SQLMapper 등 학습했지만.. ORM도 공부해야 하고 할게 너무 많고 하고 싶은 것도 너무 많은 12월이다.🥲