22/05/27 JPA 기본기

김석진·2022년 5월 29일
0

다시 초심으로

목록 보기
13/19

Rest Repositories

Repository로부터 REST API를 자동으로 만들어주는 기술

  • Spring Data REST를 사용
  • 페이징, 정렬,리미트 사용 가능
  • QueryDSL Extension 을 함꼐 사용하면 큰 노력없이 컬럼별 검색 기능까지 사용가능
    도메인이랑 리포지토리만 있는 상태에서 API endpoint와 Controller가 생긴다.

편리하지만 실무에서 사용하지 않는다.

  • 도메인을 직접 api에 노출하는것을 꺼린다.
  • 복잡한 요구사항에 맞춰 api 설계를 하고싶은 경우에는 부적합
  • 설정을 잘하지 않으면 불필요한 API가 노출될 수 있음
  • 실무에서는 API는 필요에 따라 직접 만드는 편

이럴때 고려해보기

  • 내부에서 사용하는 애플리케이션 만들때 (기업, 조직안에서만 사용할 어드민을 만들때)
  • 도메인이 복잡하지 않을때
  • 심플한 CRUD로 구성되어 있을때

Spring Boot Devtools

스프링 부트 개발의 절친, 스프링 부트를 시작한다고 한다면 Devtools와 Acturator를 넣고 해보자

  • 스프링 부트 모듈들의 세부 설정을 개발에 적합한 형태로 자동으로 바꿔준다(ex: 캐시 끄기)
  • Automatic restart- 자바코드가 바뀌면 자동으로 애플리케이션을 재시작(이거는 편리한것같음.. 맨날 빌드하기 귀차너...)
  • Live reload - 정적 페이지(웹페이지<-뷰)가 바뀌면 자동으로 브라우저 웹페이지 refresh

Devtools-Automatic Restart

Restart와 Cold Start의 차이를 알자
자동 재시작은 생각보다 빠르다.

  • devtools가 활성화되면 classloader가 두가지로 나뉨 - base reloader + restart classloader
    • base reloader는 잘바뀌지 않는 것들이 담긴다.
    • restart(triggered by devtools): restart classloader만 갱신한다(개발에서 자주 바뀌는 부분) 이부분이 속도에서 가장 큰 향상을 가지게 하는것
  • Restart triggering condition(언제 Restart가 일어나는지): classpath안의 소스코드가 업데이트가 되었을때
    • build.project를 했을때
      • "build.project automatically": 소스코드를 변경할 때 마다 자동으로 빌드 시작 -> 수시로 restart
    • maven : mvn compile
    • gradle : gradle build

Restart vs Reload

소스코드 변경의 더빠른 반영을 원한다면 JRebel도 살펴보기

  • 매우 빠름 (거의 즉시 , 늦어도 3초내외 소스코드 변경시 애플리케이션에 반영)
  • 생산성 향상 but 유료 ㅠ

Devtools: Live Reload

웹페이지에 변경점이 발생하면 바로 refresh

  • embedded Live Reload server를 내장
  • browser extension 설치 필요: chrome, firefox,safari지원
  • 리소스에 변경이 일어나면 브라우저 리프레쉬를 트리거 이벤트를 쏴준다 라고 생각하면된다.

확인해보기

build시 Devtools를 사용하지 않았을 경우 main 쓰레드가사용되면서 빌드가 되지만 Devtools를 사용하면 restartedMain이라는 쓰레드가 사용된다.

Actuator

Spring boot Actuator

스프링 부트의 다양한 설정과 지표를 모니터링할 수 있는 도구

  • 내가 만든 빈들이 잘 등록?
  • 내가 반든 빈이 다른 빈이랑 어떤 연관관계?
  • 내가 설정한 환경변수와 프로퍼티가 잘 등록 되었을까.
  • 내가 의도한 엔드포인트가 잘 노출 되 었을 까?
  • 내가 의도한 로깅이 잘 일어날까 등등

이러한 부분들을 엔드포인트마다 다르게 서빙하면서 production level의 정보들을 알 수 있게 끔 도와준다

Actuator - endpoints

  • 기본 엔드포인트
    • auditevents, beans,caches, conditions, configprops,env 등등 엄청많다.
  • 웹 애플리케이션에서 추가로 활성화되는 엔드포인트
    • heapdump, jolokia, logfile, prometheus

JPA 기본기

ORM(Obejct Relational Mapping)

