CH3 스프링 부트에서 JPA로 데이터 베이스 다루기 (2-1)

동현·2021년 1월 13일
0

CH3 스프링 부트에서 JPA로 데이터 베이스 다루기

예전에 노드 js 를 공부 했을때도 느끼는건데 백엔드를 할때 데이터베이스가 중요 한것 같다 스프링부트를 할때도 바로 데이터 베이스 다루는것이 나오는걸 보고 처음 노드 js 를 했을때보다는 무엇을 왜 구현하는지 생각하면서 배우니까 재밌다.


JPA 란?

  • 간단하게 말하면 서로 다른 지향하는 바를 가진 2개의 영역을 중간에서 조율해주는 기술이라고 볼수있다.
    -> 자바 개발자는 객체지향적이다
    -> SQL 은 관계형 데이터 베이스다
    -> 이를 JPA가 조율을해 SQL 을 대신 생성하고 실행을 한다.
    -> SQL 에 종속적인 프로그래밍을 하지 않아도 된다.

앞으로 구현할 부분

  • 게시판 기능
    • 게시글 조회
    • 게시글 등록
    • 게시글 수정
    • 게시글 삭제
  • 회원 기능
    • 구글 / 네이버 로그인
    • 로그인한 사용자 글 작성 권한
    • 본인 작성 글에 대한 권한 관리

프로젝트에 Spring Date Jpa 적용하기

Domain 패키지

  • 게시글, 댓글, 회원, 정산, 결제 등의 소프트웨어에 대한 요구사항 or 문제에 대한 영역이다.

Posts 패키지와 Posts 클래스

posts 패키지

post 클래스는 실제 DB의 테이블과 매칭 될 클래스

  • Getter 와 NoArgsConstructor 는 getter 와 파라미터가 없는 기본 생성자를 생성하게 도와준다.
  • Entity 는 JPA의 어노테이션이다 Entity 가 붙은 클래스를 JPA 가 관리 하게 된다.
  • ID = 해당 테이블의 PK 필드를 나타낸다.
  • Column = 테이블의 칼럼을 나타내며 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 된다.
  • Builder 해당 클래스의 빌더 패턴 클래스를 생성
  • 총 Id 와 title, content, author 를 가지는 테이블이 만들어 진다.

이 테이블에는 Getter 는 있지만 Setter 는 없다 그이유는 클래스의 인스턴스 값들이 언제 어디서 변하는지 명확하게 구분 할수 없어 그렇다. Entity 클래스에서는 절대 Setter 를 만들지 않는다.

=> 그렇다면 어떻게 DB에 삽입을 하냐?

  • 생성자를 통해 최종 값을 채우고 삽입/ 변경시에는 이벤트에 맞는 메서드를 이용해 변경
  • 위 코드에서는 Builder 를 사용해 생성 시점에 값을 채워준다.

postsRepostitory

  • 이 코드에서 봐야 할 부분은 extends JpaRepostory<Posts, Long> 이다. Posts 와 Long 은 각각 Entity 클래스 , PK 타입이며 이 코드를 상속함으로 기본적인 CRUD 메소드가 자동 생성 된다.

Entity 클래스와 Entity Repository 의 위치는 항상 같아야 한다.


Spring Data JPA 테스트 코드 작성하기

save, findAll test

  • 이 부분은 책과 버젼이 달라 수정해야 할 부분이 있다.
  • @AfterEach = 단위테스트가 끝날때마다 실행하는 메서드 지정
    보통 테스트를 만들때 하나의 테스트만 하는게 아니므로 변수의 값이 충돌이 일어날수 있다 이를 방지 하기 위해 cleanup 이라는 메서드를 지정해 두었다.
  • postsRepository.save => posts에 insert/update를 실행
    (id 값이 있다면 update 없으면 insert)
  • postsRepository.findAll() 모든 데이터를 조회
  • 위 코드는 간단하게 title, content, author 를 저장하고 get으로 불러와 비교를 하여 테스트하는 코드이다.

등록/수정/조회 API 만들기

  • Request 테이터를 받을 Dto
  • Api 요청을 받을 Controller
  • 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service
    (즉 기능 자체는 도메인에 저장 되어있고 이제 그 기능을 어떻게 사용할 것인지)

스프링 웹 계층

  • Web Layer

    • 컨트롤러와 뷰템플릿 영역 (외부 요청과 응답의 전반적 영역)
  • Service Layer

    • @Service 에 사용되는 서비스 영역 (Controller 와 Dao 의 중간 영역)
  • Repository Layer

    • Database와 같이 데이터 저장소에 접근 하는 영역
  • Dtos

    • Dto 는 계층 간에 데이터 교환을 위한 객체 Dtos 는 이들의 영역
  • Domain Model

    • 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것

PostsApiController

  • /api/v1/posts 로 요청이들어올 경우 아래 메소드를 실행한다는 코드이다
  • 이때 @RequestBody 는 post로 요청이 들어올때 Http 요청의 Body내용을 Java Object로 변환시켜주는 역할을 한다 이후 return 을 통해 service 의 save를 호출하게 된다.

PostsService

  • ApiController 에서 리턴 받은 PostsService.save 이번에는 PostsRepository의 save를 호출한다. ( 위에서 설명한 서비스 패키지가 직접 기능을 행하는 부분은 아니라는것을 증명한다. )

PostsSaveRequestDto

  • Controller 와 Service 에서 파라미터로 사용하는 Dto
profile
여긴 어디 나는 누구?

0개의 댓글