[내일배움캠프 Spring 4기] 65일차 TIL - Raw JPA 테이블 매핑 기능 | Raw JPA 필드 타입 매핑 기능

서예진·2024년 3월 7일
0

오늘의 학습 키워드 📕

✅ Raw JPA 테이블 매핑 기능
✅ Raw JPA 필드 타입 매핑 기능


도메인 모델과 테이블 설계

  • 메신저를 예시로 하고 도메인 모델과 테이블을 설계하고자 한다.
    • User : 유저 정보로 채널과 관계만 양방향이고, 다른 도메인과는 단방향 관계를 가진다.
    • Channel : 대화 채널은 유저와 다대다 관계를 가진다.
    • Thread : 채널내 대화 쓰레드로 Post 와 같이 댓글, 이모지, 멘션과 관계를 가진다.
    • Comment : 쓰레드내 댓글로 쓰레드와 다대일 관계를 가지며 이모지, 멘션과도 관계를 가진다.
    • Emotion : 쓰레드, 댓글내 이모지로 쓰레드, 댓글과 다대다 관계를 가진다.
    • Mention : 쓰레드, 댓글내 멘션으로 쓰레드, 댓글과 다대다 관계를 가진다.

✅ Raw JPA 테이블 매핑 기능

@Entity

  • 객체 관점에서의 이름
  • 디폴트로 클래스명으로 설정됨
  • 엔티티의 이름은 JQL에서 쓰임
    • JQL : Entity 명으로 쿼리짤때 쓰이는 언어 (ex. JPQL, QueryDsl)

@Table

  • RDB 의 테이블 이름
  • @Entity의 이름이 테이블의 기본값.
    • 주로 Entity 이름과 다르게 Table 명을 지정하고 싶을때 아래와 같이 사용
      @Entity
      @Table(name = "TB_USER")
      public class User () {...}
  • 테이블의 이름은 SQL에서 쓰임
    • SQL : Table 명으로 쿼리짤때 쓰이는 언어 (ex. JDBC, SQL Mapper)

@Id

  • 엔티티의 기본키를 맵핑할 때 사용.
  • 자바의 모든 primitive 타입과 그 랩퍼 타입을 사용할 수 있음
    • Date랑 BigDecimal, BigInteger도 사용 가능.
  • 복합키를 만드는 맵핑하는 방법도 있다. -> 다음 기회에 다루어 볼 예정이다.

@GeneratedValue

  • 주키의 생성 방법을 맵핑하는 애노테이션
  • 생성 전략과 생성기를 설정할 수 있다.
    • 기본 전략은 AUTO: 사용하는 DB에 따라 적절한 전략 선택
    • TABLE, SEQUENCE, IDENTITY 중 하나.

@Column

  1. name: 매핑할 엔티티 필드의 데이터베이스 열 이름을 지정한다. 이를 통해 엔티티 필드와 열의 이름이 다른 경우에 매핑할 수 있다.
  2. nullable: 해당 열이 null 값을 허용하는지 여부를 나타낸다. 기본값은 true로, null 값을 허용한다.
  3. unique: 해당 열에 고유한 값만 허용하는지 여부를 나타낸다.
  4. length: 해당 열의 길이를 제한한다. 주로 문자열 열에 사용된다.
  5. precision과 scale: 부동 소수점 숫자의 정밀도와 소수점 이하 자릿수를 지정한다.

이 밖에도 많은 것을 설정할 수 있다.

@Temporal

  • 현재 JPA 2.1까지는 Date와 Calendar만 지원.
  • 사용하지 않는 것을 추천한다.

@Transient

  • 컬럼으로 맵핑하고 싶지 않은 멤버 변수에 사용.

예시

@Entity
@Table(name = "TB_CHANNEL")
public class Channel {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id", nullable = false)
	private Long id;

	private String name;

	...
}

✅ Raw JPA 필드 타입 매핑 기능

Value 타입 종류

  • 기본 타입

    • @Column

      • String, Date, Boolean, 과 같은 타입들에 공통으로 사이즈를 제한할 용도로 쓰인다.
      • Class 에 @Entity 가 붙어있으면 자동으로 필드들에 @Column 이 붙음 → @Column을 붙이지않아도 된다.
      • @Column 은 사이즈를 제한하거나 추가로 설정할 부분이 있을 때 적용한다.
    • @Enumerated

      • Enum 매핑용도로 쓰이며 실무에서는 @Enumerated(EnumType.*STRING*) 으로 사용권장

      • Default 타입인 ORDINAL 은 0,1,2.. 값으로 들어가기 때문에 추후 순서가 바뀔 가능성있다.

      • 예시

        @Entity
        @Table(name = "TB_CHANNEL")
        public class Channel {
        
        	@Id
        	@GeneratedValue(strategy = GenerationType.IDENTITY)
        	@Column(name = "id", nullable = false)
        	private Long id;
        
        	private String name;
        
        	@Enumerated(EnumType.STRING)
        	private Type type;
        
        	public enum Type {
            	PUBLIC, PRIVATE;
        	}
        }
  • Composite Value 타입

    • @Embeddable

    • @Embedded

    • @AttributeOverrides

    • @AttributeOverride

    • 예시

      @Embeddable
      public class Address {
      
          private String street;
      
          private String city;
      
          private String state;
      
          private String zipCode;
      
      }
      @Entity
      @Table(name = "TB_USER")
      public class User {
      
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          @Column(name = "id", nullable = false)
          private Long id;
      
          @Column(length = 25)
          private String username;
      
          @Column(length = 25)
          private String password;
      
          @Embedded
          @AttributeOverrides({
              @AttributeOverride(name = "street", column = @Column(name = "home_street"))
          }) // Address에 있는 "street" 값을 여기서는 "home_street" 로 저장하겠다.
          private Address address;
      
      }
profile
안녕하세요

0개의 댓글