객체지향 언어를 이용하여, 서로 호환되지 않는 타입 간의 데이터를 변환하는 기술

  • 좁은 의미: DB(RDBMS) 테이블 데이터를 (자바)객체와 매핑하는 기술
  • 효과: RDBMS를 객체 지향 DBV로 가상화 하는 것
  • ORM으로 얻고자 하는 것
    • DB의 추상화:특정 DB에 종속된 표현(예를 들어 SQL)이나 구현이 사라지고, DB변경에 좀 더 유연 해짐
    • 객체의 이점을 활용: 객체간의 참조, type-safety
    • 관심사 분리: DB동작에 관한 코드 작성의 반복을 최소화하고 비지니스 로직에 집중

JPA(Jakarta(Java) Persistence API)

자바에서 ORM 기술을 사용해 RDBMS를 다루기 위한 인터페이스 표준 명세

  • API+JPQL+metadata (+ Criteria API)
  • 기본적으로 관계형 데이터베이스의 영속성(persistence)만을 규정
    • JPA구현체 중에 다른 유형의 데이터베이스 모델을 지원하는 경우가 있지만, 원래 JPA 스펙과는 무관
  • Spring Boot:2.2부터 Jakarta EE로 의존성이 변경됨

Persistence(영속성)

프로세스가 만든 시스템의 상태가 종료된 후에도 사라지지 않은 특성

  • 구현 방법: 시스템의 상태를 데이터 저장소에 데이터로 저장함
  • 사라지지 데이터 - 주기억장치(휘발성 스토리지)에 저장된 데이터
    • 프로세스 메모리 안의 데이터(변수,상수,객체,함수 등)
  • 사라지지 않는 데이터- 보조기억장치(비휘발성 스토리지)에 저장된 데이터
    • 하드디스크, SSD에 기록된데이터(파일, 데이터베이스등)
  • 영속성 프레임워크: 영속성을 관리하는 부분을 persistence layer로 추상화하고, 이를 전담하는 프레임워크에게 관리를 위임
  • JPA에서 persistence란 : 프로세스가 DB로 읽거나 DB에 저장한 정보의 특성

JPQL(Jakarta(Java) Persistence Query Langauge)

플랫폼으로부터 독립적인 객체 지향 쿼리 언어

  • JPA표준의 일부로 정의됨
  • RDBMS의 엔티티(Entity)를 다루는 쿼리를 만드는데 사용
  • SQL의 영향을 받아서 형식이 매우 유사

JPQL vs .SQL(MySQL)

  • SQL과 JQPL은 다른 언어
    • SQL: 표준 ANSI SQL을 기준으로 만든, 특정 DB에 종속적인 언어
    • JPQL: 특정 DB에 종속적인 언어가 X
  • JPA 프레임워크를 사용한다면
    • 특별한 요구사항이 있지 않은 한, JPQL을 몰라도 됨
    • JPQL을 직접 사용하고 있다면, 반드시 필요했던 일인지 검토

기존의 기술들

SQL Mapper

RDBMS 쿼리문의 실행 결과를 자바 코드에 매핑하는 프레임워크
MyBatis같은 경우를 SQL Mapper로 본다

  • JDBC API를 사용
  • persistence framework의 일종이다.
  • 프로그램 코드와 SQL을 분리(가장 큰 목표)

Apatch iBATIS

SQL 데이터베이스와 객체 간 매핑을 지원해주는 persistence framework

  • 지원언어 : Java,.NET,Ruby
  • SQL문을 별도의 XML문서로 작성하여 프로그램 코드와 분리한 형식
  • DAO 패턴이 발전하던 시기에
    • Data Access Object 패턴: 애플리케이션 비지니스 레이어와 영속성 레이어를 추상화된 API를 이용하여 분리
    • DB접근 구현클래스를 ~~~Dao 라고 네이밍하던 관례가 많았던 시기

구성핵심방식에 대해서 살펴보기

XML에 이러한 방식을 통해 쿼리문을 구현해 놓는다

실제로 자바 클라이언트에서는 sqlMapClient를 이용해서 구현을 한다.

