Spring Boot : Entity, Repository에 대하여
Entity
- 데이터베이스에 쓰일 필드와 여러 엔티티간 연관관계를 정의한다.
- 데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데 이 테이블에 서비스에서 필요한 정보를 다 저장하고 활용하게 된다.
- 아래 그림과 같이 세로의 열 부분이 Column이고 가로의 행 부분이 엔티티 객체가 된다.
- 이 테이블 전체가 엔티티 이고, 각 1개의 행들이 엔티티 객체가 되는 것이라고 생각하면 된다.
- 필드라는 것은 엔티티의 각 Column을 의미한다.
- 아래 예시에서
private Long bno
라고 적은 것 처럼bno
라는 필드를 정의하면 하나의 Column을 정의할 수 있는 것이다. - @로 시작되는 구문은 어노테이션이라고 부르는데 대부분은 엔티티와 데이터베이스를 매핑하는 JPA에서 사용되는 것이다.
@어노테이션
-
대략적인 어노테이션의 개념만 알도록 하고 일단 따라하면서 만들고 속성, 옵션이나 주의사항은 나중에 익히는 것이 좋다. 천재가 아니기에 너무 많은 정보를 한 번에 이해할 수 없기 때문이다.
- @Entity
- 클래스 위에 선언하여 이 클래스가 엔티티임을 알려준다. 이렇게 되면 JPA에서 정의된 필드들을 바탕으로 데이터베이스에 테이블을 만들어준다.
- @Builder
- 해당 클래스에서 해당하는 엔티티 객체를 만들 때 빌더 패턴을 이용해서 만들 수 있도록 지정해주는 어노테이션이다.
이렇게 선언해놓으면 나중에 다른 곳에서
Boaed.builder().{여러가지 필드의 초기값 선언}.build()
형태로 객체를 만들 수 있다.
- 해당 클래스에서 해당하는 엔티티 객체를 만들 때 빌더 패턴을 이용해서 만들 수 있도록 지정해주는 어노테이션이다.
이렇게 선언해놓으면 나중에 다른 곳에서
- @AllArgsConstructor
- 선언된 모든 필드를 파라미터로 갖는 생성자를 자동으로 만들어준다.
- @NoArgsConstructor
- 파라미터가 아예없는 기본생성자를 자동으로 만들어준다.
- @Getter
- 각 필드값을 조회할 수 있는 getter를 자동으로 생성해준다.예를들어 다른 파일에서
Board
객체의title
값을 얻고 싶다면gettitle()
메서드를 정의해서 해당 객체의title
값을 얻어오게 되는데 해당 메서드를 굳이 작성하지 않아도 자동으로 생성해주는 것이다.
- 각 필드값을 조회할 수 있는 getter를 자동으로 생성해준다.예를들어 다른 파일에서
변수는 보통 직접 접근 및 변경이 안되도록 private
선언자를 통해 지정한다. title
이라는 변수를 조회하기 위해서 gettitle()
이라는 메서드를 선언하고 title
을 리턴하도록 해준다. 이 메서드를 getter
라고 부른다.
private String title
public String getTitle() { return title }
- @ToString
- 해당 클래스에 선언된 필드들을 모두 출력할 수 있는
toString
메서드를 자동으로 생성할 수 있도록 해준다.
- 해당 클래스에 선언된 필드들을 모두 출력할 수 있는
- @Id,@GeneratedValue
- 해당 엔티티의 주요 키(Primary Key, PK)가 될 값을 지정해주는 것이
@Id
이다.@GeneratedValue
는 이 PK가 자동으로 1씩 증가하는 형태로 생성될지 등을 결정해주는 어노테이션이다.
- 해당 엔티티의 주요 키(Primary Key, PK)가 될 값을 지정해주는 것이
- @ManyToOne
- 해당 엔티티와 다른 엔티티를 관계짓고 싶을 때 쓰는 어노테이션이다.
ManyToOne
이라고 부르는 이유는 Writer입장에서 Board는 여러 개가 될 수 있기 때문에Writer : Board = 1: N
관계가 되기 때문이다.
- 해당 엔티티와 다른 엔티티를 관계짓고 싶을 때 쓰는 어노테이션이다.
Respository
- Entity에 의해 생성된 DB에 접근하는 메서드들을 사용하기 위한 인터페이스이다.
- 위에서 엔티티를 선언함으로써 데이터베이스 구조를 만들었다면 여기에 어떤 값을 넣거나 넣어진 값을 조회하는 등의
CRUD(Create, Read, Update, Delete)
를 해야 쓸모가 있는데 이것을 어떻게 할 것인지 정의해주는 계층이라고 생각하면 된다. JPARepository
를 상속받도록 함으로써 기본적인 동작이 모두 가능해진다.- JPARepository는 어떤 엔티티를 메서드의 대상으로 할지를 다음 키워드로 지정한다.
JPARepository<대상으로 지정할 엔티티, 해당 엔티티의 PK타입>
이렇게 extends를 통해서 상속받고 나면 해당 레포지토리의 객체를 이용해서 기본적으로 제공되는 메서드 save(), findAll(), get()
등을 사용할 수 있게 된다.
Leave a comment