
SPRING/JPA
[JPA]JPA,Hibernate, Spring Data JPA차이
JPA(Java Persistence API), 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 이다. 즉 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의한 방법일 뿐이다. Hibernate는 JPA의 구현체이다. JPA Hibernate EntityManagerFactory, ← - SessionFactory EntityManager ← - Session EntityTransaction ← - Transaction (상속) 위와 같이 상속받고 있고 각각을 Impl로 구현하고 있다고 볼수 있다. 즉 JPA를 사용하기 위해서 반드시 Hibernate를 사용할 필요가 없다는 것이다. Spring Data JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈 S..
[JPA] 연관관계
JPA가 사용하는 객체 연관관계 VS 테이블 연관관계의 차이 객체는 참조(주소)로 연관관계를 맺는다. 테이블은 외래 키로 연관관계를 맺는다. 연관된 데이터를 조회할때 객체는 참조를 하지만, 테이블은 조인을 한다. 참조를 통한 연관관계는 단방향 관계이며, 양방향으로 만들어도 사실상, 단방향관계가 2개이다. 💡 객체의 단방향 관계는 [Member.team](http://member.team) 필드를 통해서 팀을 알 수 있지만, team→ member를 접근하는 필드가 없으면 알 수가 없다. 만약 team에서도 알고 싶다면, Member라는 필드를 생성하며 Team.member를 통해 접근 할 수 있도록 양방향 관계를 맺어줘야 한다. public Static void main(){ Member member1 ..
[JPA]객체지향쿼리
JPQL JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않으며, SQL에 비해 간결하다. @Entity(name="MEMBER") public class Member{ @Column(name="name") private String username; } //사용 String jpql = "select m from Member as m where m.username = "kim" List resultList = em.createQuery(jpql, Member.class).getResultList(); 작성한 JPQL을 실행하려면 쿼리 객체를 만들어야 한다. 쿼리 객체는 TypeQuery와 Query가 있는데 반환할 타입을 명확하게 지정할 수..
[JPA]스프링 데이터 Common:커스텀 리포지토리
쿼리 메소드로 해결이 되지 않는 경우 직접 코딩으로 구현가능 스프링 데이터 리포지토리 인터페이스에 기능 추가 스프링 데이터 리포지토리 기본 기능 덮어쓰기 가능 구현 방법 커스텀 리포지토리 인터페이스 정의 인터페이스 구현 클래스 만들기(기본 접미어는 IMPL) 엔티티 리포지토리에 커스텀 리포지토리 인터페이스 추가 public Interface PostCustomRepository extends JpaRepository, PostcustomRepository{ List findMyPost(); } 기본 기능도 사용하되 일부 기능은 Override하여 나의 입맛에 맞게 수정하여 사용함 @Repository @Transactional public class PostcustomRepositoryImpl imple..
[JPA]MappedSuperClass
@MappedSuperclass public class BaseEntity{ @Column(name = "INSERT_MEMBER") privateString createdBy; //위 방법으로 하면 해당 테이블 이름을 INSERT_MEMBER로 생성함 private LocalDateTime createDate; private String lastmodifiedBy; private LocalDateTime lastModifiedDate; } 위와 같이 공통으로 사용하는 컬럼의 base entity를 생성함 상속관계 매핑이 아니다. 엔티티가 x (baseEntity 테이블이 생성되는게 아님) 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 조회, 검색 불가 직접 생성해서 사용할 일이 없으므로 추상..
[JPA] 프록시
지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 한다. 프록시 특징 프록시 클래스는 실제 클래스를 상속 받아서 만들어지므로 실제 클래스와 겉 모양이 같다. 프록시 객체의 초기화 프록시 객체는 member.getName()처럼 실제 사용될 때 데이터베이스를 조회해서 실제 엔티티 객체를 생성하는데 이것을 프록시 객체의 초기화라 한다. 프록시의 특징 프록시 객체는 처음 사용할 때 한번만 초기화된다. 프록시 객체를 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다. 프록시 객체가 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근할 수 있다. 프록시 객체는 원본 엔티티를 상속받은 객체이므로 타입 체크 시에 주의해서 ..
[JPA]객체지향 쿼리 심화
벌크 연산 엔티티를 수정하여 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용하고 삭제할때 EntityManager.remove() 사용한다. 하지만 이 방법으로 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래걸리고, 이럴 때 여러건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용한다.\ // UPDATE 벌크 연산 String sqlString = "update Product p set p.price = p.price * 1.1 where p.stockAmount < :stockAmount"; int resultCount = em.createQuery(sqlString).setParameter("stockAmount", 10).executeUpdate(); 벌크 연산은 executeUpda..
[JPA]NamedQuery
미리 정의해서 이름을 부여해두 사용하는 sql로 정적 쿼리에서만 사용 가능하다.어노테이션 , XMl에 정의하며, 애플리케이션 로딩 시점에 초기화 후 재사용 한다. 애플리케이션 로딩 시점에서 쿼리를 검증 @Entity @NamedQuery( name ="Member.findByUsername", query = "select m from Member m where m.username = :username" //blabla ) 사용은 아래와 같이 할 수 있다. List results = em.createNamedQuery("Member.findByUserName", Member.class) .setParameter("username", "회원1") .getResultList();
[JPA] 엔티티 직접사용
[JPQL] jpql에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용 SELECT count(m.id) from Member m //엔티티의 아이디를 사용 SELECT count(m) from Member m // 엔티티를 직접 사용 위 두문장은 똑같은 쿼리를 발생함 [sql] select count(m.id) as cnt from Member m 엔티티 직접 사용- 외래키값 1.SELECT m from Member m where m.team = : team 2.m.team.id 위 두문장은 똑같은 쿼리를 발생함(외래키) [sql] SELECT m.^ from member m where m.team_id=?
[JPA] 값 타입종류
엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 값 타입 int, integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고, 값만 있으므로 변경시 추적 불가 값타입의 분류 기본값 타입2.값을 공유하면 안됨 int, double 같은 기본 타입은 절대 공유 x Integer같은 래퍼 클래스나 String같은 특수 클래스는 공유 가능한 객체이지만 변경이 안됨 3.자바 기본 타입(int, double)5.String 4.래퍼 클래스(Integer, Long) 1.(생명주기를 엔티티의 의존 → 회원을 삭제하면 이름, 나이 필드 함께 삭제) 임베디드 타입(예를 들면 x,y값을 같이 묶어서 사용하고 싶을때) 새로운 값 타입을 직접 정의할 ..