Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240712 Entity 본문

개발Article

[TIL]20240712 Entity

최밤빵 2024. 7. 12. 23:37

과제를 진행하면서 엔티티를 만들어 사용하면서도 gpt에 의존하다보니 그 역할에 대해서는 명확히 알 지 못해서, 물음표를 잔뜩 가지고 있었다. 예전에 주특기주차 갓 시작하고 기술매니저님께서 강의를 해주신적이있었는데 그땐 스프링을 듣기 시작하지도 못해서 하나도 못 알아들었다...! 그래서 지금이라도 개념을 정리하기로 했다. 

6월 28일 임인혁 매니저님께서 손수 그려서 이해를 시켜주셨었던거 같은데, 그때 질문도 엔티티에 관한 질문이였던 것 같다.

과제에서 엔티티를 사용하여 데이터베이스와의 상호작용을 관리했다. 엔티티는 애플리케이션의 데이터 모델링에서 중요한 역할을 하고, 데이터베이스 테이블과 매핑되어 데이터를 영구적으로 저장하고 조작하는 데 사용된다. 오늘은 엔티티의 개념과 설계방법 그리고 실제 과제에서 사용했던 엔티티 예시를 통해서 엔티티의 중요성과 역할을 정리해보았다! 

 

▶ 엔티티(Entity)란?

 

Entity는 데이터베이스 테이블과 1:1로 매핑되는 클래스이다. 엔티티는 주로 애플리케이션의 도메인 모델을 정의하고, 데이터베이스에서 데이터를 읽고 쓰는 데 사용된다. 엔티티 클레스는 일반적으로 데이터베이스 테이블의 각 열(column)에 해당하는 필드를 가지고, 이러한 필드는 데이터베이스의 컬럼 타입과 일치한다. 

지금 계속 사용하는 Spring Boot와 같은 프레임워크에서는 JPA (Java Persistence API) 를 사용해서 엔티티를 정의하고, 관리한다. JPA는 자바 객체와 데이터베이스 간의 매핑을 쉽게 해주는 ORM (Object-Relational Mapping) 기술을 제공하고, 이를 통해 개발자는 데이터베이스와의 직접적인 상호작용을 추상화해서 객체지향적으로 데이터베이스를 다룰 수 있다. 

 

▶ 엔티티의 설계 방법 

엔티티는 데이터베이스 테이블과 매핑될 클래스로, 다음과 같은 요소들을 포함해서 설계한다. 

클래스와 필드 :

엔티티 클래스는 데이터베이스 테이블에 매핑되고, 클래스의 각 필드는 테이블의 열(column)에 매핑된다.

어노테이션 :

@Entity, @Table, @Id, @Column과 같은 JPA 어노테이션을 사용해서 엔티티 클래스를 설정하고, 데이터베이스와의 매핑 정보를 제공한다.

Primary Key (식별자) :

@Id 어노테이션을 사용하여 기본 키(Primary Key)를 설정하고, 데이터베이스에서 각 행(row)을 고유하게 식별할 수 있게 한다.

관계 설정 :

엔티티 간의 관계를 설정하기 위해 @OneToMany, @ManyToOne, @OneToOne, @ManyToMany와 같은 어노테이션을 사용한다. 이를 통해 데이터베이스 테이블 간의 관계를 객체 지향적으로 모델링할 수 있다.

 

▶ 엔티티의 장점 

 

데이터베이스와의 매핑을 자동화 :

엔티티는 데이터베이스 테이블과 자바 객체 간의 매핑을 자동화하여 데이터베이스와의 상호작용을 단순화한다.

유지보수성 향상 :

SQL을 직접 작성하지 않고 객체 지향 프로그래밍 방식으로 데이터베이스 작업을 할 수 있기 떄문에 코드의 가독성과 유지보수성이 높아진다.

비즈니스 로직과 데이터 접근의 분리 :

엔티티는 비즈니스 로직에서 데이터 접근을 분리해서, 코드를 더 구조적이고 일관성 있게 유지할 수 있다.

데이터베이스 독립성 :

: JPA를 사용하면 특정 데이터베이스에 종속되지 않고, 다양한 데이터베이스로 쉽게 변경할 수 있는 이점이 있다.

 

▶ 엔티티 사용 예시 

과제 1에서 사용했던 Memo 엔티티를 예시로 들었다. Memo엔티티는 메모 데이터를 저장하고 관리하는데 사용된다. 

package com.sparta.memo.entity;

import jakarta.persistence.*;
        import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
@NoArgsConstructor
@Entity  // 엔티티 클래스임을 명시
@Table(name = "memos")  // 테이블 이름 매핑
public class Memo {

    @Id  // 기본 키 매핑
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 기본 키 생성을 데이터베이스에 위임
    private Long id;

    @Column(nullable = false)  // not null 제약조건 설정
    private String username;

    @Column(nullable = false)
    private String contents;

    @Column(updatable = false)
    private LocalDateTime createdAt;

    @Column
    private LocalDateTime modifiedAt;

    // 생성자
    public Memo(String username, String contents) {
        this.username = username;
        this.contents = contents;
        this.createdAt = LocalDateTime.now();
        this.modifiedAt = LocalDateTime.now();
    }

    // 메모 내용 수정 메서드
    public void updateContents(String contents) {
        this.contents = contents;
        this.modifiedAt = LocalDateTime.now();
    }
}

→ 지금 예시 엔티티는 memos 테이블과 매핑된 엔티티로, 각 필드는 테이블의 열에 해당하고 데이터베이스의 제약조건을 어노테이션으로 명확하게 한다. 

@Column(nullable = false) → 해당 필드가 NOT NULL이어야 함을 나타낸다. 

@Id, @GeneratedValue → 엔티티의 기본 키를 설정하고, 데이터베이스에서 자동으로 키 값을 생성하도록 한다. 

→ 생성자를 통해 username과 contents를 초기화하고, createdAt과 modifiedAt 필드도 함께 설정한다.

→  updateContents() 메서드를 통해 메모 내용을 수정할 수 있고, 수정할 때마다 modifiedAt 필드를 현재 시간으로 업데이트한다. 

 

▶ 정리 

엔티티를 사용해서 데이터베이스와의 상호작용을 간소화하고, 객체 지향적인 데이터 모델링을 적용한다. 엔티티는 데이터베이스와의 직접적인 매핑을 제공하고, 개발자가 비즈니스 로직에 집중할수있게 해주며 유지보수성과 확장성을 크게 향상시킨다. 엔티티를 설계할 때 도메인 모델을 명확히 표현해야하고, 데이터베이스와의 효율적인 연동을 고려하는 방향으로 개발을 진행해야 한다! 

 

🤓오늘의 회고 

과제를 진행하면서 여러 역할을 하는 계층 클래스들을 만들고 있으면서도, 어떤 역할을 제대로 하는지 모른다는건 정말 말도 안되는 일인것 같다. 코드리뷰를 받으면서 @Setter 를 쓰면 안되는 이유에 대해서 알아보라고 하셨었는데, 그 어노테이션을 삭제하면서도 왜그런지는 아직 명확한 이유를 알지못해서 내일은 그걸 공부하고 개발일지를 써야겠다. 요즘 개발일지를 쓰는게 재밌어졌는데.. 과제랑 강의만하다보니 이게 그나마 딴짓같아서 그러는건지 매일 잊지않고 쓰고있다. 나중에도 이 일지들은 나에게 아주 좋은 자료가 되주길 바라면서 다시 공부하러 가자!