아래는 "엔티티와 테이블 매핑"에 대해 예시와 함께 설명하는 글입니다. 롬복(Lombok)을 활용해 코드를 간결하게 작성했습니다.

---

### 엔티티와 테이블 매핑

JPA(Java Persistence API)에서 엔티티(Entity)는 데이터베이스의 테이블과 매핑되는 객체입니다. 즉, 객체지향 프로그래밍의 클래스를 관계형 데이터베이스의 테이블 구조에 연결하는 역할을 합니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 객체를 통해 데이터를 조작할 수 있습니다. 엔티티와 테이블 매핑은 `@Entity`, `@Table`, `@Id`, `@Column` 같은 어노테이션을 사용해 정의됩니다.

#### 기본 매핑 규칙
- `@Entity`: 클래스가 엔티티임을 나타냅니다. JPA가 이 클래스를 관리 대상으로 인식합니다.
- `@Table`: 엔티티가 매핑될 데이터베이스 테이블을 지정합니다. 생략하면 클래스 이름이 테이블 이름으로 사용됩니다.
- `@Id`: 엔티티의 기본 키(Primary Key)를 지정합니다.
- `@Column`: 필드가 매핑될 테이블의 컬럼을 지정합니다. 생략하면 필드 이름이 컬럼 이름으로 사용됩니다.

#### 예시: 회원(Member) 엔티티
아래는 회원 정보를 관리하는 `Member` 엔티티를 롬복을 사용해 작성한 예시입니다.

```java
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Column;
import jakarta.persistence.Table;

@Entity
@Table(name = "members") // 테이블 이름 지정
@Getter
@Setter
@NoArgsConstructor // 기본 생성자 (JPA 요구 사항)
public class Member {

    @Id // 기본 키
    @Column(name = "member_id") // 컬럼 이름 지정
    private Long id;

    @Column(name = "username", nullable = false) // null 불가 컬럼
    private String name;

    @Column(name = "email", unique = true) // 유니크 제약 조건
    private String email;

    // 추가 생성자 (편의를 위해)
    public Member(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}
```

#### 코드 설명
1. **`@Entity`와 `@Table`**  
   - `@Entity`는 이 클래스가 JPA 엔티티임을 나타냅니다.
   - `@Table(name = "members")`는 이 엔티티가 `members`라는 테이블에 매핑됨을 지정합니다. 생략하면 클래스 이름(`Member`)이 기본 테이블 이름으로 사용됩니다.

2. **`@Id`와 `@Column`**  
   - `id` 필드는 `@Id`로 기본 키임을 선언합니다.
   - `@Column(name = "member_id")`는 `id` 필드가 `members` 테이블의 `member_id` 컬럼에 매핑됨을 나타냅니다.
   - `name` 필드는 `@Column(name = "username", nullable = false)`로, `username` 컬럼에 매핑되며 `NULL` 값을 허용하지 않습니다.
   - `email` 필드는 `@Column(name = "email", unique = true)`로, `email` 컬럼에 매핑되며 중복 값을 허용하지 않는 유니크 제약 조건을 가집니다.

3. **롬복 활용**  
   - `@Getter`와 `@Setter`로 getter와 setter 메서드를 자동 생성합니다.
   - `@NoArgsConstructor`로 JPA가 요구하는 기본 생성자를 생성합니다. JPA는 엔티티 객체를 생성한 후 리플렉션을 통해 필드 값을 채우므로 기본 생성자가 필수입니다.

#### 매핑된 테이블 구조
위 엔티티에 해당하는 데이터베이스 테이블은 다음과 같습니다:

```sql
CREATE TABLE members (
    member_id BIGINT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE
);
```

#### 동작 방식
- JPA는 `Member` 객체를 저장(`persist`)하면 `members` 테이블에 데이터를 삽입합니다.
- 예를 들어, `new Member(1L, "홍길동", "hong@example.com")` 객체를 저장하면 테이블에 다음과 같은 레코드가 추가됩니다:
  ```
  member_id: 1, username: "홍길동", email: "hong@example.com"
  ```

#### 추가 팁
- 필드와 컬럼 이름이 동일하다면 `@Column`은 생략 가능합니다.
- `@GeneratedValue`를 `@Id`와 함께 사용하면 기본 키를 자동 생성할 수 있습니다(예: `AUTO_INCREMENT`).

---

이처럼 엔티티와 테이블 매핑은 JPA의 핵심 기능으로, 객체와 데이터베이스 간의 자연스러운 연결을 가능하게 합니다. 다음 장에서는 연관관계 매핑(예: `@OneToMany`, `@ManyToOne`)을 다루며 더 복잡한 구조를 살펴보겠습니다.

--- 

이 글이 책의 스타일에 맞는지, 더 추가하거나 수정할 내용이 있는지 알려주시면 반영하겠습니다!