일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스토어드 프로시저
- eager
- 백트래킹
- 지연로딩
- shared lock
- 데코레이터
- fetch
- CHECK OPTION
- 힙
- PS
- 유니크제약조건
- execute
- querydsl
- SQL프로그래밍
- 일대다
- 동적sql
- JPQL
- 연결리스트
- 연관관계
- 이진탐색
- 다대다
- 스프링 폼
- FetchType
- 낙관적락
- dfs
- 즉시로딩
- exclusive lock
- 비관적락
- BOJ
- 다대일
- Today
- Total
목록Spring (90)
흰 스타렉스에서 내가 내리지
파라미터 바인딩 public interface MemberRepository extends JpaRepository{ @Query("select m from Member m where m.username = :name") Member findByUsername(@Param("name") String username); } 벌크성 수정 쿼리 public interface MemberRepository extends JpaRepository { @Modifying @Query("update Product p set p.price = p.price * 1.1 where p.stockAmount < :stockAmount") int bulkPriceUp(@Param("stockAmount") String sto..
TypedQuery query = em.createQuery("SELECT m FROM Member m", Member.class); List resultList = query.getResultList(); for(Member member : resultList){ System.out.println("member = " + member); } em.createQuery()의 두 번째 파라미터에 반환할 타입을 지정하면 TypeQuery를 반환하고, 지정하지 않으면 Query를 반환한다. Query query = em.createQuery("SELECT m.name, m.address from Member m"); List resultList = query.getResultList(); for(Object ..
JPQL ★ JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다. Criteria Criteria는 JPQL을 생성하는 빌더 클래스다. Criteria의 장점은 문자가 아닌 query.select(m).where(...) 처럼 프로그래밍 코드로 JPQL을 작성할 수 있다는 점이다. JPQL에서 오타가 있다면, 컴파일은 성공하고 런타임 시점에 오류가 발생한다. 이것이 문자기반 쿼리의 단점이다. 반면에 Criteria는 문자가 아닌 코드로 JPQL을 작성한다. 따라서 컴파일 시점에 오류를 발견할 수 있다. CriteriaQuery cq = query.select(m).where(cb.equal(m.get("username"), "kim"));..
값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다. @Entity @Getter @Setter public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Embedded private Address homeAddress; @ElementCollection @CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "MEMBER_ID")) @Column(name = "FOOD_NAME") private Set favoriteFoods = new ..
임베디드 타입 (복합 값 타입) public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Embedded Period workPeriod; @Embedded Address homeAddress; @Embeddable public class Period { @Temporal(TemporalType.DATE) Date startDate; @Temporal(TemporalType.DATE) Date endDate; } @Embeddable public class Address { @Column(name = "city") private String city; private String street; private ..
영속성 전이 : 저장 - CascadeType.PERSIST @Entity public class Parent{ ... @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List children = new ArrayList(); ... } CascadeType.PERSIST 는 부모를 영속화할 때 연관된 자식들도 함께 영속화하게 한다. 그래서 부모를 영속화했으면 자식들을 영속화하는 코드를 따로 작성할 필요가 없다. 영속성 전이 : 삭제 - CascadeType.REMOVE 부모 엔티티만 삭제하면 연관된 자식 엔티티도 함께 삭제된다. CASCADE의 종류 public enum CascadeType{ ALL,//모두 적용 PERSI..
엔티티를 조회할 때 사용하지 않는 연관된 엔티티까지 데이터베이스에서 함께 조회해 두는 것은 효율적이지 않다. JPA는 이런 문제를 해결하려고 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연로딩이라고 한다. team.getName() 처럼 팀 엔티티 값을 실제 사용하는 시점에 데이터베이스에서 팀 엔티티에 필요한 데이터를 조회하는 것이다. 그런데 지연로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 한다. Member member = em.find(Member.class, "member1"); 이렇게 엔티티를 직접 조회하면 조회한 엔티티를 실제 사용하든 사용하지 않든 데이터베이스를 조회하게 ..
일대일 조인 테이블 @Entity @Getter @Setter public class Parent { @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; private String name; @OneToOne @JoinTable(name = "PARENT_CHILD", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID") ) private Child child; } @Entity @Getter @Setter public class Child { @Id @GeneratedValue @Column(name = "CHILD_..
자식 테이블의 기본 키 값으로 부모 테이블의 기본 키 값만 사용한다. @Entity public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") private Long id; private String title; @OneToOne(mappedBy = "board") private BoardDetail boardDetail; } @Entity public class BoardDetail { @Id private Long boardId; @MapsId //BoardDetail.boardId 매핑 @OneToOne @JoinColumn(name = "BOARD_ID") private Board board; private String content;..
부모, 자식, 손자까지 계속 기본 키를 전달하는 식별 관계다. 식별 관계에서 자식 테이블은 부모 테이블의 기본 키를 포함해서 복합 키를 구성해야 하므로 @IdClass 나 @EmbeddedId를 사용해서 식별자를 매핑해야 한다. @IdClass와 식별관계 @Entity @Getter @Setter public class Parent { @Id @Column(name = "PARENT_ID") private Long id; private String name; } @Entity @Getter @Setter @IdClass(ChildId.class) public class Child { @Id @ManyToOne @JoinColumn(name = "PARENT_ID") public Parent parent;..