목록분류 전체보기 (518)
개발놀이터
*사용법 ①선언 import java.util.Timer import java.util.TimerTask ②초기화 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override }; ③구현 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { 반복하고싶은 코드 } }; timer.scheduleAtFixedRate(task, 1000, 60 * 1000); scheduleAtFixedRate의 첫번째 인자값은 반복하고싶은 TimeTask, 두번째 인자값은 해당 인자값 후에 실행, 세번째 인자값은 몇초단위로 반복할지 단위는 ms 즉..
*변경감지(Dirty Checking)와 병합(merge) 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. em.persist로 넣을 때 혹은 em.find 등으로 디비에서 값을 가져올 때 영속성 컨텍스트에 데이터들이 들어간다. 임의로 만든 엔티티가 식별자를 가지고 있으면 준영속 엔티티로 간주한다. 준영속 엔티티를 수정하는 2가지 방법 1. 변경감지(Dirty Checking) 2. 병합(merge) 1. 변경감지 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법이다. 트랜잭션 안에서 엔티티르 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에 변경 감지가 작동해 데이터베이스에 update 쿼리가 날아간다. 2. 병합 병합의 동작 방식 1. merge()를..
*경로표현식 경로표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것 select m.name -> m.name = 상태 필드 from Member m join m.team t -> m.team = 단일 값 연관 필드 join m.orders o where -> m.orders = 컬렉션 값 연관 필드 t.name = 'teamA' 상태필드 : 단순히 값을 저장하기 위한 필드 = 경로 탐색의 끝, 탐색 X 연관필드 : 연관관계를 위한 필드 -단일 값 연관 필드 (@ManyToOne, @OneToOne, 대상이 엔티티) = 묵시적 내부조인 발생, 탐색 O -컬렉션 값 연관 필드 (@OneToMany, @ManyToMany, 대상이 컬렉션) = 묵시적 내부조인 발생, 탐색 X 묵시적 조인, 명시적 조인 묵..
*JPQL -테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 -SQL을 추상화해서 특정 데이터베이스 SQL에 의존X -JPQL을 한마디로 정의하면 객체 지향 SQL JPQL이 해결해야할 가장 큰 문제점 = 동적쿼리 그에 따른 해결책 = Criteria, Querydsl Criteria의 특징 -문자가 아닌 자바코드로 JPQL을 작성할 수 있음 -JPQL 빌더 역할 -JPA 공식기능 -치명적인 단점 : 너무 복잡하고 실용성이 없다. -Criteria대신 Querydsl 사용 권장 Querydsl의 특징 -문자가 아닌 자바코드로 JPQL을 작성할 수 있음 -JPQL 빌더 역할 -컴파일 시점에 문법 오류를 찾을 수 있음 -동적 쿼리 작성 편리함 -단순하고 쉬움 -실무 사용 권장 *JPQL 소개 -JPQ..
*값 타입 JPA의 데이터 타입 분류에는 두가지 타입이 있다. 1. 엔티티 타입 2. 값 타입 1. 엔티티 타입 특징 1-1. @Entity로 정의하는 객체 1-2. 데이터가 변해도 식별자로 지속해서 추적 가능 (PK) 1-3. ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 추적 가능 2. 값 타입 특징 2-1. int ,Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 2-2. 식별자가 없고 값만 있으므로 변경시 추적 불가 2-3. ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입에는 세가지 분류가 있다 1. 기본값 타입 2. 임베디드 타입 3. 컬렉션 타입 1. 기본값 타입 자바에서 흔히 사용하는 타입으로 자바 기본타입인 int, do..
*지연 로딩과 즉시 로딩 지연로딩과 즉시로딩을 알기 전에 프록시라는 것을 짚고 넘어가야 한다. *프록시 프록시의 의미는 앞에서 대신 무언갈 중계해준다. 정도의 느낌이다. 프록시 서버도 마찬가지의 매커니즘이다. 그럼 지연로딩과 즉시로딩에서 프록시는 어떤 역할을 할까? 말 그대로 로딩 즉 데이터를 읽어오는 과정을 중계해준다. 예를 들어서 Member 엔티티와 Team 엔티티가 있다고 가정해보자, 비지니스 로직상 Member에 있는 데이터들만 조회하거나 입력할텐데 Team까지 필요하진 않을 것이다. 그런데 @ManyToOne 혹은 @OneToOne 어노테이션에서는 em.find(Member.class, member.getId()); 를 하면 Member 테이블은 물론이고 Team까지 조인해서 값을 가져온다. ..
*상속관계 매핑 테이블을 설계하는것에 있어서 공통된 칼럼이 계속 등장하면 어떻게해야할까? 방법은 크게 세가지로 나눌 수 있다. 1. 한 테이블에 다 때려박는 SINGLE_TABLE 전략 2. 각 테이블에 중복되는 칼럼을 그냥 집어넣는 TABLE_PER_CLASS 전략 3. 슈퍼타입와 서브타입를 이용하는 JOINED 전략 *JOINED 전략 관계형 데이터베이스에는 상속관계라는 것이 없다. 하지만 비슷한 모델링이 있는데 바로 슈퍼타입 서브타입이다. 예를 들어서 앨범, 책, 영화 테이블에 각각 공통 칼럼인 이름과 가격을 슈퍼타입인 아이템 테이블에 다 담는 것이다. 그리고 서브타입인 앨범, 책, 영화에는 슈퍼클래스의 PK값을 PK,FK값으로 사용함으로써 추후에 서브타입를 찾으려 할때는 조인을 사용해서 찾을 수 ..
*연관관계의 주인 연관관계의 주인 딜레마는 양방향 연관관계에서 고민해야할 문제인데 양방향 매핑 규칙이 있다. 연관관계의 주인이란 단방향 연관관계를 두개를 만들어야하는 양방향 연관관계에서 둘 다 객체를 만들어버리면 예를들어 Member, Team 두개에서 Team클래스에서는 Member member로 단방향 매핑을 구축하고 Member 클래스에서는 Team team으로 단방향 매핑을 구축하면 둘 중 어떤 클래스에서 디비에 있는 FK를 수정할지 결정을 해야한다. 이것이 바로 연관관계의 주인이다. 양방향 매핑 규칙 1. 객채의 두 관계중 하나를 연관관계의 주인으로 지정 2. 연관관계의 주인만이 외래키를 관리 (등록, 수정) 3. 주인이 아닌 쪽은 읽기만 가능 4. 주인은 mappedBy 속성 사용 X 5. 주..
*기본 키 매핑 기본 키 매핑 방법 1. 직접 할당 (@Id) 2. 자동 생성 (@GeneratedValue) -IDENTITY : 데이터베이스에 위임, MYSQL -SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE (@SequenceGenerator 필요) -TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 (@TableGenerator 필요) -AUTO : 방언에 따라 자동 지정, 기본값 *IDENTITY 전략 -@GeneratedValue(strategy = GenerationType.IDENTITY) -기본 키 생성을 데이터베이스에 위임 -주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (ex) MySQL의 AUTO_INCREMENT) -JP..
*엔티티 매핑 @Entity -@Entity가 붙은 클래스는 JPA가 관리, 엔티티라고 한다. -JPA를 사용해서 테이블과 매핑할 클래스는 @Entity필수 -주의 1. 기본생성자 필수 2. final 클래스, enum, interface, inner 클래스 사용 X 3. 저장할 필드에 final 사용 X *@Table(name = "Member") -테이블 명과 매핑시킬 수 있음 -관례는 클래스 이름이 테이블 이름과 매핑됨 *@Column(name = "username") -컬럼명을 매핑 시키는 어노테이션 -객체를 사용할 때 변순는 name으로 사용하고 싶고 실제 디비상에서의 컬럼은 username이라고 되어있을 때 매핑하기 위한 어노테이션 @Column의 속성 -name = "username" 필드와..