본문 바로가기

Study/JPA

(8)
[JPA] Spring Data JPA와 QueryDSL 이해 Spring Data JPA와 QueryDSL 이해 Spring Data JPA 소개 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결 개발자는 인터페이스만 작성 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입 사용법 어지간한 쿼리는 JPARepository를 상속시키면 다 구현되어 있다. 특정 조건으로 조회쿼리를 짜야할 때 인터페이스만 만들어도 알아서 SPQL을 만들어 주기도 한다. 페이징 처리도 Pageable 인터페이스를 상속받은 객체를 파라미터로 넣어주면 알아서 페이징 처리를 해준다. Pagable page = new PageRequest(1,20,new Sort...); // 정렬도 가능 page result = memberRepository.findByName("hello",p..
[JPA] 객체 지향 쿼리 객체 지향 쿼리 JPA는 다양한 쿼리 방법을 지원 JPQL JPQ Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL(java persistence query language) 가장 단순한 조회 방법 em.find(); // 객체 그래프 탐색 a.getB().getC(); JPA를 사용하면 엔티티 객체를 중심으로 개발 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 SQL을 추상화해서 특정 데이터베이스 SQL에 의존 X JPQL을 한마디로 정의하자면 객체 지향 SQL JPQL 문법 select m from Member m where m.age > 18 from절에 있는 것은 객체 엔티티와 속성은 대소문자..
[JPA] JPA 내부 구조 JPA 내부 구조 영속성 컨텍스트 JPA를 이해하는데 가장 중요한 용어. 엔티티를 영구 저장하는 환경 이라는 뜻 영속성 컨텍스트는 논리적인 개념이기 때문에 눈에 보이지 않는다 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다. 엔티티의 생명 주기 비영속 (new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속 (managed) : 영속성 컨텍스트에 저장된 상태 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) : 삭제된 상태 비영속 생성만 되어있는 상태는 비영속 상태이다. 영속 객체를 생성한 후 엔티티매니저를 통해 DB에 넣은 상태 em.persist(manager) 영속성 컨텍스트의 이점 1차 캐시 동일성(identity) 보장 트랜..
[JPA] 양방향 매핑 양방향 매핑 객체에 양방향 연관관계를 적용시키려면 위와 같이 구성해야한다. 하지만 RDB에서는 처음부터 양방향으로 접근해 조회할 수 있다. 이를 구성하려면 Team객체를 아래와 같이 변경하면 된다. @Entity public class Team{ @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") // Collection 추가 List members = new ArrayList(); ... } // 조회 Team findTeam = em.find(Team.class, team.getId()); // 역방향 조회 int memberSize = findTeam.getMembers().size(); 연관관..
[JPA] 연관관계 매핑 연관관계 매핑 객체를 테이블에 맞추어 모델링 할 경우 외래 키 식별자를 직접 다룬다. DTO // Member @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @Column(name = "TEAM_ID") private Long teamId; // Team @Id @GeneratedValue private Long id; private String name; // 팀을 저장할 때 Team team = new Team(); team.setName("teamA"); em.persist(team); // 회원을 저장할 때 Member member = new Member(); m..
[JPA] JPA 필드와 컬럼 매핑 JPA 필드와 컬럼 매핑 데이터베이스 스키마 자동 생성하기 DDL을 애플리케이션 실행 시점에 자동 생성 테이블 중삼 -> 객체 중심 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 이렇게 생성된 DDL은 개발 장비에서만 사용 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용 hibernate.hbm2ddl.auto (어지간해서는 개발단계에서만 사용. 운영단계 사용 x) create : 기존테이블 삭제 후 다시 생성 create-drop : create와 같으나 종료시점에 테이블 DROP update : 변경분만 반영 (운영DB에는 사용하면 안된다.) validate : 엔티티와 테이블이 정상 매핑되었는지만 확인 none : auto 기능을 사용하지 않음. 위와 같..
[JPA] JPA 기본과 매핑 JPA 기본과 매핑 객체 매핑 @Entity : JPA가 관리할 객체 @ID : DB PK와 매핑할 필드 persistence.xml JPA설정 파일 /META-INF 폴더 안에 위치 javax.persistence로 시작 : JPA 표준 속성 hibernate로 시작 : 하이버네이트 전용 속성 jdbc드라이버나 DB속성등을 설정. DB 방언 (Dialect) -> hibernate의 속성중 하나 JPA는 특정 데이터베이스에 종속적이지 않은 기술 각각의 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다름. -> 가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2 -> 문자열을 자르는 함수 : SQL표준은 SUBSTRING(), Oracle은 SUBSTR() -> 페이징 : My..
[JPA] JPA를 사용하는 이유 JPA를 사용하는 이유 현 상황 지금 시대는 객체를 관계형 DataBase에 저장한다. 관계형 DB는 SQL을 필수로 사용해야한다. 하지만 비슷한 Query가 수도없이 반복된다. 만약 이미 만들어져 있는 서버에 DTO를 수정해야한다면? 개발한 프로그램의 규모가 크면 클수록 방대한 양의 수정이 필요하게 된다. 객체 vs 관계 언어는 객체지향을 사용한다.(상속,다형성,정보은닉 ...) 데이터는 관계형 DB에 저장한다. -> 패러다임의 불일치 관계형 DB에는 상속관계가 존재하지 않는다(있는 DB도 있긴 하지만 보통 없다.) 프로그램을 설계하고 객체구조를 만들어 놓으면 그 데이터들을 저장하기 위해 객체를 분해해서 관계형으로 다시 설계가 필요하다. 또한 저장된 데이터를 꺼내 쓰기 위해 중간에 Mapping작업이 ..