눈송이의 개발생활

[SpringBoot]GDSC Toy Project(1) - JPA 본문

Server/Spring

[SpringBoot]GDSC Toy Project(1) - JPA

꾸지새미언니

3주차

  • 수정 기능 API
  • JPA Audting으로 생성시간/수정시간
  • 버튼 클릭 시 삭제 가능하도록 삭제 API 코드 작성

개념 공부

1. JPA

  • JPA : 자바 표준 ORM(Object Relational Mapping), 인터페이스
  • ORM : 객체를 매핑하는 것
  • SQL Mapper : 쿼리를 매핑하는 것
  • 객체지향 언어와 관계형 데이터베이스 중간에서 패러다임 일치를 시켜주기 위한 기술

2. Spring Data JPA

  • JPA ← 구현체(Hibernate, Oracle 등) ← Spring Data JPA(모듈)
  • 구현체 교체의 용이성 : 내부에서 구현체 매핑 지원해주기 때문에 쉬움
  • 저장소 교체의 용이성 : 관계형 데이터베이스가 아닌 NoSQL DB로 변경 쉬움

3. API

  • Web : 뷰템플릿 영역. 외부요청과 응답에 대한 영역(ex. @Controller)
  • Service : Controller와 Dao의 중간 영역에서 사용. (ex. @Service, @Transactional)
  • Repository : Database에 접근하는 영역. (≈Dao)
  • Dtos : 계층간에 데이터 교환을 위한 객체(Dto)의 영역.
  • Domain Model : 도메인을 모든 사람이 같은 관점에서 볼 수 있게 단순화한 모델.
    Domain→비즈니스 처리 담당
  • Entity 클래스를 Request/Response 클래스로 사용하면 안됨!
    → Entity는 DB와 맞닿은 클래스. 변경되면 여러 클래스에 영향 끼침.
  • Entity와 Controller에 쓸 Dto 꼭 분리해서 쓰기

구성 설명

  • 📂 패키지
    • domain : SW 요구사항 or 문제 영역 담는 공간 (게시글, 댓글, 회원, 정산 등)
  • 📄 파일
    • Posts : 실제 DB 테이블과 매칭되는 Entity class
    • PostsRepository : Interface. Posts 클래스 DB에 접근할 수 있게 해줌
    • PostsService : 트랜잭션과 도메인 간의 순서 보장 영역
    • PostsApiController : API를 요청받는 컨트롤러로 요청을 받는 영역 (등록, 조회, 수정 API 작성)
    • PostsResponseDto : 조회 기능을 위한 Dto로 데이터 교환, 변경을 위한 영역
    • PostsSaveRequestDto : 등록 기능을 위한 Dto로 데이터 교환, 변경을 위한 영역
    • PostsUpdateRequestDto : 수정 기능을 위한 Dto로 데이터 교환, 변경을 위한 영역
    • BaseTimeEntity : 모든 Entity 클래스의 상위 클래스. Entity클래스들의 createDate, modifiedDate 자동으로 관리

개발 과정

게시글 수정 (update)

//PostsApiController.java
@PutMapping("/api/v1/posts/{id}")   // 수정 API
    public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto){
        return postsService.update(id, requestDto);
    }
  • 수정하기 전 데이터 모습

  • get으로 받은 data put으로 수정하기 전 postman

  • 데이터베이스 바뀐거 확인할 수 있음

JPA Auditing으로 생성/수정시간 자동화

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;   //생성 시간

    @LastModifiedDate
    private LocalDateTime modifiedDate;   //수정 시간
}
  • 처음 글 posting 했을 때 DB 모습

  • 수정한 뒤에 DB. 수정시간이 바뀐 것을 볼 수 있음

삭제 API

//PostsApiController.java
@DeleteMapping("/api/v1/posts/{id}")   // 삭제 API
   public Long delete(@PathVariable Long id){
       postsService.delete(id);
       return id; 
}
  • 삭제를 위한 데이터 생성 postman + h2DB
  • 삭제 성공
Comments