Simple Library App - Entity

도서관 앱 만들기

image

자바와 스프링을 공부하면서 내가 배운 내용들을 실전에 잘 녹여낼 수 있을지, 그리고 항상 이론만 듣기보단 실제로 어느정도 활용할 수 있을지 체크하는 방법은 배운 내용들을 직접 기능을 구현해 나가면서 배움을 확인할 때 가장 효과적이라고 생각해서 하나의 간단한 프로젝트를 진행해보면서 체크하기로 했다. 사실 백엔드 개발자라면 CRUD(JSON 상하차)만 잘해도 반은 먹고 들어간다고 생각하는 입장이다. 글의 주된 목적은 배움을 확인하는 것이고, 모호했던 어노테이션에 대한 부분들에 대해서 정리하고 넘어가려는 목적이 크다.

앤티티 설계

image

@GeneratedValue(strategy = GenerationType.IDENTITY) 이게뭐고? @Id 이게뭔지?

@Id@GeneratedValue(strategy = GenerationType.IDENTITY)는 JPA에서 엔티티의 기본 키(Primary Key)를 정의하고 그 생성 방식을 지정하는 어노테이션이다.

@Id

해당 필드가 엔티티의 기본 키(Primary Key)임을 명시한다. 엔티티 클래스에서 기본 키를 나타내는 필드에 이 어노테이션을 붙이고 기본 키는 데이터베이스에서 각 레코드를 고유하게 식별하는 필드로 사용된다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

기본 키 값이 데이터베이스에 의해 자동으로 생성되도록 지정한다. 새로운 레코드가 추가될 때마다 데이터베이스가 알아서 고유한 기본 키 값을 생성합니다. 상황으로 쉽게 생각을 해보면 우선 하나의 도서를 추가하는 시나리오가 있다고 생각하자. 도서관 앱에서 각 도서(Book)를 데이터베이스에 저장할 때, 각 도서에는 고유한 식별자(즉, 기본 키)가 필요하다. 이 기본 키는 도서를 고유하게 식별하기 위해 사용된다.

  • 사용자(클라이언트)가 도서를 추가할 때, 코드에서 bookRepository.save(newBook)와 같은 메서드를 호출한다.
  • 이 메서드가 호출되면, JPA는 INSERT INTO book (...) VALUES (...) SQL 쿼리를 데이터베이스에 보내게 된다.
  • 데이터베이스는 자동으로 기본 키 id를 생성한다. 예를 들어, 첫 번째 도서가 추가되면 id는 1로 설정됩니다.
  • 다음 예시로 “helloMyBook”를 추가하면 데이터베이스는 기본 키 id를 2로 설정한다.

Setter를 최대한 지양하자

image

코드를 확인해보면 엔티티 클래스에 생성자가 존재하고, getter를 통한 접근밖에는 허용하지 않았다. 정말 아래쪽에서도 setter를 숨겨두지 않았다. set을 통해서 접근해서 편하게 데이터를 변경하거나 수정도 편리한데 왜 Setter를 지양하게 되었을까? 그리고 왜 Setter대신에 생성자 패턴이 자리를 하게 되었을까? 나는 다음과 같은 두가지 이유를 중점으로 Setter대신 생성자 패턴을 사용하게 되었다. 비즈니스 로직에선 생성자 패턴이 어떻게 활용이 될까?

상태의 일관성 보장

생성자를 사용하면 필수 필드를 반드시 초기화하게 할 수 있어 객체 생성 시 유효성을 보장할 수 있다. Setter를 사용하면 나중에 필드를 추가할 수 있기 때문에, 객체가 완전히 초기화되기 전까지 사용할 수 있는 상태가 발생할 수 있다.

캡슐화

객체의 속성을 외부에서 직접 변경하지 못하도록 하여, 객체의 내부 상태를 보호한다. 그리고 한가지 디테일은 사용자 정의 생성자가 있으면 기본 생성자는 제공되지 않으므로, 필요한 경우 명시적으로 추가해야 한다. 암묵적으로 제공받을 수가 없다.

Reference

나의 뇌

https://docs.spring.io/spring-framework/reference/data-access/orm.html



© 2022. by taewoo

Powered by taewoo