entity 8

Model Mapper 사용법

maven repository 에서 model mapper 라이브러리 의존성을 추가 해줌 MainController에서 Bean으로 등록해줘야 사용할 수 있다. @SpringBootApplication public class HaedalApplication { public static void main(String[] args) { SpringApplication.run(HaedalApplication.class, args); } @Bean public ModelMapper modelMapper(){ return new ModelMapper(); } } ModelMapper는 Entity → Dto 로 변환할때 사용 되는데 그때 데이터를 변환하려면 Set 기능이 필요하기 때문에 Dto 에 @Setter ..

JAVA 2023.01.26

[JAVA] 지연로딩과 조회 성능 최적화

주문 + 배송정보 + 회원을 조회하는 API를 만들자 지연 로딩때문에 발생하는 성능 문제를 단계적으로 해결해보자. 1. 엔티티를 직접 노출 (실무에서는 엔티티를 노출하는 일은 없으니 가볍게 보고 넘기기로 하자.) @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAll(); return all; } 위에 코드는 엔티티를 직접 노출하는 개발 방식 양방향 연관관계일때 문제가 생김 → 무한루프에 빠져버림 (잘못된 코드) 이러한 경우 양방향이 걸리는데를 다 @JsonIgnore 를 걸어줘야함 → 그렇다면 무한 루프가 생기는 일은 피할 수 있지만 지연로딩 관련한 문제는 해결되지 않는다. 지연로딩으로 ..

JAVA 2022.05.19

[JAVA] CRU API

회원등록 API를 만들때 controller에서 entity를 파라미터로 받아서 사용하지 말자. entity는 굉장히 여기저기서 사용되므로 이름이 바뀌거나 하기 쉽다. 근데 이때 이름이 바뀌면 API 스펙이 바뀌므로 API가 작동이 안될수 있다. 따라서 API 를 개발할 때는 controller 에서 DTO를 사용하자! @RestController // Controller + ResponseBody -> 데이터를 바로 json이나 xml로 보내자! @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public Cre..

JAVA 2022.05.17

[JAVA] 벌크성 수정 쿼리와 @EntityGraph

Bulk 벌크(bulk) 연산은 중간에 update 쿼리를 날려버린다.( 영속성 컨텍스트 모르게 ) , 따라서 벌크연산을 진행하면 DB에는 반영이 되어있지만 영속성 컨텍스트에는 반영이 되어있지 X 그래서 벌크연산 후 영속성 컨텍스트를 clear 해주지 않으면 업데이트 되지 않은 값이 출력된다. → 매우 불편!! 이때 매번 clear를 해줄 수 없으니까 annotation을 사용해보자! → @Modifying 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용한다. 사용하지 않으면 예외 발생(Not supported for DML operations....) 벌크연산을 사용해도 fetch와 똑같이 한방쿼리가 실행됨 // 벌크연산 사용 @Modifying @Query("update Member ..

JAVA 2022.02.23

[JAVA] JPA 엔티티 매핑 + DB 스키마 자동생성

@Entity @Entity가 붙은 클래스는 JPA가 관리한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 가 필수이다. ※ 주의사항 1. 기본 생성자가 필수이다. (파라미터가 없는 public 또는 protected 생성자) 2. final 클래스, enum, interface, inner 클래스 사용하지 않는다. 3. 저장할 필드에도 final을 사용하지 않는다. package hellojpa; import javax.persistence.Entity; import javax.persistence.Id; // Entity 이름은 기본으로 클래스 명으로 들어감 바꾸려면 -> Entity(name='test') // @Table(name = "MBR") 으로 테이블명을 바꿀수 있음 @Ent..

JAVA 2021.11.10

[JAVA] JPA 플러시(flush)

플러시 발생 변경감지 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송( 등록, 수정, 삭제 쿼리 ) 보통 transaction.commit과 동시에 쿼리를 DB에 날리는데 내가 쿼리를 미리 보고싶거나, DB에 먼저 넣고 싶을때 사용! 아래 예시를 보면 commit이 실행되기 전에 insert문이 먼저 실행된다. Member member = new Member(200L, "member200"); em.persist(member); em.flush(); System.out.println("======================="); tx.commit(); // commit을 실행하면서 쿼리를 DB에 날림 ★ JPQL 쿼리 실행 시에는 플러시가 자동으로 실행된다..

JAVA 2021.11.09

[JAVA] JPA 영속성 관리

영속성 컨텍스트란? JPA를 이해하는데 가장 중요하다. 엔티티를 연구 저장하는 환경이라는 뜻이다. 영속성 컨텐스트는 눈에 보이는 것이 아니므로 EntityManager를 통해 접근한다. // DB에 저장하는게 아닌 엔티티를 영속성 컨텍스트라는 곳에 저장하는것 EntityManager.persist(entity); 1. 비영속 상태 : JPA와 관련없음(EntityManager와 상관없음 + 사용하지않음) // 비영속 상태 Member member = new Member(); member.setId(100L); member.setName("HelloJPA"); 2. 영속 상태 : EntityManager 사용 시점부터 영속 상태에 들어감 → 영속성 컨텍스트에 들어감 // 영속 상태 em.persist(me..

JAVA 2021.11.09

[JAVA] JPA 애플리케이션 개발

JPA의 구동방식을 아래 이미지로 보고 시작하자! 1. EntityManagerFactory 데이터베이스당 하나만 생성하여 전체에서 공유하여 사용해야 한다. 여기에 들어가는 name은 persistence.xml의 unit name 이다. 2. EntityManager EntityManager는 다른 쓰레드들과 공유하면 안된다. ( Connection과 같다고 보면됨 / conn도 쓰고 close로 버리는것 처럼 얘도 close가 필수다! ) 모든 DB 접근은 Manager를 거쳐야한다. 3. EntityTransaction DB에 삽입, 수정 등 이용할 때 트랜잭션 받아와서 사용하는게 필수! JPA의 모든 데이터 변경은 트랙잭션 안에서 수행한다. ( 조회-select 는 예외 일 수 있음 ) 4. JP..

JAVA 2021.11.02