본문 바로가기

Spring boot

(33)
[spring boot] 3차 정리 (페치 조인, 벌크 연산) 페치 조인 (fetch join) 페치 조인 1 - 기본 fetch LAZY 지연로딩으로 설정해놔도 jpql날릴 때 join fetch 하면 이게 더 우선순위 높아서 팀을 프록시가 아닌 진짜 엔티티로 들고옴. 따라서 그 아래(system.out.println(member.getTeam().getName())도 프록시가 아닌 다 진짜 객체로 사용하는 것. 팀A는 실제 영속성 컨텍스트에 올라간건 1개지만 팀A인 데이터(회원)가 2개이기 때문에 그 1개를 참조하는 값이 2개인것임. 원래 distinct는 완전히 같은 데이터만 중복을 제거해주지만 jpa는 일대다 관계에서 뻥튀기되는 데이터까지 중복제거해준다. 페치 조인 2 - 한계 fetch join은 나랑 연관된 애들 전부를 끌고오겠다라는 뜻이며 중간에 몇개(..
[spring boot] 3차 정리 (값 타입) 기본값 타입 Integer, String같은 래퍼 클래스는 참조값이 복사되는데 대신 변경 자체가 불가능함. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체됨. (so. side effect 안 생김) 임베디드 타입 4:18 참고 임베디드 타입은 isWork(): 지금 일하는 기간에 속하는지 알아보는 메소드 만들 수 있음 임베디드 타입은 값타입에 속하며, 모든 값타입은 엔티티 생셩주기에 의존된다. (엔티티가 삭제되면 값 타입도 삭제됨) 17:58 참고 Member 필드에 임베디드 타입(Address)을 두 개 사용하고 싶을 때 private Address homeAdress; private Address workAddress; ------------- 임베디드 타입은 joinColumn할 필요 ..
[spring boot] 변경감지(dirty checking)와 병합(merge) 변경 감지 동작 원리 변경 내용을 JPA가 자동으로 인식해 commit할 때 반영해줌. EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); // [트랜잭션] 시작 // 영속 엔티티 조회 Member memberA = em.find(Member.class, "memberA"); // 영속 엔티티 데이터 수정 memberA.setUsername("hi"); memberA.setAge(10); //!!!!! em.update(member) 이런 코드가 있어야 하지 않을까? transaction.commit(); // [트랜잭션] 커밋 !! em.up..
[spring boot] 영속성 전이 (cascade)와 orphanRemoval 차이 영속성 전이(CASCADE)와 고아 객체 CASCADE는 즉시로딩이나 연관관계와 상관 x parent만 persist해주면 chlid도 자동으로 persist됐으면 좋겠을 때 사용 @OneToMany (mappedBy="parent", cascade = CascadeType.ALL) one에 사용하는 것이며 cascade all로 해주면 그 field childList에 들어가는 child들은 다 자동으로 persist됨. ---------------- ALL : 전체 다 life cycle 맞춰야 할 때 (orphanRemove안해도 parent 지우면 chlid도 다 지워짐) persist : 저장할때만 life cycle 맞추고 싶을 때 사용, 나머지(remove)는 위험하니까 따로 두고 싶을 때 ..
[spring boot] 실전! 1. entityManager를 이용하려면 @Transactional이 필수이다. 기본 (쓰기용) : @Transactional (readOnly = false) 단순 조회용 : @Transactional(readOnly = true) = 읽기 전용이니 DB야 너무 큰 부하를 잡아먹지마 Service위에 쓰기가 많으면 @Transactional, 단순 조회가 많으면 @Transactional(readOnly = true) 아래 method 중 반대되는건 따로 개별적으로 @Transactional적어주기 2. lombok @AllArgsConstructor : 필드 모두 생성자 만들기 @RequiredArgsConstructor : final(수정x) 필드만 생성자 만들기 3. roll back (test..
[spring boot] 각 join 특징 (+ on, where 차이) on과 where 차이 ON : join하기 전 필터링 WHERE : join한 후 필터링 각 join 특징 팁 inner join은 on이 아닌 where을 사용하자 (on과 where의 결과는 같으나 where이 더 친숙하기 때문)
[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..