728x90 전체 글200 [Spring Data JPA] extends JpaRepository VS @Repository 우선 extends JpaRepository는 Spring Data JPA라는 기술을 사용했다. 이에 대한 개념을 간단히 이해하고 둘을 비교해보자. Spring Data JPA Spring Data JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 모듈. CRUD 처리를 위한 공통 인터페이스를 제공해주고, 인터페이스만 작성하면 동적으로 구현체를 생성해서 주입해주기 때문에 인터페이스만 작성해도 개발을 완료할 수 있다. 설정과 구현에 대한 내용은 아래 링크 참고) https://blog.naver.com/ghdalswl77/222314410957 Spring Data JPA 1. Spring Data JPA Spring Data JPA는, JPA를 쓰기 편하게 만들어 놓은 모듈이다. 스프링 부.. 2022. 9. 30. [JPA] 엔티티 설계 시 주의점 (setter 지양, 즉시로딩 지양) (1) 엔티티에는 가급적 Setter 지양 변경 포인트가 너무 많아서 유지보수가 어렵다.. (2) 지연로딩 지향, 즉시로딩 지양 모든 연관관계는 지연로딩으로 설정! 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제(의미상 1+N)가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다. 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다. 주의할 점으로, @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩 이므로 직접 지연로딩으로 설정해야 한다. (3) 컬렉션은 필드에서 초기화 하자. 컬렉션은 필드에서 바로 초기화 하는 것이 null 문제.. 2022. 9. 26. [JPA] 값 타입 (자바 ORM 표준 JPA 프로그래밍 기본편) JPA의 데이터 타입 분류 📍엔티티 타입, 값 타입 ? 엔티티 타입은 @Entity로 정의하는 객체, @Entity를 붙여서 관리하던 클래스들이었다. 이 타입들은 pk값으로 관리가 되기때문에 데이터가 변해도 식별자로 지속적으로 추적이 가능하고 관리도 편리하다. (ex.회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능) 그에 반해 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체다. 식별자가 없고 값만 있으므로 변경시 추적이 불가하다. (ex. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체) 📍값 타입 분류 1. 기본값 타입 -자바 기본 타입(int, double) -래퍼 클래스(Integer, Long) -String 이런 기본 값 .. 2022. 9. 26. [JPA] 영속성 전이, 고아 객체 (cascade 범위) JPA 영속성 전이 JPA는 CASCASE 옵션으로 영속성 전이를 제공한다. JPA 영속성 전이란, 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태가 되게(영속화), 혹은 함께 삭제가 이뤄지게 하는 것이다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. 위와 같이 Parent와 Child가 일대다 관계를 맺었다고 하고 부모쪽에서 cascade옵션을 설정해보자. @Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List children = n.. 2022. 9. 24. [JPA] 즉시로딩, 지연로딩 (JPA N+1문제) 앞서 프록시 포스팅에서 말했던 지연로딩에 대해 더 자세히 알아보자. Team과 Member가 일대다로 연관관계를 갖고있을 때 Member를 조회할 때 마다 해당 Member의 Team도 조회해할 필요가 없다면, 이 지연로딩을 사용하면 된다. 지연로딩은 실제로 Member를 통해 Team에 대한 정보를 읽어와야할 때까지 DB에서 조회를 미루는 개념이다. Member를 조회 할때 Team객체에 프록시 객체를 넣어오고, getTeam 처럼 실제로 team을 호출해야할 때 초기화가 이뤄진다. 지연로딩으로 설정해주기 위해서는 아래와 같이 간단하게 fetch옵션을 LAZY로 설정해주면 된다. public class Member { @ManyToOne(fetch = FetchType.LAZY) // 다대일(membe.. 2022. 9. 22. [JPA] 프록시란? (지연로딩) 회원 정보만 출력하는 비지니스 로직과 회원과 팀 정보를 출력하는 비지니스 로직을 비교해보자. [회원 정보만 출력] public String printUser(String memberId) { Member member = em.find(Member.class, memberId); System.out.println("회원 이름 : " + member.getUserName()); } [회원과 팀 정보를 출력] public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름 : " + member.getU.. 2022. 9. 22. [JPA] JPA 연관관계 매핑 (다대일, 일대다, 일대일, 다대다) JPA 연관관계 매핑 연관관계 매핑 시 다음 3가지를 고려하여 매핑해야한다. 1) 다중성 다대일 (N : 1) ManyToOne 일대다 (1 : N) OneToMany 일대일 (1 : 1) OneToOne 다대다 (N : N) ManyToMany 2) 방향 양방향, 단방향 DB 테이블은 외래 키(Fk)하나로 조인을 사용해서 양방향으로 쿼리가 가능하다. 따라서 DB에는 방향의 개념이 없다. 그러나 객체의 경우, 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있으므로 방향의 개념이 존재한다. 객체 관계에서 한 쪽만 반대쪽을 참조하는 관계를 단방향, 양 쪽 모두 서로를 참조하는 관계를 양방향이라고 한다. 3) 연관관계의 주인 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다. 데이터베.. 2022. 9. 21. [JPA] Entity 연관관계 매핑 (연관관계의 주인) 패러다임의 불일치 '객체지향 프로그래밍' 은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 정치들을 제공한다. 이에 반해 '관계형 데이터베이스'는 추상화, 상속 다형성 같은 개념이 없다. 데이터 중심으로 구조화되어 있고 집합적인 사고가 필요하다. 이러한 객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결하는데 많은 시간과 코드가 소비된다. 연관관계 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 (참조로 연관된 객체를 조회) 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가진다. (join으로 연관된 테이블 조회) 객체를 테이블에 맞춰 모델링? 그럼 객체를, 테이블과 똑같이 모델링하면 어떻게 될까? 예시를 하나 들어본다. 데이터베이스에는 아래 그.. 2022. 9. 21. [JPA] Entity 매핑 (필드와 칼럼 매핑, 기본키 매핑) 1. 객체와 테이블 매핑 @Entity가 붙은 클래스를 JPA가 entity로 관리한다. 여기에는 꼭 파라미터가 없는 생성자가 필수로 있어야 한다. 클래스를 이름이 다른 테이블과 매핑하고 싶다면 @Table안에 name 속성에 적어주면 되고, UNIQUE 조건은 uniqueConstrains에 적어주면 된다. 칼럼 수준에서도 unique 조건을 달아줄 수 있지만 생성되는 이름이 더 복잡해지고 여러 칼럼에 unique 조건을 걸어줄 수 없기 때문에 @Table로 하는 방식을 권장한다. 이 기능은 DDL자동생성시에만 적용된다. @Entity // JPA가 인식 @Table(name = "table_member", uniqueConstraints={ @UniqueConstraint(columnNames={"c.. 2022. 9. 21. 이전 1 ··· 6 7 8 9 10 11 12 ··· 23 다음 728x90