목록스프링/JPA (4)
백엔드 개발자
임베디드 타입 ( 값 타입 ) 식별자가 없다. 한 엔티티안에 종속되어 라이프 사이클도 종속된다. 엔티티가 삭제되면 함께 삭제된다. CasCadeType.ALL && 고아객체로 설정한 것과 같다. 식별자가 없으므로 추적도 불가능 하다. JPQL 객체지향 쿼리언어이다. SQL을 추상화한 언어이기 때문에 특정 데이터베이스에 종속되지 않는다. 문법은 sql 과 거의 유사하다. JPQL 문법 COALESCE : null 값인 경우 반환 값 지정 ⇒ coalesce(m.name, ‘이름 없는 회원’) NULLIF : 조건에 맞으면 null 반환 ⇒ NULLIF(m.name, ‘홍길동’) 이름이 홍길동이면 null 반환 CONCAT : 문자열 더하기 concat(’a’, ‘b’) SUBSTRING : 시작위치, 길이..
N + 1 문제 JPA를 이용하여 객체지향적인 설계가 가능해지는데, 엔티티 안에 엔티티를 포함할 경우 한 번 엔티티를 호출하는 것이 해당 엔티티에 포함된 다른 엔티티까지 호출하게 되면서 쿼리가 한 번 혹은 그 이상 더 호출하는 문제가 생기게 된다. JPQL을 사용할 때 발생하게 되는데(jpa에서 지원하는 find는 최적화를 통해 join으로 호출한다) JPQL을 SQL로 변환하여 호출하고 그 안에 필요한 값들을 추가로 호출하게 되는 것이다. 모든 값이 다 필요한 경우라면 모두 조회할 필요가 있지만 그게 아니라면 쓸데없는 호출이 생기는 것이다. 그래서 지연로딩인 FetchType.LAZY 설정을 통해 실제 조회하여 가져오는 것이 아닌 프록시 객체인 빈 껍데기를 넣어 만들어준다. 이것도 결국 모두 조회가 필..
객체와 테이블 매핑 @Entity 엔티티 선언 @Id : primary key 매핑, @GeneratedValue : 키 생성방법 지정, strategy 설정해줄 수 있다. 기본적으로 GenerationType.Auto 가 디폴트 값이다. GenerationType 의 종류 IDENTITY - auto increment 방식 (이 경우 jpa 영속성 컨텍스트에 들어갈 때 id 값이 있는 상태여야 하므로 커밋시점이 아닌 저장메서드를 호출할 때 바로 db로 저장이 된다. SEQUENCE - DB에 저장되어있는 마지막 키값을 불러와 그 다음 값으로 id 설정. (allocationSize를 설정하여 미리 사용할 키값들을 정해놓은 후 사용가능. 매번 db를 조회하지 않아도 됨) TABLE AUTO AUTO는 데..
기존 데이터 연동 방식 SQL 중심적인 개발 객체를 테이블에 맞춰 작성 ⇒ 객체지향을 따르기 위해 객체답게 설계할 경우 SQL과 매핑하는 과정에서 많은 join과 복잡한 쿼리가 생기게 된다. 그리고 이를 해결해 주는 것이 JPA 이다. JPA 란 ORM (Object relational mapping) 이다. → 객체 관계 매핑 JPA는 JAVA 애플리케이션과 JDBC 사이에서 동작한다. 기존방식처럼 SQL 과 매핑하기 위해 테이블에 맞추지 않고 객체는 객체대로 설계하고 JPA가 이를 변환하여 JDBC 에 넘겨준다. JPA 를 사용해야 하는 이유 객체적인 설계 가능 높은 생산성 유지보수 → 객체 중심으로 객체만 변경하면 됨 자유로운 객체 그래프 탐색 ( 기존: 모든 컬럼들을 모두 조인하여 사용하기에 어려..