본문 바로가기

분류 전체보기

(79)
JPQL: 기본문법과 프로젝션 JPQL SQL을 추상화한 객체 지향 쿼리 언어로 엔티티 객체 중심으로 쿼리를 작성할 수 있다. SQL은 데이터베이스 테이블을 대상으로 쿼리를 날리지만 JPQL은 엔티티 객체를 대상으로 쿼리를 날린다 JPQL로 작성하면 결국은 SQL로 변환되어 데이터베이스에 쿼리를 날리게 된다. JPQL 문법 em.createQuery("select m from Member m where m.age > 15", Member.class) Member 테이블 전체를 조회하는 JPQL 쿼리이다. select, from, where과 같은 키워드들은 대소문자를 구분하지 않는다. Member, m.age와 같이 엔티티와 속성은 대소문자를 구분하여야 한다. 테이블 이름이 아닌 엔티티 이름을 써야 한다. Member (as) m과 ..
Spring Boot, Vue.js 캘린더에 일정 추가하기 이벤트 추가하기 지난 게시글에서 이벤트 추가 Dialog를 생성하였다. 오늘은 Dialog를 통해 이벤트를 추가하면 해당 유저의 Event Table에 데이터가 삽입되고 캘린더에 추가된 이벤트가 보이도록 해볼 것이다. Spring Boot Event Entity @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Event extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "event_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @Join..
JPA 연관관계 매핑 6. 영속성 전이(CASCADE)와 고아 객체 영속성 전이(CASCADE) 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들 때 사용하는 방법 부모 엔티티를 저장할 때 자식 엔티티를 저장하거나 , 부모 엔티티를 저장할 때 자식 엔티티도 같이 삭제하는 등의 방식으로 사용된다. 영속성 전이가 없을 때 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "child_id") private Long id; private String name; @ManyToOne @JoinColumn(nam..
JPA 연관관계 매핑 5. 즉시 로딩과 지연 로딩 즉시 로딩과 지연 로딩 즉시 로딩이란 객체 A를 조회할 때 A와 연관된 객체들을 한 번에 가져오는 것이다. 지연 로딩이란 객체 A를 조회할 때는 A만 가져오고 연관된 애들은 저번 게시글에서 본 프락시 초기화 방법으로 가져온다. EAGER, LAZY 즉시 로딩(EAGER)과 지연 로딩(LAZY)은 연관관계의 다중성에 따라 기본값이 달라진다. @ManyToOne, @OneToOne처럼 One으로 끝나는 것들은 기본값이 즉시 로딩이다. @OneToMany, @ManyToMany처럼 Many로 끝나는 것들은 기본값이 지연 로딩이다. 즉시 로딩 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter public class Member ..
JPA 연관관계 매핑 4. 프록시 JPA의 프록시 어떤 A와 B가 연관관계가 있을 때 A를 호출할 때 항상 B도 함께 호출되면 효율적이지 못하다. 이럴 때 프록시를 활용하여 문제를 해결할 수 있다. 예제 엔티티 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter public class Member extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String name; @ManyToOne @JoinColumn(name = "team_id") private Team tea..
JPA 연관관계 매핑 3. 상속관계 매핑 상속관계 매핑 관계형 데이터 베이스에서는 상속관계가 존재하지 않는다. 슈퍼 타입 서브 타입 관계라는 모델링 기법으로 객체 상속과 유사하게 구현이 가능하다. 상속관계 매핑이란 객체의 상속 구조와 관계형 데이터베이스의 슈퍼 타입 서브타입 관계를 매핑해준다. 각각 테이블로 변환 조인 전략 사용 통합 테이블로 변환 단일 테이블 전략 사용 서브타입 테이블로 변환 구현 클래스마다 테이블 전략 사용 1. 조인 전략 테이블 생성 쿼리를 보면 Book table에서 item_id를 외래 키로 가지고 있는 것을 알 수 있다. @DiscriminatorColumn으로 서브 타입의 값을 알 수 있다. 서브 타입인 Book에서 @DiscriminatorValue("BOOK")을 통해 DTYPE에 넣을 값을 정할 수 있다. @E..
JPA 연관관계 매핑 2. 일대다, 다대일, 일대일, 다대다 연관관계 매핑 연관관계 매핑 연관관계 매핑 시 고려해야 할 3가지가 다중성, 단방향 or 양방향, 연관관계의 주인이라고 저번 게시글에 작성하였다. 이 게시글에서는 다중성에 대해 알아본다. JPA에서는 연관관계를 맺을 때 다중성을 annotation으로 표기한다. @ManyToMany, @ManyToOne, @OneToOne, @OneToMany으로 이름만 봐도 명확하게 이해가 가능하다. 일대일(@OneToOne) 일대일 연관관계 매핑은 저번 게시글에서 다룬 거처럼 외래 키를 원하는 곳에 두면 된다. 다대일(@ManyToOne) 다대일의 반대는 일대다이다. 그러므로 다대일 매핑을 하면 상대편 객체에서 일대다로 매핑을 하는 것과 같다. 실제 테이블에서는 다 쪽이 외래 키를 가지게 된다. 그러므로 다대일 매핑을 하는 게 명..
JPA 연관관계 매핑 1. 단방향 양방향 연관관계 이해하기 단방향과 양방향 연관관계 연관관계 매핑 기초용어 방향 : 단방향, 양방향 다중성: 일대일, 일대다, 다대다, 다대일 연관관계 주인: 객체 양방향 연관관계는 주인이 필요하다 단방향 매핑 JPA에서 단방향 매핑은 JoinColumn과 One(Many) ToOne(Many)를 통해 할 수 있다. Member 클래스 필드의 Team을 보면 Team과 일대일(OneToOne)으로 매핑을 한 것이다. @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Team { @Id @GeneratedValue @Column(name = "team_id") private Long id; private String teamName; } @..