- 내장서버를 이용해 별도의 설정 없이 독립 실행이 가능한 스프링 애플리케이션
- 톰캣, 제티 또는 언더토우와 같은 웹 애플리케이션서버(WAS) 자체내장
- 빌드구성을 단순화 하기 위한 'Spring Boot Stater' 의존성 제공
- XML 설정없이 단순 자바 수준의 설정 방식제공
- JAR를 이용해 자바 옵션만으로 배포가능
- 애플리케이션의 모니터링과 관리를 위한 스프링 액추에이터 제공
운영체제:window10
통합개발환경(IDE):인텔리제이
JDK버전:JDK11
스프링부트 버전:2.5.2
데이터베이스: MySQL
빌드 툴: 메이븐
JPA(java Persistence API)는 자바ORM(Object Relational Mapping)기술에 대한 API 표준입니다. 객체와 관계형 데이터베이스를 매핑해주는 것을 말합니다.
ORM기술의 표준 명세로 자바에서 제공하는 API로,JPA는 인터페이스고 이를 구현하는 대표적인 구현제로 Hibernate,EclipseLink,DataNuleus,OpenJPA,TopLink등이 있습니다.
JPA 인터페이스를 구현할 가장 대표적인 오픈소스가 Hibernate(하이버네이트)이며 실질적인 기능은 하이버네이트에 구현돼 있는 것입니다.
특정 데이터베이스에 종속되지 않음
객체지향적 프로그래밍
생산성 향상
복잡한쿼리 처리
성능저하위험
학습시간
엔티티 : 데이터베이스의 테이블에 대응하는 클래스
엔티티매니저 팩토리: 엔티티 매니저인스턴스를 관리하는 주체이며, 애플리케이션 실행시 한개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성합니다.
엔티티매니저: 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공합니다.
영속성 컨텍스트: JPA를 이해하기 위해서는 영속성 켄텍스트를 이해하는것이 가장 중요합니다.
엔티티를 영구저장하는 환경으로 엔티티 매니저를 통해 영속성 컨텍스트에 접근합니다.
생명주기 | 내용 |
---|---|
비영속(new) | new키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는 상태 |
영속(managed) | 엔티티가 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리되는 상태 |
준영속상태(detached) | 영속성 컨텍스트에 엔티티가 저장되었다가 분리된 상태 |
삭제상태(remove) | 영속성 컨텍스트와 데이터 베이스에서 삭제된 상태 |
영속성 컨텍스트 사용시 이점은 애플리케이션과 데이터베잇, 사시에 영속성 컨텍스트라는 중간꼐층을 만들었기 떄문에 버퍼링,캐싱등을 할수 있는 장점이 있습니다.
영속성 컨텍스트에는 1차 캐시가 존재하며 Map<key,VALUE>로 저장됩니다.
entityManager.find() 메소드 호출시 영속성 컨텍스트의 1차 캐시를 조회합니다.
엔티티가 존재할 경우 해당 엔티티를 반환하고, 엔티티가 없으면 데이터 베이스에서 조회후 1차 캐시에 저장및 반환합니다.
하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 시 같은 엔티티 조회 보장랍니다. 바로 1차 캐시에 저장된 엔티티를 조회하기 떄문에 가능합니다.
영속석 컨텍스트에는 쓰기 지연 SQL 저장소가 존재합니다.
entityManager.persist()를 호출하면 1차 캐시에 저장되는것과 동시에 쓰기 지연SQL 저장소에 SQL문이 저장됩니다. 이렇게 SQL을 쌓아두고 트랜잭션을 커밋하는 시점에 저장된 SQL문들이 flush되면서 데이터베이스에 반영됩니다. 이렇게 모아서 보내기 떄문에 성능에서 이점을 볼수 있습니다.
JPA는 1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷값을 갖고 있습니다.
그리고 1차 캐시에 저장된 엔티티와 스냅샷을 비교 후 변경 내용이 있다면 UPDATE SQL문을 쓰기 지연 SQL저장소에 담아둡니다. 그리고 데이터베이스에 커밋시점에 변경 내용을 자동으로 반영합니다, 즉UPDATE문을 호출할 필요가 없습니다.