일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- computer science
- 영속성 컨텍스트
- 스프링 시큐리티
- mysql
- JPA
- spring batch
- ORM
- spring boot
- 웹 서버
- CI/CD
- 가상화
- 데이터베이스
- HTTP
- Spring
- vm
- 스프링 배치
- 자바
- CS
- Container
- 스프링 부트
- Java
- 스프링
- 도커
- virtualization
- 배포
- Spring Security
- spring cloud
- 컨테이너
- web server
- 백엔드
- Today
- Total
목록Back-End/자바 ORM 표준 JPA 프로그래밍 (10)
개발 일기

경로 표현식 .(점) 을 통해 객체 그래프를 탐색하는 것으로 상태 필드(state field) : 단순히 값을 저장하기 위한 필드 (ex: m.username) 경로 탐색의 끝으로 더이상 탐색 불가하다. 연관 필드(association field) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 묵시적 내부 조인(inner join) 발생, 탐색O 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 묵시적 내부 조인 발생, 탐색X -> 결과가 컬렉션이기 때문에 속성 값에 접근할 수 없다. 묵시적 조인은 실무(큰 프로젝트)에서는 사용을 지양해야한다. 튜닝하기 엄청 어려워진다..

JPA는 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 등 다양한 쿼리를 지원한다. 그 중 JPQL에 대해 알아보자 JPQL(Java Persistence Query Language) JPA를 사용하면 엔티티 객체를 중심으로 개발하는데 문제는 검색 쿼리이다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하는데 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다. 그래서 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요! JPA는 SQL을 추상화하여 엔티티 객체를 대상으로 검색하는 JPQL이라는 객체 지향 쿼리 언어 제공 이때 SQL을 추상화한 것이기 때문에 특정 데이터베이스 SQL에 의존하 지 않는다...

기본값 타입 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능하다. ex) 회원 엔티티의 키, 나이 값이 변경 되도 식별자로 인식 가능 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 - 자바 기본 타입(int, double) - primitive type - 래퍼 클래스(Integer, Long) - String 생명 주기를 엔티티에 의존, ex) 회원 삭제 시 이름, 나이 등 필드들 함께 삭제 값 타입은 공유하면 X, ex) 회원 이름 변경 시 다른 회원의 이름도 함께 변경되..

프록시 프록시를 이해하고 아래의 즉시로딩 지연로딩에 대해서 이해할 수 있다. 우선 왜 프록시가 쓰이는가? Member를 조회할 때 Team도 함께 조회해야 하는가? // 1. 회원과 팀 함께 출력 public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName()); } // 2. 회원만 출력 public void printUserAndTeam(String memberId) ..

상속관계 매핑 객체 상으로는 상속 관계가 존재한다. 그러나 관계형 데이터베이스는 상속 관계가 없다! 그나마 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑 = `객체의 상속과 구조`와 `DB의 슈퍼타입 서브타입` 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 1. 각각테이블로변환 -> 조인전략 만약 그냥 객체만 고려하여 Item 객체를 만들어 Album, Movie, Book에서 extends Item을 통해 처리해놓고 Item객체에 @Inheritance(strategy = InheritanceType.JOINED)를 걸어주면 아래와 같이 매핑됨. ex) movie의 경우 movie.setDirector/Actor/Name/Price()해주면 ..

연관관계 매핑시 고려사항 3가지 모두 앞서 다룬 내용들이다. 그래도 한번 정리해보자면, 다중성 다대일(@ManyToOne), 일대다(@OneToMany), 일대일(@OneToOne), 다대다(@ManyToMany) 단방향, 양방향 테이블은 외래 키 하나로 양쪽 조인이 가능하여 방향이라는 개념이 없지만 객체는 참조용 필드가 있는 쪽으로만 참조 가능하다. 그래서 한쪽만 참조하면 단방향 양쪽으로 서로 참조하면 양방향이다. 연관관계의 주인 객체 양방향 관계는 참조가 2군데 있어서 둘 중 테이블의 외래키를 관리할 곳을 지정해야하는데 이때 연관관계의 주인은 외래 키를 관리(등록 및 조회 등)하는 참조가 되고 주인의 반대편은 외래 키에 영향을 주지 않고 단순 조회만 가능하다. 다대일 [N:1] 다대일 단방향 앞서 다..

객체의 참조와 테이블의 외래 키를 어떻게 매핑하는가! 연관관계가 필요한 이유 ex) 회원과 팀이 있을때 회원은 하나의 팀에만 소속될 수 있으며 회원과 팀은 다대일 관계(N:1)다. 우선, 참조가 아닌 객체를 테이블에 맞추어 모델링한다고 가정해보자. 즉, 연관관계가 없는 객체이다. 관계형 데이터베이스를 다뤄본 개발자라면 위의 그림을 이해하는데는 그닥 어렵지 않을 것이다. 하나의 팀에 여러명의 맴버가 포함될 수 있기 때문에 member테이블에서 FK로 team_id를 가지는 것이다. 이러한 테이블을 바탕으로 객체에 맞게 해보면 Member객체가 teamId(테이블에서의 외래키)값을 그대로 들고있는 것이다. //팀 저장 Team team = new Team(); team.setName("TeamA"); em...

엔티티 매핑은 크게 4가지로 볼 수 있다. 1. 객체와 테이블 매핑 (@Entity, @Table) 2. 필드와 컬럼 매핑 (@Column) 3. 기본 키 매핑 (@Id) 4. 연관관계 매핑 (@ManyToOne, @JoinColumn) 이중 1,2,3을 이번 섹션에서 다루고 4번을 다음 섹션에서 다룰 것이다. 객체와 테이블 매핑 (@Entity, @Table) @Entity 해당 어노테이션이 붙은 클래스는 JPA가 관리하며 그것을 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의 - 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) - final 클래스, enum, interface, inner 클래스 사용 X - 저장할 필드에 final..