본문 바로가기

전체 글

(124)
[spring boot] OSIV와 영속성 컨텍스트 OSIV란? Open Session In View: 하이버네이트 Open EntityManager In View: JPA 크고 복잡한 애플리케이션을 개발한다면, 성능과 복잡성의 관심사를 명확하게 분리하는 선택은 유지보수 관점에서 충분히 의미 있다. 만약 OSIV를 끈다면 다음처럼 분리하자. OrderService: 핵심 비즈니스 로직 OrderQueryService: 화면이나 API에 맞춘 서비스 (주로 읽기 전용 트랜잭션 사용) > 참고: 고객 서비스의 실시간 API 서버는 OSIV를 끄고, ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 켠다. (아래는 참고) OSIV ON (기본값) 영속성 컨텍스트가 트랜잭션 범위 밖에서도 유지되며 화면에 렌더링 될때 View나 Controller에..
[spring boot] API 성능 최적화 (+ DTO 장점) API 파라매터로 엔티티를 바로 받기 장점)새로운 class안만들어도되니까 덜 귀찮 -------------------- API 파라매터로 DTO 만들어서 받기 장점) 엔티티 필드가 변경돼도 API스펙이 변경될 리 없음(컴파일오류떠서 고쳐주면됨) 장점) 어느 필드는 NotEmpty인데 다른 api에서는 이 필드가 NotEmpty가 아닐 수 있음. 장점) 이 API에서는 어느어느 필드가 들어올지 한눈에 알 수 있음. API는 데이터 요청이 들어오는 것과 나가는것에서 절대 Entity를 사용하지 않는다. (Entity를 외부에 노출시키지 않는다.) ==> DTO를 사용하자 1. API 개발 고급 - 간단한 조회 쿼리 방식 선택 권장 순서 1. 엔티티를 DTO로 변환 (V2) 2. 필요하면 fetch join..
[spring boot] test시 (H2 DB의) 메모리모드 사용 test할 때 DB까지 왔다갔다하기 번거롭다면, 메모리를 사용하자. (DB를 꺼놔도 Test 실행가능) 1. H2 DB 메모리 모드사용 main>resources > application.yml 을 복사해 test > resources > application.yml에 붙이고 url만 변경하기(아래 참고) //test > resources > application.yml 내용 spring: datasource: url: jdbc:h2:mem:test username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: tru..
[spring boot] 3차 정리 (프록시, 즉시 로딩, 지연 로딩) 프록시 쓰는 이유 member조회하는데 아주 가끔만 team까지 조회하고 보통은 name만 조회할때 team을 계속 조회하는건 낭비니까! ----------------------- 1. getReference하면 프록시 생성 2. getName()호출 : proxy target이 null이면 영속성 컨텍스트가 DB를 조회하고 실제 entity를 생성해 proxy와 연결해줌. proxy target이 있으면 실제 entity인 target에 연결돼 속성 사용가능 초기화 : DB를 통해 진짜 entity를 만들어내는 과정 --------------------------- proxy의 타입은 instanceof를 사용해야함. (ex. m1 instanceof Member) em.find() -> em.getR..
[spring boot] 2차 정리 (연관관계 매핑 기초, 다양한 연관관계 매핑, 고급 매핑) 단방향 연관관계 persist하면 pk값 생성됨. 객체를 DB에 맞춰 셋팅하면 문제 생김 : MEMEBER 첫번재 데이터_ID가 2인 이유: 공용 sequence를 사용해서 TEAM의 첫번째 데이터 _ID가 1이기 때문에...! => 따로따로 ID를 1부터 사용하려면 식별자 맵핑해주면 됨. ------------ 객체지향 : 객체를 참조해서, 객체 대상으로 쿼리 (JPQL) DB : 외래키를 가지고, 테이블 대상으로 쿼리 (SQL) MEMBER는 객체인 TEAM을 가지고 있지만 DB는 TEAM의 키를 가지고 있음. MEMBER의 팀을 b팀으로 바꾸면 jpa는 객체가 바뀌는데 DB는 키값만 바뀜 ---------- persist 하고 바로 find 하면 1차캐시에서 들고오기 때문에 select 쿼리 안 날..
[spring boot] 1차 정리(jpa 시작, 영속성관리, 엔티티 매핑) 준영속 상태 tx.commit(); : 쿼리 날리기. 맨 마지막에 한번만 실행하면 됨. detach : 준영속 상태로 만듦 setName으로 name을 변경하고 detach를 하면 setName때문에 select 쿼리는 날라가지만 commit 때 setName으로 인한 update 쿼리는 안 날라감. detach를 함으로써 영속성 컨텍스트를 날려버린 것. (변경 감지 일어나지 않음) 객체와 테이블 매핑 @Table(name = "MBR") public class Member{ } 는 table명을 MBR로 정한다. MBR table과 맵핑되어 쿼리가 insert 쿼리 from MBR; 로 날라감. 데이터베이스 스키마 자동 생성 application 로딩시 DB를 자동으로 생성해 객체중심으로 개발가능. -..
[spring boot] flush란? persist, flush, commit 비교 플러시(flush)란? 영속성 컨텍스트의 변경내용을 DB에 반영하는 것. 영속성 컨텍스트(1차 캐시)를 비우지 않음 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화 (변경감지) 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화(flush) 하면 됨 (commit 하면 자동으로 flush 먼저 실행) 플러시 모드 옵션 (보통 AUTO, 건들지 X) em.setFlushMode(FlushModeType.COMMIT) FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값) FlushModeType.COMMIT : 커밋할 때만 플러시 persist, flush, commit 비교 em.persist(entity); 1차 캐시에 저장 및 쓰기 지연 SQL 저장소에 SQL 쌓음..
[spring boot] 영속성 컨텍스트 영속성 컨텍스트란? application과 DB사이에 논리적으로 존재하며, 엔티티를 영구 저장하는 환경을 뜻함. EntityManager.persist(entity); entity를 영속성 컨텍스트에 저장한다. EntityManager 속에 있는 영속성 컨텍스트를 통해 entity가 관리된다. 쓰기 지연 SQL 저장소에 SQL을 쌓는다. 이점 1차 캐시 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) 변경 감지(Dirty Checking) 지연 로딩(Lazy Loading) 엔티티의 생명주기 비영속 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 더보기 //객체를 생성한 상태(비영속) Member member = new Member(); m..