개인적인 정리와 기록을 위한 글이다. 혹시라도 참고해주시는 분들께서는 정확하지 않은 내용이 있을 수 있으니 유의해주시길 바란다.
자바 진영의 백엔드 개발을 아무런 지식없이 시작하게 되었다. 현업에서 몸으로 부딪히며 정신없이 배우는 단계이다. 한편으론 초보자의 입장에서 쓰는 글이기 때문에 이해가 쉽고 공감이 되지 않을까 생각된다.
Spring Boot, Spring Data JPA, Maven, lombok을 활용하여 서버 사이드의 서비스를 만드는 과정 중에 배운 기본 개념이다. 사용한 IDE는 intelliJ 이다.
1. Entity(엔티티)
데이터베이스(Database, DB) 에 쓰일 필드와 여러 엔티티간 연관관계를 정의한다. 데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데, 이 테이블에 서비스에서 필요한 정보를 다 저장하고 활용하게 된다.
아래 그림과 같이 세로의 열 부분이 Column 이고, 가로의 행 부분이 엔티티 객체가 된다. 이 테이블 전체가 엔티티 이고, 각 1개의 행들이 엔티티 객체가 되는 것이라고 생각하면 된다. 이것을 스프링, JPA의 코드로 표현해보자.
필드라는 것은 엔티티의 각 Column을 의미한다. 아래 예시에서 "private Long bno"라고 적은 것처럼 bno라는 필드를 정의하면 하나의 Column을 정의할 수 있는 것이다. @로 시작되는 구문은 어노테이션 이라고 부르는데, 대부분은 엔티티와 데이터베이스를 매핑하는 JPA에서 사용되는 것이다. 여기서는 간단히 의미와 개념만 파악하고 상세한 사용법 및 주의 사항은 다음에 따로 다루자.
@ 어노테이션
대략적인 어노테이션의 개념만 알도록 하고, 일단 따라하면서 만들고 속성, 옵션이나 주의사항은 나중에 익히는 것이 좋다. 너무 많은 정보를 한 번에 이해할 수 없기 때문이다.
@Entity : 클래스 위에 선언하여 이 클래스가 엔티티임을 알려준다. 이렇게 되면 JPA에서 정의된 필드들을 바탕으로 데이터베이스에 테이블을 만들어준다.
@Builder : 해당 클래스에 해당하는 엔티티 객체를 만들 때 빌더 패턴을 이용해서 만들 수 있도록 지정해주는 어노테이션이다. 이렇게 선언해놓으면 나중에 다른 곳에서 Board.builder(). {여러가지 필드의 초기값 선언 }. build() 형태로 객체를 만들 수 있다.
@AllArgsConstructor : 선언된 모든 필드를 파라미터로 갖는 생성자를 자동으로 만들어준다.
@NoArgsConstructor : 파라미터가 아예없는 기본생성자를 자동으로 만들어준다.
@Getter : 각 필드값을 조회할 수 있는 getter를 자동으로 생성해준다. 예를들어 다른 파일에서 Board 객체의 title값을 얻고 싶다면 getTitle() 메서드를 정의해서 해당 객체의 title값을 얻어오게 되는데, 해당 메서드를 굳이 작성하지 않아도 자동으로 생성해주는 것이다.
변수는 보통 직접 접근 및 변경이 안되도록 private 선언자를 통해 지정한다. title 이라는 변수를 조회하기 위해서 getTitle() 이라는 메서드를 선언하고, title을 리턴하도록 해준다. 이 메서드를 getter라고 부른다.
1
2
3
|
private String title
public String getTitle() { return title }
|
cs |
@ToString : 해당 클래스에 선언된 필드들을 모두 출력할 수 있는 toString 메서드를 자동으로 생성할 수 있도록 해준다.
@Id, @GeneratedValue : 해당 엔티티의 주요 키(Primary Key, PK)가 될 값을 지정해주는 것이 @Id 이다. @GeneratedValue는 이 PK가 자동으로 1씩 증가하는 형태로 생성될지 등을 결정해주는 어노테이션이다.
@ManyToOne : 해당 엔티티와 다른 엔티티를 관계짓고 싶을 때 쓰는 어노테이션이다. ManyToOne이라고 부르는 이유는 Writer 입장에서 Board는 여러 개가 될 수 있기 때문에 Writer : Board = 1 : N 관계가 되기 때문이다.
2. Repository
-Entity에 의해 생성된 DB에 접근하는 메서드(ex) findAll()) 들을 사용하기 위한 인터페이스이다. 위에서 엔티티를 선언함으로써 데이터베이스 구조를 만들었다면, 여기에 어떤 값을 넣거나, 넣어진 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)를 해야 쓸모가 있는데, 이것을 어떻게 할 것인지 정의해주는 계층이라고 생각하면 된다.
JpaRepository를 상속받도록 함으로써 기본적인 동작이 모두 가능해진다! JpaRepository는 어떤 엔티티를 메서드의 대상으로 할지를 다음 키워드로 지정한다. JpaRepository<대상으로 지정할 엔티티, 해당 엔티티의 PK의 타입>.
이렇게 extends를 통해서 상속받고나면, 해당 레포지토리의 객체를 이용해서 기본적으로 제공되는 메서드(save(), findAll(), get()) 등을 사용할 수 있게 된다.
참고
1. [서적] 코드로 배우는 스프링부트 웹 프로젝트 - 구멍가게 코딩단
2. 오라클 홈페이지 문서 : 엔티티 객체
https://docs.oracle.com/ko/solutions/sales-cloud-with-soap-from-java-cloud-app/model-database-data-adf-business-components-overview.html#GUID-A5BA79F5-003F-4610-AB4F-978CBA3EB390
'Programming-[Backend] > SpringBoot' 카테고리의 다른 글
[TIL] @JsonFormat으로 @DateTimeFormat 대신 Date까지만 받기 (0) | 2021.06.16 |
---|---|
[TIL] @SuperBuilder 사용법 (0) | 2021.06.07 |
[TIL] [패턴] 회원 활성화/비활성화, 수정 비즈니스 로직 구현 (0) | 2021.05.30 |
[TIL] [에러] 파라미터 (Parameter Object) 값 null 문제 (0) | 2021.05.17 |
[TIL] @RequestBody, http의 파라미터를 Body로 넘기기(feat. 컨트롤러 테스트), MockMvc, Gson (0) | 2021.05.13 |