
Api를 통해 사용자에게 지속적으로 데이터를 제공하기 위해서는 영속적인 저장소가
있어야 한다.
이럴 때 일반적으로 현업에서 RDBMS(Relational DataBase Management System)
이렇게 다양한 DB서버들을 공통적으로 대응하기 위해 자바에서는 JDBC 라는 공통된
스펙을 제공, 벤더에서는 이를 기반으로 개발자에게 자바에서 사용할 수 있는 접속
라이브러리를 제공한다. 이를 통해서 다른 데이터 베이스더라도 JDBC 라이브러리를
이용하여 Connection 객체를 얻어 접속이 가능하다.
DB에서 데이터를 얻기위해서는 DML문을 DB서버로 전달해야하는데, 시스템의 규모의 커짐과 로직이 복잡도를 해결하기위해 SQLMapper(Mybatis), ORM(Jpa, Hibernate)으로 개발을 진행하게 되었다.

JPA는 애플리케이션과 JDBC 사이에서 동작하며, 개발자가 JPA를 활용했을 때 JDBC API를 통해 SQL을 호출하여 데이터베이스와 호출하는 전개가 이루어진다. 즉, 개발자는 JPA의 활용법만 익히면 DB 쿼리 구현없이 데이터베이스를 관리할 수 있다.
JPA는 컴파일 시점에서 오류를 잡아준다.
추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.
JPA를 만들었을 당시에는 NoSQL이 존재하지 않았다. 이후 NoSQL을 포함한 새로운 스펙을 재정하였고 그것이 Spring Data이다.
spring-boot-starter-data-jpa관련 의존성을 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
yml에도 추가로 설정 해준다
jpa:
# sql 실행쿼리 콘솔 출력
show-sql: true
# Hibernate
database: mysql
hibernate:
# create를 하면 기존 DB를 Drop하고 테이블을 새로 Create한다.
ddl-auto: update
# camelCase로 작성하면 DB에는 camel_case로 작성된다.
strategy: org.hibernate.cfg.ImprovedNamingStrategy
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
# ddl-auto (true로 바꿔주어야 ddl-auto 사용가능)
generate-ddl: false
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optinal<User> findbyUserEmail(String email);
}
public interface JpaRepository<T, ID extends Serializable>
Generic Type 장점
제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
T : Type
E : Element
K : Key
V : Value
N : Number