일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 지연로딩
- 다대다
- 낙관적락
- CHECK OPTION
- 스토어드 프로시저
- fetch
- 힙
- 즉시로딩
- 동적sql
- 연결리스트
- 백트래킹
- dfs
- PS
- BOJ
- 이진탐색
- exclusive lock
- SQL프로그래밍
- 유니크제약조건
- execute
- FetchType
- 다대일
- shared lock
- 스프링 폼
- eager
- 데코레이터
- querydsl
- 일대다
- JPQL
- 비관적락
- 연관관계
- Today
- Total
목록Spring (90)
흰 스타렉스에서 내가 내리지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/wwv4z/btrYRU9s2Fk/Ivj1llsEH41gXRbmYUJP7k/img.png)
@Entity public class Hello{ @Id private String id1; @Id private String id2; } 둘 이상의 컬럼으로 구성된 복합 기본 키는 위의 코드처럼 하면 매핑 오류가 발생한다. JPA에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다. JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 그리고 식별자를 구분하기 위해 equals와 hashCode를 사용해서 동등성 비교를 한다. 그런데 식별자 필드가 하나일 때는 보통 자바의 기본 타입을 사용하므로 문제가 없지만, 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들고 그곳에 equals와 hashCode를 구현해야 한다. JPA는 복합 키를 지원하기 위해 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/SiycR/btrYTWSF8il/1uhsFKyYXCAKyudKdai131/img.png)
데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분한다. 식별관계 (Identifying Relationship) 비식별관계 (Non-Identifying Relationship) 식별관계 : 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계 비식별관계 : 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계 비식별 관계 - 필수적 비식별 관계 : 연관관계를 필수로 맺어야 한다. 외래 키에 null을 허용하지 않는다. - 선택적 비식별 관계 : 연관관계를 맺을지 말지 선택할 수 있다. 외래 키에 null을 허용한다. 최근에는 비식별 관계를 주로 사용하고 꼭 필요한 곳에만 식별 관계를 사용하..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/uKDTe/btrYV94OVX0/Hvuk1moR3tsEQlqYB34UEK/img.png)
슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법이 있다. 1. 조인 전략 - 위의 사진처럼 각각을 모두 테이블로 만들고 조회할 때 조인 사용 2. 단일 테이블 전략 - 테이블을 하나만 사용해서 통합 3. 구현 클래스마다 테이블 전략 - 서브타입마다 하나의 테이블을 만듦. 비추천 1. 조인 전략 맨 위 사진처럼 엔티티 각각을 모두 테이블로 만들고, 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 따라서 조회할 때 조인을 자주 사용한다. 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없다. 따라서 타입을 구분하는 DTYPE 컬럼을 구분 컬럼으로 사용한다. @Entity @Inheritance(strategy = Inheri..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/JIMI3/btrYRle0dfr/CdHk5F81JRNie2p44VJexk/img.png)
@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 전략의 장점은 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 것이다. 특히 키 생성 전략이 아직 확정되지 않은 개발 초기 단계나 프로토타입 개발 시 ..