일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- HashSet
- html tag
- HTML
- 파이썬
- 깃허브
- @builder
- 캡슐화
- entity
- 에러
- 자바
- 알고리즘
- java
- @AllArgsConstructor
- 부스트코스
- 코드업
- DTO
- @NoArgsConstructor
- github
- 프로그래머스
- Python
- lv1
- 기본생성자
- 브랜치
- git
- 상속
- 부트캠프
- stringbuffer
- Codeup
- CRUD
- SQL
- Today
- Total
잉?
[SpringBoot] Entity란? + @Table, @NoArgsConstructor, @AllArgsConstructor 본문
[SpringBoot] Entity란? + @Table, @NoArgsConstructor, @AllArgsConstructor
Jye_647 2023. 7. 10. 21:39💡 Entity란 무엇이며, 엔티티 클래스 안에서 사용하는 어노테이션에 대해 살펴보자.
Entity(엔티티)란?
데이터베이스에서 영속적으로 저장되고 관리되는 객체를 가리킨다.
엔티티는 데이터베이스 테이블의 레코드(행)에 해당하고, 객체 지향 프로그래밍에서는 해당 데이터를 표현하는 클래스로 구현된다.
엔티티는 영속성을 가지고, 이는 객체의 상태가 데이터베이스에 저장되고 관리되는 것을 의미한다.
- 영속성(Persistence): 엔터티는 영속적이라는 특성을 가지고 있다. 이는 객체의 상태가 프로그램 실행이 종료되더라도 계속해서 유지되며, 필요할 때 데이터베이스에 저장되고 관리된다는 것을 의미한다.
- 데이터베이스 테이블과 매핑: 엔터티 클래스는 데이터베이스의 테이블과 매우 유사한 구조를 가지며, 클래스의 인스턴스는 데이터베이스 테이블의 레코드에 대응된다.
- JPA(Java Persistence API): 자바에서는 JPA(Java Persistence API)가 엔터티를 관리하는 데 사용된다. JPA는 자바에서 객체-관계 매핑을 위한 API로, 엔터티 클래스와 데이터베이스 간의 매핑 및 영속성을 제어할 수 있는 기능을 제공한다.
- CRUD 작업: 엔터티를 통해 데이터베이스에서의 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있다. 이는 객체 지향 프로그래밍에서는 메서드 호출을 통해, 데이터베이스에서는 SQL 쿼리를 통해 이루어진다.
@Entity
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "post_comment")
public class PostCommentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String comment;
}
@Id
해당 컬럼을 PK로 설정
@Column
칼럼으로 인식하고, 괄호 안에 조건을 걸어줄 수 있다.
@Table(name = “테이블”)
테이블과 연결시켜 주기 위해 사용한다. 엔티티 이름과 테이블 이름이 같다면 자동으로 매칭이 되지만, 만약 다르다면 매칭이 되지 않기 때문에 @Table 어노테이션을 통해 엔티티와 테이블을 매칭시켜 준다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
기본 생성자를 만들어준다. java의 ORM 기술인 JPA 구현체들은 자동으로 기본 생성자를 생성해 준다. 또한 @Entity 어노테이션은 내부적으로 기본 생성자를 만들어준다. 그렇다면 위의 @NoArgsConstructor어노테이션을 왜 붙여줬냐 하면, 괄호 안의 접근 제한 때문이다. 기본생성자를 추가하되, 안전성을 높이기 위해 추가해 준다.
@AllArgsConstructor
빌더는 해당 클래스에 생성자가 없다면, 만들어주고 생성자가 있다면 사용한다. @NoArgsConstructor 어노테이션이 붙으면 생성자가 있다 판단해서 빌더에 생성자를 만들지 않고 이미 있는 생성자에 접근하려 한다.
하지만 기존의 @NoArgsConstructor는 접근 제한이 되어있기에 생성자를 만들지 못하고 에러가 발생한다.
그렇다면 애초에 이 전체 필드에 대한 생성자를 만들면 괜찮지 않을까 싶겠지만, 전체 필드에 대한 생성자가 있다면 기본 생성자를 만들지 않는다.
해당 기본 생성자를 만들지 않는다면 Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)] 와 같은 오류가 발생하기에 기본생성자도 만들어줘야 한다.
'자바(Java) > 스프링부트(SpringBoot)' 카테고리의 다른 글
[SpringBoot] 단위 테스트(Unit Tests)는 뭔데? + 사용 이유 (0) | 2023.07.25 |
---|---|
[SpringBoot] Service단에서의 DTO <--> Entity의 변환. (0) | 2023.07.11 |
[SpringBoot] 빌더 패턴의 “toEntity”와 “of” 메서드 (0) | 2023.07.04 |
[SpringBoot] 빌더 패턴(Builder Pattern)이란? + 사용 이유 (0) | 2023.06.30 |
[SpringBoot] Path Variable과 Request Param의 차이점 (0) | 2023.06.27 |