스프링부트

[스프링부트] 개발하다가 알게된 Entity

딤섬뮨 2022. 7. 16. 01:08
728x90

Entity

- DB의 테이블에 존재하는 Column들을 필드로 가지는 객체를 말한다.
- Entity는 DB의 테이블과 1:1 대응
- JPA를 사용할 때 Setter를 만드는 것을 피해라.

Setter를 무분별하게 사용하게 되면, Entity의 인스턴스 값들이 언제 어디서 변하는지 명확하게 알기 힘듬.

따라서 Setter대신 다른 방법으로 필드에 값을 넣어 주는 것이 좋다.

👀Builder패턴을 사용 하는 것이 좋다.👀

멤버 변수가 많아지더라도 어떤 값을 어떤 필드에 넣는지 코드를 통해 확인할 수 있고 필요한 값만 집어 넣는 것이 가능해짐.


Entity에서 사용하는 어노테이션

@EntityListners(AutditingEntityListenr.class) : 공통적으로 가지고 있는 필드나 컬럼들을 시간에 대해서 자동으로 값을 넣어주는 기능

-> Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재합니다. 대표적으로 생성일자, 수정일자, 식별자 같은 필드 및 컬럼이 있습니다.

도메인마다 공통으로 존재한다는 의미는 결국 코드가 중복된다는 말과 일맥상통합니다. 데이터베이스에서 `누가, 언제`하였는지 기록을 잘 남겨놓아야 합니다. 그렇기 때문에 생성일, 수정일 컬럼은 대단히 중요한 데이터 입니다.

그래서 JPA에서는 `Audit`이라는 기능을 제공하고 있습니다. Audit은 `감시하다, 감사하다`라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 됩니다.


@EqualsAndHashCode(of="id", callSuper = false)

equals : 두 객체의 내용이 같은지 동등성을 비교하는 연산자입니다.

hashcode:두 객체가 같은 객체인지 동일성(identity)을 비교하는 연산자.

callSuper=true로 설정 시 부모 클래스 필드 값들도 동일한지 체크하며 false일 경우 자신 클래스의 필드 값만 고려합니다.

@Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id


@Id: JPA가 객체를 관리할 때 식별할 기본키를 지정한다.

이것 땜에 엄청 헷갈려했었다. 나는 careerId를 기본키로 조회,생성,삭제를 하고 싶었는데 그게 아니라 **Id 즉 PK는 보통 GeneratedValue로 값을 자동으로 생성해서 사용**한다고 한다.(jpa를 본격적으로 파야할듯)

Identity전략
- 기본 키 생성을 데이터베이스에 위임하는 전략→ 사용하는 데이터베이스에 의존한다
- 주로 `MySQL`, `PostgreSQL`, `SQL Server`, `DB2`에서 사용
- 데이터베이스에 값을 저장(`INSERT`)한 후 기본 키 값 조회 가능→ 엔티티에 식별자 값 할당하기 위해 데이터베이스 추가 조회

@Column(name = "del_yn", nullable = true, length = 1)
    protected String del_yn = "N";

    public void deleted() {
        this.del_yn = "Y";
    }

    public void reCreated(){
        this.del_yn = "N";
    }


**del_yn** : 논리적으로 삭제 여부를 표시하는 것

처음에 후다닥 구현할 때는 무엇인지 모르고 개발했는데 delete을 할 때

“cascade이슈가 있어서 7월 미팅 때 멘토님께 상속 관계에 있을 때 부모 필드 값을 삭제하면 자식까지 다 날려야하는가?”라고 여쭤봤는데 실무에서는 데이터를 다 날리는건 위험한 일이라서 del_yn 필드값을 통해 삭제가 되었다면 del_yn=”Y”로 바꾼다고 한다. 그러면 그거는 삭제된 데이터란 의미

-> deleted() reCreated()로 제어함.

- 물리삭제 논리삭제
    
    **물리삭제**
    
    물리삭제는 저장메모리에서 데이터를 삭제하는 것을 말한다.
    
    DELETE FROM 테이블 WHERE 조건절
    
    **논리삭제**
    
    논리삭제는 테이블에 새로운 삭제열(USE_YN, DEL_YN ....)을 주어 조회시에 제외하는 것을 말한다. 논리적으로는 삭제 되었다고 판단하나 물리적으로 삭제된 것이 아닌 데이터이다.
    

  @CreatedDate            //최초 생성 시간
    @Column(name = "created_at", nullable = true, updatable = false)
    protected Timestamp created_at = null;

    @LastModifiedDate       //마지막 수정 시간
    @Column(name = "updated_at", nullable = true)
    protected Timestamp updated_at = null;



시간 관련된건 말 그대로 최초 생성 ,마지막 수정 시간

728x90

'스프링부트' 카테고리의 다른 글

AppConfig를 언제 써야하는가?  (2) 2022.09.07
[스프링] 전략 패턴  (3) 2022.08.19
[스프링]ThreadLocal  (4) 2022.08.09
[스프링부트] 서블릿 Servlet  (0) 2022.07.22
[스프링부트] 컴포넌트 스캔  (0) 2022.07.06