[Project] JPA를 이용한 Entity 구성

Yumya's record·2024년 7월 29일
0

[회고] Auction Project

목록 보기
1/7
post-thumbnail

🍀 새로운 프로젝트를 시작하려고 한다.
이전에 프로젝트를 진행했을 때 아쉬웠던 점을 채우고, 공부해야할 것을 정리해 남기려고 한다.

커뮤니티 기능을 하는 프로젝트의 Rest Api를 구현하기 위해서 해야할 것을 나누어 보았다.

  1. 엔티티 구성 및 관계 설정
  2. 기능 구현
  3. 테스트 코드 작성
  4. 기능 테스트

일단, 엔티티를 구성하기 위해서 JPA를 사용하였다.


✏️ JPA

  • Java Persistence API
  • 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스 모음
  • 구현된 클래스와 매핑하기 위해 사용되는 프레임 워크 ex) Hibernate
  • 객체를 자동 매핑하고, 개발자 대신 SQL문을 작성해 DB에 전달한다.

출처 [Spring]Spring JPA 란?


1. PK(Primary Key)

@Id //id 필드를 기본 키로 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto Increment
@Column(name = "id", nullable = false) // null 불가, 설정하지 않으면 true
private Long id;

//Auto Increment는 정수, 실수인 컬럼에만 사용 가능

2. FK(Foreign Key)

@ManyToOne // 다대일 관계
@JoinColumn(name = "user_id") // 조인하는 컬럼 명
private User user; // fk 객체

3. 그 외 컬럼

@Column(name = "title", nullable = false, length = 100) // 길이 100으로 지정
private String title;

@CreationTimestamp // 생성 시 자동으로 날짜-시간 저장
@Column(name = "create_date", nullable = false)
private LocalDateTime create_date; 

@UpdateTimestamp // 업데이트 시 자동으로 날짜-시간 저장
@Column(name = "update_date", nullable = false)
private LocalDateTime update_date;

// @CreationTimestamp, @UpdateTimestamp 사용 시 생성자에서 초기화하지 않아도 자동으로 값이 저장
// LocalDateTime는 Timestamp 타입과 달리 타임존의 영향을 받지 않음 > 안정적인 날짜, 시간 표현 가능
// (1) 날짜와 시간을 분리하여 보관, 연산이 쉽고 간결(편의성)
// (2) JVM 안에서 처리되기 때문에 외부 공격에 영향 X(보안성)

출처 [Java] LocalDate, LocalDateTime을 사용하는 이유


✏️ Builder 패턴

//Builder X
new User("name", 100);

//Builder O
User.builder()
	.name("name")
    .age(100)
    .build();
  • Builder 패턴을 사용하면 객체를 유연하고 직관적으로 생성할 수 있다.
  • 어느 필드에 어떤 값이 들어가는지 명시적으로 파악할 수 있다.
@Builder //빌더 패턴 방식으로 객체 생성
public User(String name, Integer age) {
	this.name = name;
    this.age = age;
}

✏️ JPA를 사용해 엔티티 구성하기

@Entity // 엔티티로 지정
@Getter // 클래스 필드에 별도 코드 없이 모든 필드에 대한 접근자 메서드 생성 가능
@NoArgsConstructor(access = AccessLevel.PROTECTED) //접근 제어자가 protected인 기본 생성자를 별도 코드 없이 생성 
public class User {

	@Id 
	@GeneratedValue(strategy = GenerationType.IDENTITY) 
	@Column(name = "id", nullable = false)
	private Long id;

	@Column(name = "title", nullabe = false)
	private String title;

	@Column(name = "content") // nullable = true
	private String content;

	@CreationTimestamp 
	@Column(name = "create_date", nullable = false)
	private LocalDateTime create_date; 

	@UpdateTimestamp 
	@Column(name = "update_date", nullable = false)
	private LocalDateTime update_date;

	@Builder
	public User(String title, String content) {
    	this.title = title;
        this.content = content;
    }
}

이와 같이 JPA를 이용해 필요한 엔티티를 구성 및 관계 설정을 하면 된다.
이때, DB의 예약어나 명령어, 키워드를 객체 이름으로 사용하게 될 경우 DB에서 이를 구분하지 못하기 때문에 에러가 발생한다.

정리
1. 클래스를 만들고, 애너테이션을 설정한다.
2. 기본 키를 시작으로, 컬럼을 필요에 맞게 구성한다.
3. Builder 패턴을 이용한 생성자를 구현한다.

참고 서적 스프링 부트3 백엔드 개발자 되기

다음으로는 인텔리제이와 MySQL를 연동하고, Spring boot와 JDBC를 연동할 것이다.

profile
🍀 ٩(ˊᗜˋ*)و 🍀

0개의 댓글