[spring 토이프로젝트] REST API CRUD 구현하기-1. 프로젝트 생성, Model, Repository

이건회·2022년 8월 13일
2

springRestApi

목록 보기
1/2
post-thumbnail

레퍼런스 : https://covenant.tistory.com/243

개발 환경

IDEA: IntelliJ
Java:11
Spring Boot 2.7.2
Build tool : Gradle
Db : mysql+jpa

프로젝트 주제 :

도서 예약 시스템 API 개발

프로젝트 API URI 설계

ㅤㅤㅤ URI, HTTP 메서드, 설명
ㅤ /api/library/book, GET, 도서 전체 조회
ㅤ /api/library/book?isbn={isbn}, GET, 도서 ISBN으로 도서 조회
ㅤ /api/library/book/:id, GET, 도서ID로 도서 조회
ㅤ /api/library/book, POST, 도서 등록
ㅤ /api/library/book/:id, DELETE, 도서 삭제
ㅤ /api/library/book/lend, POST, 도서 대출
ㅤ /api/library/member, POST, 회원 등록
ㅤ /api/library/member/:id, PATCH, 회원 수정

0. 데이터베이스 생성:

이전 프로젝트와 동일하게 생성했으므로 생략(참고 : https://velog.io/@rg970604/spring-%ED%86%A0%EC%9D%B4%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B2%8C%EC%8B%9C%ED%8C%90-crud-%EA%B2%80%EC%83%89-%ED%8E%98%EC%9D%B4%EC%A7%95-%EA%B5%AC%ED%98%84-1.-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1-%EB%B0%8F-%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95)

  1. Model Class 생성하기
    1-1. Author 모델
  • Id, 성, 이름 필드를 갖는 Author 모델이다.
  • @Entity를 통해 JPA가 이 클래스를 관리하도록 등록, @Table을 통해 실제 db에 저장될 테이블명을 지정한다.
  • id 값을 기본키로 설정하며, @GeneratedValue 어노테이션을 통해 기본키가 되는 id값을 자동으로 생성시킬 수 있다. 기본 키 생성 전략을 identity로 설정하면 기본 키 생성 방식을 데이터베이스에 위임한다.(entityManager.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회, 참고 : )
    https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html)
  • 궁금한 점은 Strategy를 Auto로 지정하면 어차피 방언에 따라서 적합한 전략을 지정할텐데 굳이 하나를 지정할 필요가 있나?



1-2. Book, Member 모델

  • 마찬가지로 Book 모델과 Member 모델을 만든다.
  • @Enumerated를 사용하면 자바 enum 타입을 엔티티 클래스의 속성으로 사용할 수 있다.
  • 멤버 모델은 멤버의 상태를 나타내는 enum 필드를 갖는다. EnumType 설정을 통해 db에 순서 값을 저장할지, 속성 이름을 저장할지 지정할 수 있다.(참고 : https://lng1982.tistory.com/280, https://limkydev.tistory.com/50)
  • enum 필드는 활성,비활성 회원으로 구분한다.

1-3. Lend 모델

  • 대출시작, 대출종료, 대출상태 필드를 갖는다.
  • 대출상태는 역시 Enum 타입으로 정의하며, Ordinal 타입으로 설정하여 순서를 저장한다.
  • Instant 클래스는 시간을 타임스탬프로 다루는 클래스다.(참고 : https://www.daleseo.com/java8-instant/)
  • 대출상태 상수를 enum으로 정의해준다.

2. 모델 간의 관계 정의

2-1. Author와 Book의 관계


2-2. Book과 Lend의 관계

  • 하나의 책을 여러명이 대출하는 상황을 가정하여 책(1)<->대출(n)의 관계로 정의하였다. 방법은 위와 같다.

2-3. Member와 Lend의 관계

  • 한 명의 회원이 여러 책을 대출한다고 가정하여 회원(1)<->대출(n)의 관계로 정의하였다. 방법 역시 위와 같다.

3. Repository 구현

3-1. AuthorRepository

  • JpaRepository 인터페이스의 메소드를 활용하면 적절한 sql crud 쿼리를 jpa가 대신 생성해준다. crud 뿐이 아니라 paging과 sorting까지도 가능하다.
  • JPaRepository를 상속받을 때는 사용할 엔티티 클래스와 id 타입을 반드시 명시한다.
    (참고 : https://jobc.tistory.com/120)

3-2. BookRepository

  • Optional 클래스를 활용해 널 값에 대해서는 NPE처리를 한다. (그러나 예외처리 코드를 따로 작성할 필요는 있을 듯 하다...)
  • 메소드 명을 findByIsbn으로 지정하면 자동적으로 ("select * from Book where isbn={xxxx} " 과 같다.) 이는 "JPA 메소드 명명규칙" 에 따른 것이다.(참고 : https://zara49.tistory.com/130)

3-3. LendRepository

3-4. MemberRepository

  • 마찬가지로 Lend와 Member Repository로 만들어 준다.
profile
하마드

0개의 댓글