일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- execute
- 데코레이터
- 연결리스트
- 이진탐색
- SQL프로그래밍
- shared lock
- 즉시로딩
- PS
- 연관관계
- 스토어드 프로시저
- 힙
- 다대다
- 유니크제약조건
- 일대다
- exclusive lock
- dfs
- fetch
- 동적sql
- 비관적락
- querydsl
- eager
- 스프링 폼
- CHECK OPTION
- 백트래킹
- 다대일
- 낙관적락
- 지연로딩
- BOJ
- FetchType
- JPQL
- Today
- Total
목록전체 글 (555)
흰 스타렉스에서 내가 내리지

데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분한다. 식별관계 (Identifying Relationship) 비식별관계 (Non-Identifying Relationship) 식별관계 : 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계 비식별관계 : 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계 비식별 관계 - 필수적 비식별 관계 : 연관관계를 필수로 맺어야 한다. 외래 키에 null을 허용하지 않는다. - 선택적 비식별 관계 : 연관관계를 맺을지 말지 선택할 수 있다. 외래 키에 null을 허용한다. 최근에는 비식별 관계를 주로 사용하고 꼭 필요한 곳에만 식별 관계를 사용하..

슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법이 있다. 1. 조인 전략 - 위의 사진처럼 각각을 모두 테이블로 만들고 조회할 때 조인 사용 2. 단일 테이블 전략 - 테이블을 하나만 사용해서 통합 3. 구현 클래스마다 테이블 전략 - 서브타입마다 하나의 테이블을 만듦. 비추천 1. 조인 전략 맨 위 사진처럼 엔티티 각각을 모두 테이블로 만들고, 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 따라서 조회할 때 조인을 자주 사용한다. 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없다. 따라서 타입을 구분하는 DTYPE 컬럼을 구분 컬럼으로 사용한다. @Entity @Inheritance(strategy = Inheri..

@ManyToMany 이용 @Entity @Getter @Setter public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @JoinColumn(name = "MEMBER_ID"), inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID")) private List products = new ArrayList(); } @Entity public class Product { @Id @GeneratedValue @Col..
다대일, 일대다, N:1, 1:N, ManyToOne, OneToMany - 양방향 @Entity @Getter @Setter public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public void setTeam(Team team){ this.team = team; //무한루프에 빠지지 않도록 체크 if(!team.getMembers().contains(this)){ team.getMembers().add(this); } } } @Entity @Gett..
객체에는 양방향 연관관계라는 것이 없다. 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 잘 묶어서 양방향인 것처럼 보이게 할 뿐이다. JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래 키를 관리해야 하는데 이것을 연관관계의 주인 이라 한다. 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리 (등록, 수정, 삭제) 할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다. 주인은 mappedBy 속성을 사용하지 않는다. 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다. mappedBy 속성은 양방향 매핑일 때 사용하는 데 반대쪽 매핑의 필드 이름을 값으로 주면 된다. 연관관계의 주인을 정한다는 것은 사실 외래 키 관리자를..
@Transient private String firstName; @Transient private String lastName; private String fullName; @Access(AccessType.PROPERTY) public String getFullName(){ return firstName + lastName; } 프로퍼티 접근 방식으로 지정.
이 필드는 매핑하지 않는다. 따라서 데이터베이스에 저장하지 않고 조회하지도 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다. @Transient private Integer temp;
@Temporal 날짜 타입 (java.util.Date, java.util.Calendar) 을 매핑할 때 사용한다. 속성 기능 기본값 value TemporalType.DATE 날짜, 데이터베이스 date 타입과 매핑 (예 : 2023-02-10) TemporalType.TIME 시간, 데이터베이스 time 타입과 매핑 (예 : 15:25:25) TemporalType.TIMESTAMP 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (예 : 2023-02-10 15:25:25) @Temporal(TemporalType.DATE) private Date date; @Temporal(TemporalType.TIME) private Date time; @Temporal(TemporalType.T..
AUTO 전략 데이터베이스의 종류도 많고 기본 키를 만드는 방법도 다양하다. GenerationType.AUTO는 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다. 예를 들어 오라클을 선택하면 SEQUENCE를, MySQL을 선택하면 IDENTITY를 사용한다. @GeneratedValue.strategy의 디폴트값은 AUTO이다. 따라서 다름과 같이 사용해도 결과는 같다. @Id @GeneratedValue @Column(name = "ID") private String id; AUTO 전략의 장점은 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 것이다. 특히 키 생성 전략이 아직 확정되지 않은 개발 초기 단계나 프로토타입 개발 시 ..

@Entity @Getter @Setter @Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )}) public class Member { @Id @Column(name = "ID") private String id; @Column(name = "NAME", nullable = false, length = 10) private String username; private Integer age; } alter table member add constraint NAME_AGE_UNIQUE unique (name, age) UNIQUE 제약으로 들어..