ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이벤트 조회 및 수정 REST API 개발
    백기선(인프런 강의)/스프링 기반 REST API 개발 2021. 1. 27. 14:06
    반응형

    공부중인 GIT 주소

    위 GIT주소에 개발 step 별로 commit 해두었다.

     

    진행 과정

    이벤트 조회 및 수정 REST API 개발

    1. 테스트용 DB와 설정 분리
    2. API 인덱스 만들기
    3. 이벤트 목록 조회 API 구현
    4. 이벤트 CRUD API 구현
      1. 이벤트 수정 API 구현
      2. 이벤트 삭제 API 구현
      3. 이벤트 조회 API 구현
      4. 이벤트 생성 API 구현
    5. 테스트 코드 리팩토링

     

    1. 테스트용 DB와 설정 분리

    테스트 할 때는 계속 H2를 사용해도 좋지만 애플리케이션 서버를 실행할 때 PostgreSQL을 사용하도록 변경하자.

     

    /scripts.md 참고

     

    1-1. PostgreSQL 드라이버 의존성 추가

    <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    </dependency>

     

    1-2. 도커로 PostgreSQL 컨테이너 실행

    docker run --name ndb -p 5432:5432 -e POSTGRES_PASSWORD=pass -d postgres

     

    1-3. 도커 컨테이너에 들어가보기

    docker exec -i -t ndb bash
    su - postgres
    psql -d postgres -U postgres
    \l
    \dt

     

    도커 컨테이너 사용 예시

     

    1-4. 데이터소스 설정 및 하이퍼네이트 설정

    application.properties

    # 데이터소스 설정
    spring.datasource.username=postgres
    spring.datasource.password=pass
    spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
    spring.datasource.driver-class-name=org.postgresql.Driver

    # 하이버네이트 설정
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
    spring.jpa.properties.hibernate.format_sql=true
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

     

    1-5. 애플리케이션 설정과 테스트 설정 중복 어떻게 줄일 것인가?

    프로파일과 @ActiveProfiles 활용

    application-test.properties

    /test/resources

    spring.datasource.username=sa
    spring.datasource.password=
    spring.datasource.url=jdbc:h2:mem:testdb
    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

     

    추가하는 위치

     

    2. API 인덱스 만들기

    2-1. 이벤트 핸들러

    @RestController
    public class IndexController {
    
        @GetMapping("/api")
        public RepresentationModel<?> index() {
            RepresentationModel<?> index = new RepresentationModel<>();
            index.add(linkTo(EventController.class).withRel("events"));
            return index;
        }
    }

    다른 리소스에 대한 링크 제공

    다른 리소스에 대한 링크 제공

    2021-01-25일 14시 30분 기준 

    git의 아래의 버전으로 코드를 받는다면 2가지 오류가 발생

    4ee4139

     

    1. IndexControllerTest코드 실행시 NullpointException 발생

    2. createEvent_Bad_Request 실행시 오류(?)가 발생이안되고 정상으로 되어 테스트 실패

     

    이는 찾다가 찾지 못하여 백기선님에게 질문드렸음.. 그리고 시간니날때 계속 찾아보면서 오류 수정함

     

     

    3. 이벤트 목록 조회 API 구현

    3-1. 이벤트 목록 조회 REST API (로그인 안 한 상태)

    응답에 보여줘야 할 데이터

    • 이벤트 목록
    • 링크
      • self
      • profile: 이벤트 목록 조회 API 문서로 링크
      • get-an-event: 이벤트 하나 조회하는 API 링크
      • next: 다음 페이지 (optional)
      • prev: 이전 페이지 (optional)
    • 문서?
      • 스프링 REST Docs로 만들 예정

     

    3-2. 이벤트 목록 조회 REST API (로그인 안 한 상태)

    페이징, 정렬 어떻게 하지?

    • 스프링 데이터 JPA가 제공하는 Pageable 사용

     

    Page<Event>에 안에 들어있는 Event 들은 리소스로 어떻게 변경할까?

    • 하나씩 순회하면서 직접 EventResource로 맵핑을 시킬까..
      • 비효율적
    • PagedResourceAssembler<T> 사용하기

     

    테스트 할 때 Pageable 파라미터 제공하는 방법

    • page: 0부터 시작
    • size: 기본값 20
    • sort: property,property(,ASC|DESC)

     

    4. 이벤트 CRUD 이벤트 구현

    POST /api/events

    이벤트 생성

     

    GET /api/events/{id}

    이벤트 하나 조회

     

    PUT /api/events/{id}

    이벤트 수정

     

    DELETE /api/events/{id}

    이벤트 삭제

     

    5. 테스트코드 리팩토링

    여러 컨트롤러 간의 중복 코드 제거하기

    • 클래스 상속을 사용하는 방법

    • @Ignore 애노테이션으로 테스트로 간주되지 않도록 설정

     

    리팩토링 전

     

    리팩토링 결과1
    리팩토링 결과2


     

     

     

     

    테스트

    Event 목록 Page 정보와 함께 받기

    • content[0].id 확인
    • pageable 경로 확인

    Sort과 Paging 확인

    • 30개를 만들고, 10개 사이즈로 두번째 페이지 조회하면 이전, 다음 페이지로 가는 링크가 있어야 한다.
    • 이벤트 이름순으로 정렬하기
    • page 관련 링크

    Event를 EventResource로 변환해서 받기

    • 각 이벤트 마다 self

    링크 확인

    • self
    • profile
    • udpate
    • create

    문서화

    이벤트 데이터

    • 조회하는 이벤트가 없는 경우 404 응답 확인 
    반응형

    '백기선(인프런 강의) > 스프링 기반 REST API 개발' 카테고리의 다른 글

    REST API 보안 적용 - 2  (0) 2021.01.29
    REST API 보안 적용 - 1  (0) 2021.01.27
    REST API 보안 적용  (0) 2021.01.24
    이벤트 생성 API 개발 -3  (0) 2021.01.24
    이벤트 생성 API 개발 -2  (0) 2021.01.23
Designed by Tistory.