본문 바로가기

웹개발

(11)
[Spring Data JPA] Query Methods - 메소드 이름으로 쿼리 생성 스프링 데이터 JPA가 제공하는 쿼리 메소드 기능 중 메소드 이름으로 쿼리 생성에 대해 알아보자. 스프링 데이터 JPA가 제공하는 쿼리 메소드 기능 메소드 이름으로 쿼리 생성 메소드 이름으로 JPA NamedQuery 호출 @Query 어노테이션을 이용한 쿼리 직접 정의 메소드 이름으로 쿼리 생성이란? 메소드 이름을 분석해서 JPQL 쿼리 실행하는 것 JPA vs. Spring Data JPA 비교 순수 JPA public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") ..
OSIV란? OSIV란? Open Session In View: 하이버네이트 Open EntityManager In View: JPA OSIV ON spring.jpa.open-in-view : true 기본값 0 1 2 3 4 요청 → Filter Interceptor → Controller → Service → Repository ↖ View ↙ 트랜잭션 범위 (3~4) 영속성 컨텍스트 생존 범위 (1~4) 영속 상태, 수정 불가능 영속 상태, 수정 가능 Q. 언제 JPA(영속성 컨텍스트)가 데이터베이스 커넥션을 획득? A. 데이터베이스 트랜잭션 시작할 때 장점 OSIV 전략은 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. → 지연 로딩이 가..
[JPA] 연관관계 매핑 다중성 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany (실무에서 쓰면 안됨) 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 (사실 양방향이 아닌 단방향 2개) 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데 둘중 테이블의 외래 키를 관리할 곳을 지정해야함 연관관계의 주인: 외래 키를 관리하는 참조 주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능 참조 - 자바 ORM 표준 JPA 프로그래밍
[JPA] 양방향 연관관계 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다. 객체 연관관계 = 2개 회원 -> 팀 연관관계 1개 (단방향) 팀 -> 회원 연관관계 1개 (단방향) 테이블 연관관계 = 1개 회원 팀의 연관관계 1개 (양방향) 객체의 양방향 관계 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 뱡향 관계 2개다. 따라서, 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다. A -> B (a.getB()) class A { B b; } B -> A (b.getA()) class B { A a; } 테이블의 양방향 연관관계 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리 MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계 가짐 (양쪽으로 조인할 수 있다.) SELECT *..
[JPA] 엔티티 매핑 ⭐️ @Entity, @Table, @Column, @Id 엔티티 매핑 (Entity Mapping) 객체와 테이블 매핑: @Entity, @Table 필드와 컬럼 매핑: @Column 기본 키 매핑: @Id, @GeneratedValue 연관관계 매핑: @ManyToOne, @JoinColumn @Entity @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final 사용 X @ Table @Table은 엔티티와 매핑할 테이블 지정 속성 기능 기본값 name 매핑할 테이블 이름 엔티티 이름 사용 catalog D..
[JPA] 플러시란? Flush 플러시란? 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영 (쿼리를 날려주는 것) 영속성 컨텍스트를 비우지 않음 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화 (트랜잭션이라는 작업 단위가 중요) commit 직전에만 동기화 하면 된다. 플러시 발생 커밋이나 쿼리를 실행할 때 플러시가 된다. (FlushModeType.AUTO 기본값) 변경 감지가 일어남 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법 em.flush() - 직접 호출 (쓸일 없음) transaction.commit() - 플러시 자동 호출 JPQL 쿼리 실행 - 플러시 자동 호출 참조 - 자바 ORM 표준 JPA 프로그래밍
[JPA] 준영속 엔티티란? 변경 감지와 병합(merge) 준영속 상태란? 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)된 것 영속성 컨텍스트가 제공하는 기능을 사용 못함 준영속 상태로 만드는 방법 em.detach(entity) 특정 엔티티만 준영속 상태로 전환 em.clear() 영속성 컨텍스트를 완전히 초기화 em.close() 영속성 컨텍스트를 종료 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티. 임의로 만들어낸 엔티티라도 기존 식별자를 가지고 있는 경우 (JPA가 식별 할 수 있는 id를 가지고 있음) 준영속 엔티티를 수정하는 2가지 방법 변경 감지 기능 사용 병합( merge ) 사용 변경 감지 기능 사용 @Transactional void update(Item itemParam) { //itemParam: 파리미터로..
[JPA] 영속성 컨텍스트란? Entity Manager 영속성 컨텍스트란? "엔티티를 영구 저장하는 환경" JPA를 이해하는데 가장 중요한 용어 눈에 보이지 않는 논리적인 개념 엔티티 매니저를 통해서 영속석 컨텍스트에 접근 EntityManager.persist(entity); DB에 저장하는 것이 아니라 엔티티를 영속성 컨텍스트에 저장하는 것 Q. 그러면 언제 DB에 저장되는가? 더보기 A. transaction.commit(); 하는 시점에 쓰기 지연 SQL 저장소에 있던 데이터들이 flush가 되고 DB에 쿼리가 날라간다. 엔티티의 생명주기 비영속 (new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 //객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); ..