[spring Boot]_9일차_JPA, Lombok설치

youuu·2022년 10월 27일
0

SPRING

목록 보기
15/33

😬 JPA는 그냥 내가 찾아서 정리하는게 나을듯. 👨‍🏫이 주신자료는 목록만 보고 내가 찾아보기.


👨‍🏫 갑자기 주신 주석문

// 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌
// 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 함
// 이전 에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입

// 스프링 빈을 등록하는 2가지 방법
// 컴포넌트 스캔과 자동 의존관계 설정
// 자바 코드로 직접 스프링 빈 등록하기

// @Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
// @Controller
// @Service
// @Repository


🌱 Lombok 설치


🚩 Lombok Project 적용

  1. pom.xml에 적용
  • Project 생성시 lombok 추가
 <dependency> 
 <groupId>org.projectlombok</groupId> 
 <artifactId>lombok</artifactId> 
 <scope>provided</scope> 
 </dependency>

2) Gradle 적용

  • Project 생성시 lombok 추가  gradle Refresh
  • build.gradle
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok‘
    3) 적용시 장점
  • 기계적으로 작성하는 VO, DTO, Entity 관렦 작업 용이
  • getter, Setter, ToString , hashcode 관렦 Method 코드 일관성, 가독성 향상
    4) 고려사항
  • 모든 팀원이 lombok 설치 해야 함
  • 추가 Annotation사용시 소스코드 분석 난해 가능성 고려

🚩 Lombok annotation


🚩 gradle과 Maven 비교

🌚 간략비교 :
Gradle은 Script언어로 구성되어 있기 때문에 xml보다 간결하게 구성 가능하며,
Build.gradle을 사용한다.
Gradle은 Script언어로 구성되어 있기 때문에 xml보다 간결하게 구성 가능하다.
Build.gradle을 사용한다.

gradle과 Maven 비교 참고✅


🌱 JPA

🚩 1. JPA 개념

💡 JPA (Java Persistence API)

: 자바 진영의 ORM 기술 표준

💡 JPA 개념도

  • Java Program(일반적으로 DAO) 에서 JPA에 접근 (Entity)
  • JPA에서 일반적 SQL 자동 생성 (Query로 맊들수도 있음)
  • JDBC API 통해 DML 작업 수행


🚩 2. JPA 동작(저장 & 조회)


🚩 3. JPA 표준명세 와 특징

💡 1. JPA 표준명세

  • JPA는 Interface 모음
  • JPA 2.1 표준 명세를 구현한 3가지 구현체
  • 하이버네이트, EclipseLink, DataNucleus
  • JPA 2.0(JSR 317) 2009년 : 대부분의 ORM 기능을 포함, JPA Criteria 추가
  • JPA 2.1(JSR 338) 2013년 : 스토어드 프로시저 접근, 컨버터(Converter), Entity 그래프 기능이 추가

💡 2. JPA 특징

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 성능
  • 데이터 접근 추상화와 벤더 독립성
  • 표준

💡 3. SQL별로 표준을 지키지 않은 데이터베이스맊의 고유한 기능,데이터베이스 방언

  • JAP 구현체는 이러한 문제점을 해결하기 위하여 데이터베이스 방언 클래스를 제공.
    JPA를 사용하고있는 프로젝트의 개발자는 이에 대하여 사용하는 데이터베이스가 변경되더라도 데이터베이스 방언만 교체하면 쉽게 데이터베이스를 변경
  • 예시
  1. 데이터 타입 : 가변문자 타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2를 사용.
  2. 다른 함수명 : 문자열을 자르는 함수로 예를 들면 SQL 표준은 SUBSTRING() 이지맊,
    오라클은 SUBSTR()을 사용.
  3. 페이징 처리 : MySQL 은 LIMIT를 사용하지맊 오라클은 ROWNUM을 사용

🚩 4. JPA CRUD

  1. 저장: jpa.persist(emp)
  2. 조회: Emp emp= jpa.find(empno)
  3. 수정: emp.setEname(“변경할 이름”)
  4. 삭제: jpa.remove(emp)

🚩 5. JPA Performance(캐시)

캐시버퍼에 갖고 있어서-> 성능 최적화
1. 1차 cache 와 동일성

  • 같은 트랜잭션 안에서는 같은 엔티티를 반홖 - 약갂의 조회 성능 향상
  • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
  1. Cache 예시
// SQL 1번만 실행
String empno = "1000";
Emp emp1 = jpa.find(Emp.class, empno); //SQL
Emp emp2 = jpa.find(Emp.class, empno); //캐시
println(emp1 == emp2) // true

🚩 6. JPA Transaction 지연

지연로딩, 즉시로딩
즉시로딩 : 한번에 다 찾아옴.
지연로딩 : 각각 sql 따로 나감.

  1. UPDATE 쓰기 지연
    ① UPDATE, DELETE로 인한 로우(ROW)락 시갂 최소화
    ② 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
  2. Transaction 예시
    // Transaction 시작
    transaction.begin();
    changeEmp(empA);
    deleteEmp(empB);
    비즈니스로직수행(); //비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.

// 커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보낸다.

// 커밋하는 순간 변경 감지(Dirty Checking) 하여 Update SQL 생성 수행
transaction.commit(); // [트랜잭션] 커밋

3) 지연로딩(객체가 실제 사용될 때 로딩)

// SELECT * FROM MEMBER 
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
// SELECT * FROM TEAM
String teamName = team.getName();

4) 즉시 로딩( JOIN SQL로 한번에 연관된 객체까지 미리 조회)

// SELECT M.*, T.* FROM MEMBER JOIN TEAM
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();

🚩 7. JPA 핵심 구성요소


🚩 8. JPA Entity 생명주기

profile
공부중인 주니어 개발자

0개의 댓글