MyBatis

  • iBATIS 3.0에서 출발한 persistence framework (iBATIS랑 비교할 필요 없이 이걸 쓰면 된다)
  • 스프링, 스프링 부트와 연동을 지원한다.
    • 스프링:opg.mybatis:mybatis-spring
    • 스프링부트:org.mybatis.spring.boot:mybatis-spring-boot-starter
  • 다양한 프레임워크와 연동을 지원한다.
    • Freemarker, Velocity,Hazelcast, Memcached, Redis, Ignite, Guice
  • ORM vs MyBatis
    • ORM: 자바객체를 DB테이블과 매핑
    • MyBatis: 자바 메소드를 SQL실행 결과와 매핑
      iBATIS와 차이된점은 애노테이션기반의 쿼리문을 사용을 할 수 있다는 점이다 위의 두개중하나를 사용하면된다.
      but 이게 ORM이 아니다

MyBatis + Spring boot를 연계한 예시

Mybatis vs iBATIS 사소합팁

당연히 디테일에서 많은 변화와 차이가 있찌만 알면 좋은 차이점은 - 쿼리의 실행 결과이다.

JDBCTemplate(Spring에서 제공해주는것)

JDBC API (Spring JDBC)

스프링에서 제공하는 JDBC기반 persistence framework

  • spring-boot-starter-jdbc (spring-boot-starter-data-jdbc랑 다르다)
  • JdbcTemplate:Spring JDBC에서 제공하는 템플릿 클래스. 쿼리 실행과 결과 전달 기능을 제공


Hibernate vs Spring Data JPA

둘 다 Spring Data JPA를 사용하면서 볼 수 있는 단어들

  • 정확히 무슨 차이인지 알아보자

Hibernate

MORE THAN AN ORM, DISCOVER THE HIBERNATE GALAXY

  • 자바 생태계를 대표하는 ORM framework
  • 스프링 부트에서 채택한 메인 ORM framework
  • JPA 표준 스펙을 구현한 JPA Provider
  • 고성능, 확장성,안정성을 표방한다.
  • 다양한 하위 제품들로 나뉘어져있다.
    • Hibernate ORM
    • Hibernate Validator
    • Hibernate Reactive (Reactive style로 사용을 할 때 꼭 사용해야하는 부분이다 - Sprign webflux를 사용할때 한번 살펴봐야함)

Hibernate Query Language(HQL)

하이버네이트가 사용하는 SQL 스타일 비표준 쿼리언어

  • 객체모델에 초점을 맞춰 설계됨

  • JPQL의 바탕이 됨

    • JQPL은 완벽한 HQL문장이지만, 반대로는 성립하지 X

Criteria query

type-safety를 제공하는 JPQL의 대안표현법

SQL처럼 생기진않았지만 메소드를 이용해서 쿼리를 표현한다.

Native SQL Query

특정 DB에 종속된 SQL도 사용가능

Hibernate:예제 -persistence.xml을 만들어서 지정하게 된다

Hibernate:예제-Entity Class

Hibernate: 예제 -logic

Spring Data JPA

Spring Data JPA

스프링에서 제공하는 JPA 추상화 모듈

  • JPA 구현체의 사용을 한번더 , Repository라는 개념으로 추상화
  • JPA구현체의 사용을 감추고, 다양한 지원과 설정 방법을 제공
  • JPA 기본 구현체로 Hibernate 사용
  • Querydsl 지원

Spring Data JPA를 사용한다면

JPA,하이버네이트를 몰라도 되어야 한다.

  • EntityManager를 직접 사용하지 않는다.
  • JPQL을 직접 사용하지 않는다.
  • persist(), merge(), close()를 직접 사용하지 않는다.
  • 트랜잭션을 getTransaction(),commit(),rollback()으로 관리하지 X
  • 코드가 하이버네이트를 직접 사용하고 있다면
    • 꼭 필요한 코드인지 or Spring Data JPA로 할 수 있는 일인지 확인
    • 그 코드는 하이버네이트와 직접적인 연관 관계를 가지게 됨
    • 추상화의 이점을 포기하게 되는 셈

in-memory 테스트 db -H2에 대해서 알아보자

"Java SQL Database"

H2

스프링 부트가 지원하는 가장 세팅하기 편한 인메모리 DB

  • 빠르고 오픈소스이고 , JDBC API이다
  • 다양한 모드 지원 : embedded, server, in-memory
  • 브라우저 콘솔 지원(h2-console)- 브라우저에서 DB테이블이나 스키마 등등을 볼수 있음
  • 경량 jar를 지원 : 약 2MB
  • 순수 자바로 구현
  • Compatibility mode(호환성모드)지원: IBM DB2, Derby, HSQLDB,MSSQL,MySQL,Oracle,PostgreSQL
profile
주니어 개발자 되고싶어요

0개의 댓글