본문 바로가기

jpa13

[JPA] JPA 프록시를 사용하는 이유? 프록시 프록시를 사용하는 이유? 만약 Member 엔티티에 Team이라는 엔티티가 속해 있는데 Member 엔티티를 조회할 때마다 Team엔티티도 함께 조회해야만 할까? 답은 비즈니스 로직에서 필요하지 않을 때가 있는데 항상 Team을 함께 가져와서 사용할 필요는 없다 JPA는 낭비를 하지 않기 위해서 지연 로딩과 프록시를 사용한다 프록시 기초 지연 로딩은 JPA에서 빼놓을 수 없는 개념이다 지연 로딩을 이해하려면 프록시의 개념 또한 알아야 한다 JPA에서는 em.find()말고, em.getReference()라는 메서드도 제공한다 em.find()는 DB를 통해서 실제 엔티티 객체를 조회하는 메서드이고 em.getReference()는 DB의 조회를 미루는 가짜 (프록시) 엔티티 객체를 조회하는 메서.. 2022. 3. 23.
[JPA] 영속성 컨텍스트 (엔티티 매니저) 영속성 컨텍스트 엔티티 메니저 팩토리와 엔티티 매니저 JPA는 매 요청마다 EntitityManagerFactory에서 EntityManager를 생성한다 EntityManager는 내부적으로 DB 커넥션 풀을 사용하해서 DB에 전달된다 요청 → EntityManager Factory → EntityManager → 커넥션풀 →> DB 영속성 컨텍스트란 ? 영속성 컨텍스트는 “엔티티를 영구 저장하는 환경” 이라는 뜻이다 영구 저장할때 그것을 영속화라고 정의하며 사용법은 EntityManager.persist(entity) 같은 형식을 사용하면 된다 영속성 컨텍스트는 논리적인 개념이다 아직 DB에 전달되지 않으며 DB에 전달되기 전 준비 동작이라고 이해하면 된다 엔티티의 생명주기 4가지의 상태가 존재한다 .. 2022. 3. 23.
[JPA] 즉시로딩 지연로딩 즉시로딩 지연로딩 지연로딩를을 사용하는 이유? 만약 Member 엔티티에 Team이라는 엔티티가 속해 있는데 Member 엔티티를 조회할 때마다 Team엔티티도 함께 조회해야만 할까? 답은 비즈니스 로직에서 필요하지 않을 때가 있는데 항상 Team을 함께 가져와서 사용할 필요는 없다 JPA는 낭비를 하지 않기 위해서 지연로딩을 사용한다 코드 Member와 Team 사이가 @ManyToOne 관계로 매핑되어 있는 상황에서, 어노테이션에 fetch 타입을 줄 수 있다 FetchType.LAZY // 패치 타입 LAZY 설정 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id", insertable = false, updatable = false) .. 2022. 3. 23.
[JPA] 여러가지 JPA 전략@Inheritance(strategy=InheritanceType.xxxx) 관계형 데이터베이스는 상속 관계가 없지만 JPA에서는 상속관계 매핑을 지원한다 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하기 때문이다 | 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각 테이블로 변환 > 조인 전략 - 통합 테이블로 변환 > 단일 테이블 전략 - 서브타입 테이블로 변환 > 구현 클래스마다 테이블 전략 - @Inheritance(strategy=InheritanceType.xxxx) JOINED > 조인 전략 SINGLE_TABLE > 단일 테이블 전략 TABLE_PER_CLASS > 구현 클래스마다 테이블 전략 - @DiscriminatorColumn(name="xxx") 상속된 객체들을 name으로 분류해서 나누어줌 - @DiscriminatorV.. 2022. 3. 21.
[JPA] 객체지향에서의 양방향 설정 양방향 매핑은 단순히 말해서 연결된 테이블에서 서로 매핑되는 것을 말한다 예를 들어 Member -> Team , Team -> Member 가 되는 것이다 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; 위와 같이 Member 객체를 설정해주고 아래와 같이 Team 객체를 만들어준다 @Entity public class Team { @Id @GeneratedValue private Long id; private .. 2022. 3. 16.
[JPA] 객체지향에서의 단방향 설정 JPA를 사용할때 객체와 테이블의 연관관계 차이를 아는것이 중요하다 테이블 연관관계에서는 PK, FK를 정해서 매핑하는데 객체에는 연관관계가 없다 그걸 객체지향으로 설정해주는 작업을 해야한다 그 과정에서 단방향 연관관계와 양방향 연관관계 설정을 해주어야 객체지향으로 모델링할 수 있다 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; // @Column(name = "TEAM_ID") // private Long teamId; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team .. 2022. 3. 16.
[JPA] 엔티티와 매핑 엔티티와 매핑 엔티티 매핑 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리하고 엔티티라고한다 JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 가 필수다 주의 기본생성자 필수 (파라미터가 없는 public 또는 protected 생성자) → JPA 스펙 상 필요하다 (JPA 라이브러리에서 필요로함) final 클래스, enum, interface, inner 클래스 사용 x 저장할 필드에 fianl 사용 x @Entity(name = "Member") public class Member { @Id.. 2022. 3. 14.
[JPA] 필드와 컬럼 매핑 요구사항 추가 회원은 일반 회원과 관리자로 구분해야 한다 회원 가입일과 수정일이 있어야 한다 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다 @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @Temporal(TemporalType.TIMESTAMP) private Date lastModifiedDate; @Lob.. 2022. 3. 14.
[JPA] JPA 영속성 컨텍스트 JPA 영속성 컨텍스트 엔티티 매니저 팩토리와 앤티티 메니저 웹 어플리케이션을 개발할때 엔티티 메니저 팩토리를 사용해서 사용자의 요구가 들어올때마다 엔티티 매니저를 만들고 CONNETION 을 사용해서 DB를 사용함 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이다 영속성 컨텍스트는 논리적인 개념인데 엔티티 매니저를 통해서 엔티티 컨텍스트에 접근한다 엔티티 매니저를 생성하면 1:1로 영속성 컨텍스트를 생성한다 엔티티 생명주기 비영속 //JPA와 관계없는 비영속 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 영속 //객체 생성 후 EntityManager em = emf.createEntityManag.. 2022. 2. 23.
[JPA] JPA CRUD 기본 동작 JPA에서는 CRUD 기본 동작을 획기적으로 가볍게 바꿔준다 다음 코드를 보면 감탄이 저절로 나온다 INSERT 엔터티를 저장하기위한 persist() 메소드에 저장할 엔터티를 넘겨주면 끝이다 String id = "id"; Member member = new Member(); member.setId(id); member.setUsername("kk"); member.setAge(2); //등록 em.persist(member); JPA는 회원 엔티티의 매핑 정보를 분석해서 다음과 같은 SQL을 만들어서 데이터베이스에 전달한다 INSERT INTO MEMBER (ID, NAME, AGE) VALUES ('id', 'kk', 2); UPDATE UPDATE는 단순히 엔터티의 값만 변경해주면 완성이다. St.. 2022. 2. 23.
[개발 개념] JPA 매핑정보 어노테이션 JPA 매핑정보 어노테이션 JPA를 사용할때 매핑을 하기 위해 사용하는 어노테이션 정리 @Entity 이 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 이렇게 @Entity가 사용된 클래스를 엔터티 클래스라고 한다 @Table 엔터티 클래스에 매핑할 테이블 정보를 알려준다. 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다 @Id 엔터티 클래스의 필드를 테이블의 기본(Primary key) 키에 매핑한다. 이렇게 @Id가 사용된 필드를 식별자 필드라고 한다 @Columm 필드를 컬럼에 매핑한다 매핑정보가 없는 필드 매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다 2022. 2. 22.
[개발 개념] JPA를 왜 사용해야 하는가? (2) JPA를 사용해야 하는 이유 2 많은 SQL 매핑보다 JPA를 사용해야 하는 이유 JPA를 사용하면 자바 코드로 컬렉션에 저장하듯이 JPA에게 저장할 객체를 전달하면 된다 INSERT SQL를 작성하고 JDBC API를 사용하는 지루하고 반복적인 작업을 JPA가 대신해준다 따라서 지루하고 반복적인 코드와 CRUD용 SQL을 개발자가 직접 작성하지 않아도 되는 장점이 있다 개발을 할 때 SQL를 직접 다루면 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL과 결과를 매핑하기 위한 JDBC API코드를 모두 변경해야 한다 이런 과정을 JPA가 대신 처리해준다 JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기능을 제공한다 JPA는 애플리케이션과 데이터베이스 사이에서 동작하는데.. 2022. 2. 18.
[개발 개념] JPA를 왜 사용해야하는가? JPA를 공부하던 중 JPA와 MYBATIS의 차이점 그리고 JPA를 왜 사용해야 하는지에 대한 질문을 받았다 부족하지만 이것에 대한 답을 정리해봤다 답변 : 1. JPA와 MYBATIS의 차이점 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다 반면에 테이블은 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다 mybatis를 사용하면 연관관계를 입력해주고 메서드를 늘려야 하는데 JPA는 자동으로 쿼리를 작성해주고 연관관계를 맺어주어 자유로운 탐색을 지원한다 또한, 컬랙션 형식으로 보관하는 것을 보장하기 때문에 효율적인 자원관리가 가능하다 2. JPA를 왜 사용해야 하는지 (쿼리자동 생성 제외 자유로운 탐색을 .. 2022. 2. 17.