Raw JPA 로 개발하기
@OneToMany 할 때 List 보다는 Set 로 하는 것을 추천
Set
-> 중복제거 되므로
LinkedHashSet
-> 순서 보장 됨
@PersistenceContext 란?
EntityManager를 빈으로 주입할 때 사용하는 어노테이션
EntityManager : entity 관리
영속성 컨텍스트 – 엔티티를 영구히 저장하는 환경

- User : 유저 정보로 채널과 관계만 양방향이고, 다른 도메인과는 단방향 관계
- Channel : 대화 채널은 유저와 다대다 관계
- Thread : 채널내 대화 쓰레드로 Post 와 같이 댓글, 이모지, 멘션과 관계
- Comment : 쓰레드내 댓글로 쓰레드와 다대일 관계를 가지며 이모지, 멘션과도 관계
- Emotion : 쓰레드, 댓글내 이모지로 쓰레드, 댓글과 다대다 관계
- Mention : 쓰레드, 댓글내 멘션으로 쓰레드, 댓글과 다대다 관계
:: 테이블 매핑 기능
-
@Entity
- 객체 관점에서의 이름
- 디폴트로 클래스명으로 설정됨
- 엔티티의 이름은 JQL에서 쓰임
- JQL : Entity 명으로 쿼리짤때 쓰이는 언어 (ex. JPQL, QueryDsl)
-
@Table
- RDB 의 테이블 이름
- @Entity의 이름이 테이블의 기본값
- 테이블의 이름은 SQL에서 쓰임
- SQL : Table 명으로 쿼리짤때 쓰이는 언어 (ex. JDBC, SQL Mapper)
-
@Id
- 엔티티의 주키를 맵핑할 때 사용.
- 자바의 모든 primitive 타입과 그 랩퍼 타입을 사용할 수 있음
- Date랑 BigDecimal, BigInteger도 사용 가능.
- 복합키를 만드는 맵핑하는 방법도 있음
-
@GeneratedValue
- 주키의 생성 방법을 맵핑하는 애노테이션
- 생성 전략과 생성기를 설정할 수 있음
- 기본 전략은 AUTO: 사용하는 DB에 따라 적절한 전략 선택
- TABLE, SEQUENCE, IDENTITY 중 하나.
-
@Column
- unique
- nullable : default값은 true이고 false로 설정하면 DDL 생성 시 not null 제약 조건이 붙음
- length : 길이
- columnDefinition : 원하는 컬럼 타입으로 데이터 추출이 가능
@Column(columnDefinition = "TEXT")
-
@Temporal
- 현재 JPA 2.1까지는 Date와 Calendar만 지원.
-
@Transient
- 컬럼으로 맵핑하고 싶지 않은 멤버 변수에 사용.
:: 필드타입 매핑 기능
기본 타입
@Column
- String, Date, Boolean, 과 같은 타입들에 공통으로 사이즈를 제한할 용도로 쓰인다.
- Class 에
@Entity
가 붙어있으면 자동으로 필드들에 @Column
이 붙음
@Enumerated
- Enum 매핑용도로 쓰이며 실무에서는
@Enumerated(EnumType.*STRING*)
으로 사용권장
- Default 타입인
ORDINAL
은 0,1,2.. 값으로 들어가기 때문에 추후 순서가 바뀔 가능성있다.
- Composite Value 타입
@Embeddable
@Embedded
@AttributeOverrides
@AttributeOverride
- Collection Value 타입
:: Entity code 정리
- IntelliJ Live Template 사용
- Settings > Editor > Live Templates > Template text (아래 내용 추가) > 속성 설정
/**
* 컬럼 - 연관관계 컬럼을 제외한 컬럼을 정의합니다.
*/
/**
* 생성자 - 약속된 형태로만 생성가능하도록 합니다.
*/
/**
* 연관관계 - Foreign Key 값을 따로 컬럼으로 정의하지 않고 연관 관계로 정의합니다.
*/
/**
* 연관관계 편의 메소드 - 반대쪽에는 연관관계 편의 메소드가 없도록 주의합니다.
*/
/**
* 서비스 메소드 - 외부에서 엔티티를 수정할 메소드를 정의합니다. (단일 책임을 가지도록 주의합니다.)
*/