본문 바로가기

Study/개발일지

[백엔드온라인TIL] JPA 학습 체크리스트 (47일차)

영속성(Persistence)

1. 데이터를 생성한 프로그램이 종료되더라도 사리지지 않는 데이터의 특성을 말한다.

 

2. 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램이 종료되면 모두 잃어버리게 된다. 때문에 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 데이터를 영구적으로 저장하여 영속성을 부여한다.

 

1. JDBC 와 Persistence Framework 의 차이점

 

SQL Mapper와 ORM

Persistence Framework는 SQL Mapper  ORM으로 나뉜다.

 

1. ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로

    생성해주지만, SQL Mapper는 SQL을 명시해줘야 한다.

 

2. ORM은 관계형 데이터베이스의 '관계'를 Object에 반영하는것이 목적이라면,

    SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.

 

SQL Mapper

1. SQL문장으로 직접 데이터베이스를 다룬다.

     A. 즉 SQL Mapper는 SQL을 명시해 줘야 한다.

 

     B. Ex) MyBatis, jdbcTemplates등

 

ORM

1. 객체를 통해 간접적으로 데이터베이스를 다룬다.

 

2. 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.

 

3. Persistence API라고도 할 수 있다.

     A. Ex) JPA, Hibernate 등

 

 

MyBatis vs JdbcTemplate

JdbcTemplate과 MyBatis의 코드 차이를 알아보자.

JdbcTemplate

 
<code />
 
String sql = "update item " +
  "set item_name=:itemName, price=:price, quantity=:quantity " +
  "where id=:id";

MyBatis -SQL

 
<code />
 
<update id="update">
      update item
      set item_name=#{itemName},
          price=#{price},
          quantity=#{quantity}
      where id = #{id}
</update>
  • XML을 기반으로 라인이 길어져도 문자 더하기에 대한 불편함이 없다.

 

JdbcTemplate - 동적 쿼리

 
<code />
 
String sql = "select id, item_name, price, quantity from item"; //동적 쿼리
  if (StringUtils.hasText(itemName) || maxPrice != null) {
      sql += " where";
}
  boolean andFlag = false;
  if (StringUtils.hasText(itemName)) {
      sql += " item_name like concat('%',:itemName,'%')";
      andFlag = true;
  }
  if (maxPrice != null) {
      if (andFlag) {
          sql += " and";
      }
      sql += " price <= :maxPrice";
  }
  log.info("sql={}", sql);
  return template.query(sql, param, itemRowMapper());

 

MyBatis - 동적 쿼리

 
<code />
 
<select id="findAll" resultType="Item">
      select id, item_name, price, quantity
      from item
      <where>
          <if test="itemName != null and itemName != ''">
              and item_name like concat('%',#{itemName},'%')
          </if>
          <if test="maxPrice != null">
              and price &lt;= #{maxPrice}
          </if>
      </where>
</select>
  • 동적 쿼리를 편리하게 작성할 수 있는 기능을 제공한다.

JdbcTemplate은 스프링에 내장된 기능이고, 별도의 설정없이 사용할 수 있다는 장점이 있는 반면에 동적 쿼리 적용이 복잡하다. MyBatis는 동적 쿼리를 매우 편리하게 작성할 수 있다는 장점이 있으나, 별도의 설정이 필요하다는 단점이 있다.

 

 

 

3.

 

SQL Mapper

: Object와 SQL의 필드을 매핑하여 데이터를 객체화하는 기술.

객체와 테이블간의 관계를 매핑하는 것이 아니라, SQL문을 직접 작성하고 쿼리 수행결과를 어떠한 객체에 매핑하여 줄 지 바인딩하는 방법. 즉 SQL 의존적인 방법이다.

ex) JdbcTemplate, Mybatis

 

o MyBatis

: SQL을 xml파일로 분리하여 관리하고, SQL결과와 객체 인스턴스의 매핑을 도와주는 역할을 수행.

동적쿼리를 지원하여 다이나믹하게 변경되는 쿼리 작성가능.

 

--> SQL을 개발자가 직접 작성하는 문제.

--> DBMS에 종속적인 문제.

--> 비슷한 쿼리를 반복적으로 작성해야하는 문제

--> 객체와 관계형 테이블 구조간 패러다임 불일치 발생.

 

 

ORM (Object Relation Mapping)

: Object와 DB테이블을 매핑하여 데이터를 객체화하는 기술.

CRUD 관련 메소드를 사용하면 자동으로 SQL이 만들어져 개발자가 반복적인 SQL을 직접 작성하지 않아도 되고, DBMS에 종속적이지 않다. 또한 복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper를 혼용하여 사용할 수 있다.

Java ORM 기술에 대한 인터페이스 표준을 JPA라고 하고, 이를 구현한 가장 대표적인 기술이 Hibernate이다.

ex) Hibernate, EclipseLink, DataNucleus

 

--> DBMS에 의존하지 않음으로써 도메인과 비즈니스 로직 설계에 더 집중할 수 있는 장점

--> 요구사항 변화에 빠른 대처 가능한 장점

--> 복잡한 통계성 쿼리보다는 실시간 처리용 쿼리에 적합

 

 

 

4. MyBatis 가 쿼리를 생성하는 2가지 방법

 

Mybatis 에서 SQL을 저장한 MAPPER를 연결하는 방법은 크게 2가지 이다.

 

1) Mapper namespace 를 직접 입력하여 호출하는 방법.

2) Interface 클래스를 만들어서 매핑, 호출하는 방법.

 

 

서로의 장단점이 있는데 

### 1번은 

장점

- 설정이 간단하다.(mybatis xml 파일 설정.)

- 파일을 추가로 생성할 필요가 없다.

- 코딩이 줄어든다.

 

 

단점

- namespace 와 SQL ID를 풀로 써야하기 때문에 오타로 인한 에러유발이 가능하다.

- 쿼리에 대한 주석을 넣으려면 Mapper 파일을 직접 열어야 하는데, 해당 Mapper파일을 Find로 직접 찾아야 한다.

- 어떤 ID들이 있는지 확인하려면 쿼리가 긴게 많을경우 알아보기가 힘들다.

- SqlSession 을 이용하여 조회할 경우 조회의 성격에 대해 알아야 한다.

. 단일이면 selectOne, 여러행의 경우 selectList  등 분류해서 메서드를 사용해야 한다.

 

 

5.영속성 컨텍스트와 쓰기지연의 연관성에 대해서 설명할 수 있다.

 

영속성 컨텍스트는 엔티티에 수정이 일어났을 경우 자동으로 변경을 감지하는 기능이다. 영속성 컨텍스트의 내부에 스냅샷과 현재 엔티티를 비교해 변경을 감지한다. 변경이 감지된 경우 쓰기 지연 SQL 저장소에 UPDATE 쿼리가 생성되고 해당 쿼리가 DB에 날아간다.

728x90