마일리지 적립 과제

기술 환경

  • JAVA 8
  • Spring Boot 2.7.1
  • MySQL(8.0.28)
  • MyBatis

실행방법

git clone https://github.com/qwer123sdas/Mileage_Homework.git
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:8.0.28
./mvnw spring-boot:run



애플리케이션은 port 8083으로 실행할 수 있습니다.
mysql은 docker를 통해 사용할 수 있습니다.
(hostname은 127.0.0.1로, user_name은 root, password는 root 그리고 port는 3306으로 하시면 됩니다. 
  테스트상 임시로 올린 properties 파일을 참고하셔도 됩니다.)
 
[7.14 수정]
sql파일은 폴더 상단에 init_datas.sql과 init_tables.sql에 존재합니다.

POST / events : http://localhost:8083/events
GET / mileages : http://localhost:8083/mileages/{user_id}?page={pageNum}

테스트 케이스 id

user_id : 3ede0ef2-92b7-4817-a5f3-0c575361f745, 
          9ec1ff63-1783-4365-801e-8f09d1e6e1f1, 
          9ec1ff63-1783-4365-801e-8f09d1e6e1f2,
          9ec1ff63-1783-4365-801e-8f09d1e6e1f3,
          9ec1ff63-1783-4365-801e-8f09d1e6e1f4
place_id : 2e4baf1c-5acb-4efb-a1af-eddada31b00f, 
           7e234855-abee-449a-b632-dc6d366585c5,
           8f234855-abee-449a-b632-dc6d366585c5,
           9g234855-abee-449a-b632-dc6d366585c5
           
※ 테스트 케이스는 test-case 폴더에 있습니다.

ERD

ERD

  • 모든 id는 pk이고 다른 테이블의 id를 참조할 때, fk를 주어 정규화시켜주었습니다.

  • pk는 자동적으로 유니크 인덱스를 생성하기 때문에, pk만 스캔하도록 하여 전체 테이블 스캔이 이루어지지 않도록 했습니다.

  • fk에 create index를 하기 원한다면 한다면 아래의 sql을 사용하면 됩니다.

create index idx_user on Mileage (user_id);
create index idx_place on Mileage (place_id);

Table

ERD



API

포인트 적립요청

POST / events

Requset로 오는 데이터의 type에 따라 리뷰를 추가/수정/삭제하고 이를 처리된 데이터를 각각의 Reivew, Photo, Point 테이블에 저장합니다.

필요한 데이터가 없거나 리뷰 중복과 같이 검증이 필요한 경우, validator을 통해 runtime exception이 일어나게 하여 어떤 오류인지 
알 수 있도록 했습니다.(Response는 모두 ResponseEntity를 통해 처리했습니다.)

ADD : 처음에 validator을 통해 유효성을 검사합니다. validator에서content는 1 글자 이상 100 글자 이하로 작성하도록 했습니다. 그 외에 장소, 유저
, type 그리고 리뷰 중복을 확인합니다. 그 다음, 사진과 첫리뷰에 따라 점수를 각각 부여합니다.
MOD : content와 attachedPhoto를 수정할 수 있도록 했습니다. 그에 따른 점수가 반영됩니다. 다만 수정에 따른 첫리뷰 보너스는 반영되지 않습니다.
DELETE : content의 type을 바꾸고, 해당 리뷰의 attachedPhoto를 모두 삭제합니다. 마일리지 차감은 한번에 정산합니다.

응답 샘플 : 

add review!
modify review!
delete review!

이미 작성한 리뷰가 있습니다.
등등...

마일리지 합계 및 조회 페이징

GET / mileages/{userId}?page={pageNum}

입력되는 유저 아이디에 맞게 작성된 리뷰 마일리지의 합산값과 변화된 마일리지 적립 내역들을 보여줍니다.
type의 'A'는 Add의 앞글자,'D'는 Delete의 앞글자 입니다. comment는 어떠한 이유로 포인트가 증감했는지 간략하게 알려줍니다.
응답 샘플 : 

{
    "sum": 0,
    "logs": [
        {
            "pointId": "24dd3cca-77d1-49ff-b0ec-f7d6afa61f0b",
            "point": -3,
            "userId": "3ede0ef2-92b7-4817-a5f3-0c575361f745",
            "reviewId": "240a0658-dc5f-4878-9381-ebb7b2667772",
            "type": "D",
            "comment": "리뷰삭제",
            "inserted": "2022-07-10 16:14:26"
        },
        {
            "pointId": "54fe157b-16e3-4da9-873d-98847fe84c68",
            "point": 1,
            "userId": "3ede0ef2-92b7-4817-a5f3-0c575361f745",
            "reviewId": "240a0658-dc5f-4878-9381-ebb7b2667772",
            "type": "A",
            "comment": "사진추가",
            "inserted": "2022-07-10 16:14:01"
        },
        {
            "pointId": "b47225ee-67c8-4d4b-99d2-43e7d362cf50",
            "point": -1,
            "userId": "3ede0ef2-92b7-4817-a5f3-0c575361f745",
            "reviewId": "240a0658-dc5f-4878-9381-ebb7b2667772",
            "type": "D",
            "comment": "사진삭제",
            "inserted": "2022-07-10 16:13:46"
        },
        {
            "pointId": "7c217fd5-4ead-40c8-8cce-bfb0d642222a",
            "point": 1,
            "userId": "3ede0ef2-92b7-4817-a5f3-0c575361f745",
            "reviewId": "240a0658-dc5f-4878-9381-ebb7b2667772",
            "type": "A",
            "comment": "내용추가",
            "inserted": "2022-07-10 16:13:22"
        },
        {
            "pointId": "9f119ea5-35d4-43c9-b100-7e62d406c15b",
            "point": 1,
            "userId": "3ede0ef2-92b7-4817-a5f3-0c575361f745",
            "reviewId": "240a0658-dc5f-4878-9381-ebb7b2667772",
            "type": "A",
            "comment": "사진추가",
            "inserted": "2022-07-10 16:13:22"
        },
        {
            "pointId": "cfae6a21-1f8b-494c-be02-fff07a2eb22d",
            "point": 1,
            "userId": "3ede0ef2-92b7-4817-a5f3-0c575361f745",
            "reviewId": "240a0658-dc5f-4878-9381-ebb7b2667772",
            "type": "A",
            "comment": "첫리뷰",
            "inserted": "2022-07-10 16:13:22"
        }
    ]
}