😬 JPA는 그냥 내가 찾아서 정리하는게 나을듯. 👨🏫이 주신자료는 목록만 보고 내가 찾아보기.
👨🏫 갑자기 주신 주석문
// 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌
// 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 함
// 이전 에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입
// 스프링 빈을 등록하는 2가지 방법
// 컴포넌트 스캔과 자동 의존관계 설정
// 자바 코드로 직접 스프링 빈 등록하기
// @Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
// @Controller
// @Service
// @Repository
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
2) Gradle 적용
🌚 간략비교 :
Gradle은 Script언어로 구성되어 있기 때문에 xml보다 간결하게 구성 가능하며,
Build.gradle을 사용한다.
Gradle은 Script언어로 구성되어 있기 때문에 xml보다 간결하게 구성 가능하다.
Build.gradle을 사용한다.
: 자바 진영의 ORM 기술 표준
캐시버퍼에 갖고 있어서-> 성능 최적화
1. 1차 cache 와 동일성
- 같은 트랜잭션 안에서는 같은 엔티티를 반홖 - 약갂의 조회 성능 향상
- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
- 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
⭐지연로딩, 즉시로딩
즉시로딩 : 한번에 다 찾아옴.
지연로딩 : 각각 sql 따로 나감.
// 커밋하는 순간 데이터베이스에 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();