데이터 접근 기술 - MyBatis

: mybatis.configuration.map-underscore-to-camel-case를 true로 설정 시 언더바를 카멜케이스로 자동 변경
: XML에서는 데이터 영역에 <, >와 같은 특수문자 사용 불가로 치환해서 쓰거나 CDATA 구문 활용

 

동적 SQL
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
- <sql>로 SQL 재사용 가능, 불러오는거는 <include refid=””>
- 컬럼명과 프로퍼티 명 다를 시 별칭 사용하는 것 이외에도 resultMap 선언해서 사용 가능

 

데이터 접근 기술 - JPA

: JPA는 Java Persistence API의 약자고 자바 진영의 ORM 기술 표준 
: ORM은 Object-relational mapping의 약자로 객체와 관계형 데이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것
: JPA에서 가장 중요한 부분은 객체와 테이블을 매핑하는 것
: JPA는 public 또는 protected 의 기본 생성자가 필수

@Data
@Entity //JPA가 사용하는 객체라는 뜻
public class Item {

	@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 테이블의 PK와 해당 필드 매핑
	private Long id;
	
	@Column(name = "item_name", length = 10)
	private String itemName;
	...

	public Item() {
  }
	...
}

: 생성자를 보면 스프링을 통해 엔티티 매니저라는 것을 주입받은 것을 확인
: JPA의 모든 동작은 엔티티 매니저를 통해서 이루어짐
: 엔티티 매니저는 내부에 데이터소스를 가지고 있고, 데이터베이스에 접근할 수 있음
: JPA의 모든 데이터 변경(등록, 수정, 삭제)은 트랜잭션 안에서 이루어져야 하므로 Repository에 @Transactional 작성해주기
: JPA에서 객체를 테이블에 저장할 때는 엔티티 매니저가 제공하는 persist() 메서드 를 사용

 

JPQL

:JPA는 JPQL(Java Persistence Query Language)이라는 객체지향 쿼리 언어를 제공
: 주로 여러 데이터를 복잡한 조건으로 조회할 때 사용

 

데이터 접근 기술 - 스프링 데이터 JPA

:스프링 데이터 JPA는 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리
- 공통 인터페이스 기능
- 쿼리 메서드 기능

 

JpaRepository 사용법

// JpaRepository 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID>
public interface ItemRepository extends JpaRepository<Item, Long> {
	...


	...
}

쿼리 메서드 기능 대신에 직접 JPQL을 사용하고 싶을 때는 @Query와 함께 JPQL을 작성.

// 쿼리 직접 실행
// 파라미터 바인딩은 @Param("")
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);

: 스프링 데이터 JPA는 spring-boot-starter-data-jpa 라이브러리 build.gradle 추가
: JpaRepository 인터페이스를 인터페이스 상속 받으면 기본적인 CRUD 기능을 사용 가능
: 이름이나 가격으로 검색 기능은 공통으로 제공할 수 있는 기능이 아님
: 쿼리 메서드 기능 사용해서 구현
: @Query로 직접 쿼리 실행

 

데이터 접근 기술 - Querydsl

: 쿼리를 Java로 type-safe하게 개발할 수 있게 지원하는 프레임워크
: 주로 JPA쿼리(JPQL)에 사용
: 단점으로는 Q코드 생성을 위한 APT를 설정해야함

 

DSL(Domain Specific Language,도메인 특화 언어)
: 특정한 도메인에 초점을 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어
: 특징으로는 단순하고 간결하다는 점

// 예시코드
JPAQueryFactoryquery = newJPAQueryFactory(entityManager);
QMemberm = QMember.member;

List<Member> list = query
	.select(m)
	.from(m)
	.where(
    	m.age.between(20,40).and(m.name.like("김%"))
	)
	.orderBy(m.age.desc())
	.limit(3)
	.fetch(m)

데이터 접근 기술 - 활용 방안

트레이드 오프(구조의 안정성 vs 단순한 국조와 개발의 편리서 사이 선택)
: DI, OCP를 지키기 위해 어댑터를 도입하고, 더 많은 코드를 유지
: 어댑터를 제거하고 구조를 단순하게 가져가지만, DI, OCP를 포기