오늘부터는 주특기 숙련 주차에 진입했다.
Spring Data JPA를 사용하지 않고, JPA를 사용하는 방법과
지난 주에 했던 내용을 바탕으로 네이버 오픈 API를 사용해보았다.
Spring Data JPA가 없이 사용하는 JPA
Spring Data JPA를 사용할 때는 Entity 클래스에 값을 넣고, 바로 save(), find() 등 바로 DB에 쿼리를 쏠 수 있었다.
Spring Data JPA를 사용하지 않으면, EntityManager와 그것을 생성할 EntityManagerFactory가 필요하다.
find 함수를 실행하기 까지의 과정
// EntityManager를 생성해줄 EntityManagerFactory를 만든다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistent.xml에 등록된 name");
// Entity를 관리해줄 EntityManager를 EntityManagerFactory에서 생성한다.
EntityManager em = emf.createEntityManager();
// 엔티티를 영속화(저장)
em.persist(minsook);
// 엔티티를 찾기
em.find(Member.class, 100L);
여러 스레드가 작업할 때, 동시성 문제가 발생하지 않도록 하기 위해서 여러 스레드가 한개의 EntityManager를 사용할 수 없도록 해야한다. 따라서 Factory에서 필요할 때 마다 EntityManager를 생성하는 구조로 설계해야한다.
영속성 컨텍스트
엔티티 매니저마다 개별적으로 가지고 있는, 엔티티를 영구 저장하는 논리적 공간이다.
엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리한다.
JPA 엔티티의 상태
- 비영속 : 영속성 컨텍스트와 관계가 없고, Java 객체인 상태
// 엔티티를 생성
Member minsook = new Member();
member.setId("minsook");
member.setUsername("민숙");
- 영속(Managed) : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태
// 엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장
em.persist(minsook);
"영속화 하다." 라는 말은 'Java객체를 엔티티 매니저가 자기의 영속성 컨텍스트에 넣어준다.' 의 의미이다.
- 준영속(Detached) : 영속성 컨택스트에서 분리된 상태이다.
// 엔티티를 영속성 컨택스트에서 분리
em.detach(minsook);
// 영속성 컨텍스트를 비우기
em.clear();
// 영속성 컨택스트를 종료
em.close();
detach() : 엔티티를 준영속 상태로 전환
영속성 컨택스트가 엔티티를 관리하지 않으므로, 하기 기능이 동작하지 않는다.
1. 1차 캐시에서 제거됨
2. 쓰기 지연 SQL 저장소에 저장되었던 관련 SQL모두 제거
clear() : 영속성 컨텍스트 초기화
영속성 컨텍스트 내 모든 것을 초기화시킨다. (영속성 컨텍스트를 제거하고 새로 만든 것과 같다.)
close() : 영속성 컨텍스트 종료
영속성 컨텍스트가 관리하던 엔티티가 모두 준영속 상태가 된다.
- 삭제(Remove) : 엔티티가 영속성 컨텍스트에서 삭제된 상태
em.remove(minsook)
영속성 컨텍스트의 기능
데이터베이스에 부하가 될 수 있는 작업을 최소화 하기 위하여 동일 작업을 최소화 한다.
1. 1차 캐시
DB에 쿼리를 쏘기 전에, 1차 캐시 내에 동일한 데이터가 존재하는지 확인하고, 데이터가 있다면 해당 데이터를 반환한다.
2. 쓰기 지연 SQL 저장소
여러 엔티티를 저장해두고, commit을 진행하면 내부적으로 쓰기 지연 SQL 저장소에 Flush가 일어나고 쿼리들이 DB로 흘러들어간다.
JPA가 쿼리를 생성할 때, DirtyChecking을 통해 엔티티를 조회한 시점의 데이터와 이전 데이터를 비교해서 데이터가 다르다면 변경을 반영할 수 있는 UPDATE 쿼리를 작성해둔다.
단방향 연관관계, 양방향 연관관계와 프록시의 개념도 배웠지만, 아직 완벽히 이해되지 않아서 나중에 따로 내용을 정리해볼 예정이다.
강의 실습을 진행하면서 몇 가지 문제가 발생했는데, 처리과정에 대해 회고해보고자 한다.
패키지 밖에 패키지 생성으로 인한 오류
패키지 생성 위치가 잘못되어, 어플리케이션이 Controller를 찾지못해 404 에러가 발생했다.
프로젝트 생성 시 선언한 패키지 안에 넣어주니 해결되었다.
폴더 생성 시 하위 폴더로 나뉘지 않는 현상
폴더를 생성하면, 폴더가 나뉘지 않고, 패키지명.폴더명 으로 변경만 되고 나뉘지 않는 문제가 생겼다.
프로젝트 우측 설정 버튼 > Tree Appearance > Compact Middle Packages
하니 하위 폴더로 나뉘어 보이도록 설정이 되었다.
Json 키 값 잘못 지정
받아온 Json 값을 Dto로 바꿔 주는 작업 중에 key가 "static/image" 폴더명??으로 지정이 되어 있어 실행 중 오류가 발생했다. Java로 Json을 처음 다루다보니 오류 원인을 찾는데 오래 걸렸던 것 같다..
느낀 점
처음 Naver Open API를 사용해봤는데 정말 재미있었다. jwt와 auth 에 대해서도 배울 예정인데, 앞으로 새로 접하게 될 기술들에 대해서 호기심이 들었고 그것들을 내가 사용할 수 있는 스택으로 만들 수 있으리라는 생각에 기대가 된다.
숙련 주차는 미리 학습을 진행한 관계로 조금 느슨하게 학습을 진행했는데, 내일부터는 숙련 주차로 시작되므로 다시 마음을 다잡고 열심히 학습에 임해야겠다.
'항해99' 카테고리의 다른 글
항해 99 - 2023.02.16 TIL (0) | 2023.02.16 |
---|---|
항해 99 - 2023.02.15 TIL (0) | 2023.02.16 |
항해 99 - 2023.02.07 TIL (0) | 2023.02.07 |
항해 99 - 2023.02.03 TIL (0) | 2023.02.04 |
항해 99 - 2023.02.01 TIL (1) | 2023.02.01 |