ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 51th day
    TIL(Today I Learned) 2021. 12. 12. 15:52

    Entity class에서 getter와 setter

    • 가급적이면 setter는 public으로 설정하지 않는것이 바람직하다.
      • 객체지향의 캡슐화 원칙
    • 이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 메서드만 제공하는것이 이상적이지만, 실무에서 Entity 데이터를 조회하는 경우가 너무 많으므로 Getter의 경우 모두 열어두는것이 편리하다. Getter는 단순 조회 기능만 제공하기 때문에 아무런 영향을 주지 않는다. 하지만, Setter를 막 열어두면 가까운 미래에 엔터티가 도대체 왜 변경되었는지 추적하기 점점 힘들어진다.
      • 따라서, 엔터티를 변경할 때는 Setter 대신에 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공하는것이 좋다.

    @GeneratedValue

    • Entity에서 sequenceId를 사용할 수 있게해주는 어노테이션

    @Column

    • 객체 필드와 DB 테이블 컬럼을 매핑한다
      • name : 매핑할 테이블의 컬럼 이름을 지정

    @Embeddable

    • @Embeddable로 지정한 클래스를 밸류클래스라고한다.
    • @Embeddable로 설정한 클래스는 다른 엔터티의 일부로 저장될 수 있음을 설정하는 어노테이션이다.
    • @Embeddable 매핑한 대상은 기본적으로 엔터티 접근 방법을 따른다(필드 접근타입 또는 프로퍼티 접근 타입)
      • 엔터티에서 프로퍼티 접근 타입을 사용한다면(getter/setter) @Embeddable 매핑한 밸류 클래스 역시 프로퍼티 접근 타입을 사용하기 때문에 getter/setter 메소드를 정의해야한다.(lombok은 어노테이션으로 getter/setter 설정)
    • 엔터티에서 @Embeddable 매핑한 밸류클래스를 호출할 때 코드는 아래 코드와 같다.
    //Member.java
    
    @Embedded
    private Address address;

    value클래스

    • 여러개의 값을 하지지만 개념적으로 하나의 값(주소)로 표현합니다.
    • 아래 코드는 예시
    class Address{
    String address1;
    String address1;
    String zipCode;
    }

    Entity of JPA

    JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 붙인다. @Entity가 붙은 클래스는 JPA가 관리하는 것으로 엔티티라 부른다

    속성

    • name : JPA와 사용할 엔티티 이름을 지정, 사용하지 않을 경우 클래스 이름이 그대로 적용

    주의사항

    • 기본생성자 필수
    • final, enum, interface, inner 클래스는 사용할 수 없음
    • 저장할 필드에 final 사용할 수 없음

    자바에서는 기본 생성자가 없을 경우 자동으로 생성해주지만 만약 파라미터가 있는 생성자가 클래스에 존재할 경우 기본 생성자를 자동으로 생성해주지 않기 때문에 직접 작성해줘야한다.

    @Table

    @Table은 엔티티와 매핑할 테이블을 지정하고, 생략시 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

    속성

    • name : 매핑할 테이블 이름

    JPA 엔티티 매핑

    JPA를 사용할 때 엔티티와 테이블을 정확하게 매핑하는 것이 가장 중요하다. JPA는 매핑 어노테이션을 지원하는데 아래와 같이 크게 4가지로 분류할 수 있다.

    * 객체와 테이블 매핑
    * 기본키 매핑
    * 필드와 컬럼 매핑
    * 연관관계 매핑

    JPA 양방향 관계에서 주인관계 설정

    • (보통 다이면서 외래키(ForignKey)를 주인관계로 설정)
    • 아래는 주인관계 설정 코드
    //Member.java
    //Order 클래스안에 member 필드에 매핑되었음을 선언(읽기 전용이 된다.), 여기에 값을 넣어도 forignkey 값이 변하지 않는다
        @OneToMany(mappedBy = "member")    
        private List<Order> orders = new ArrayList<>();

    LocalDateTime

    과거에는 LocalDate 선언후 관련 어노테이션을 설정해줘야 했지만, 자바8부터 hibernate가 자동으로 지원해준다.


    @Inheritance

    • Join
      • 세심하게 상속 엔터티를 관리
    • SINGLE_TABLE
      • 한곳에 상속 엔터티를 몰아서 관리

    DiscriminatorColumn, DiscriminatorValue

    싱글테이블은 상속받는 엔티티들을 구별해야하기 때문에 @Discriminator를 선언해줘야한다


    Enum

    Enum 선언시 해당 지역변수에 @Enumerated(EnumType.STRING) 선언해줘야하는데, ORDINAL으로 선언하지 말고 STRING으로 선언하는것이 오류방지에 좋다.


    1대1 관계에서 외래키 설정

    주 Access 엔티티에 ForignKey를 설정하는것이 바람직하다.


    관계형 DB에서 다대다 관계

    • 객체는 컬렉션이 존재해서 매핑을 안해도되지만 관계형 DB는 컬렉션 관계를 양쪽에서 가질 수 없기 때문에 일대다, 다대일로 풀어내는 중간 테이블이 필요하다.
      • 하지만 실무에서는 사용하지않는것이 좋다.(필드를 추가하는것이 불가능하기 때문)
    • 아래 코드는 jpa가 제공하는 기능을 확인차 작성하였다.
    //category
    
        @ManyToMany
        //매핑 테이블 생성
        @JoinTable(name = "category_item",    
                joinColumns = @JoinColumn(name = "category_id"),
                inverseJoinColumns = @JoinColumn(name = "item_id")) // 다대일, 일대다 joincolumn을 생성한것.
        private List<Item> items = new ArrayList<>();

    Java Reflection

    JPA 구현 라이브러리가 객체를 생성할 때 리플랙션 같은 기술을 사용할 수 있도록 기본 생성자를 만들고 protected로 설정하는것이 안전하다.

    'TIL(Today I Learned)' 카테고리의 다른 글

    TIL 53th day  (0) 2021.12.14
    TIL 52th day  (0) 2021.12.13
    TIL 50th day  (0) 2021.12.11
    TIL 49th day  (0) 2021.12.10
    TIL 48th day  (0) 2021.12.09
Designed by Tistory.