밤빵's 개발일지
[TIL]20240712 Entity 본문
과제를 진행하면서 엔티티를 만들어 사용하면서도 gpt에 의존하다보니 그 역할에 대해서는 명확히 알 지 못해서, 물음표를 잔뜩 가지고 있었다. 예전에 주특기주차 갓 시작하고 기술매니저님께서 강의를 해주신적이있었는데 그땐 스프링을 듣기 시작하지도 못해서 하나도 못 알아들었다...! 그래서 지금이라도 개념을 정리하기로 했다.
과제에서 엔티티를 사용하여 데이터베이스와의 상호작용을 관리했다. 엔티티는 애플리케이션의 데이터 모델링에서 중요한 역할을 하고, 데이터베이스 테이블과 매핑되어 데이터를 영구적으로 저장하고 조작하는 데 사용된다. 오늘은 엔티티의 개념과 설계방법 그리고 실제 과제에서 사용했던 엔티티 예시를 통해서 엔티티의 중요성과 역할을 정리해보았다!
▶ 엔티티(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 를 쓰면 안되는 이유에 대해서 알아보라고 하셨었는데, 그 어노테이션을 삭제하면서도 왜그런지는 아직 명확한 이유를 알지못해서 내일은 그걸 공부하고 개발일지를 써야겠다. 요즘 개발일지를 쓰는게 재밌어졌는데.. 과제랑 강의만하다보니 이게 그나마 딴짓같아서 그러는건지 매일 잊지않고 쓰고있다. 나중에도 이 일지들은 나에게 아주 좋은 자료가 되주길 바라면서 다시 공부하러 가자!
'개발Article' 카테고리의 다른 글
[WIL]20240714 (0) | 2024.07.14 |
---|---|
[TIL]20240713 Entity에 @Setter어노테이션을 사용하지 않는 이유? (0) | 2024.07.14 |
[TIL]20240711 Dto 사용의 중요성 (0) | 2024.07.12 |
[TIL]20240710 Controller를 이해해보자! (0) | 2024.07.12 |
[TIL]20240709 DispatcherServlet..? (0) | 2024.07.11 |