2021-01-17 :: 도메인 기능들 구현 완료

모든 도메인에 대해서 Create, Update, Get 메소드의 반환 값이 동일 함으로 Create 메소드의 반환값으로만 설명을 하겠다.

1. User 도메인

먼저 유저이다. 일단 아직 Spring security를 사용하지 않았기 때문에 세션이 존재하지는 않는다.

추가, 수정, 조회가 가능하다.

1. create

Request

POST http://localhost:8080/api/v1/users

Body : 
{
    "email": "testEmail@test.com",
    "pw": "testPw",
    "name": "testName123"
}
Response

status : Created(201)
Body : 
{
    "id": 1,
    "name": "testName123",
    "email": "testEmail@test.com",
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/v1/users/1"
        },
        "update_user": {
            "href": "http://localhost:8080/api/v1/users/1"
        },
        "delete_user": {
            "href": "http://localhost:8080/api/v1/users"
        },
        "create_studyGroup": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups"
        },
        "create_userWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks"
        }
    }
}

위와 같은 결과 값이 나오며 다음 상태로 갈 수 있는 정보가 나오게 된다.

2. UserWordBook 도메인

사용자 개인 단어장이다.

추가, 수정, 삭제, 조회가 가능하다.

1. Create

Request

POST http://localhost:8080/api/v1/users/1/wordbooks

Body : 
{
    "name": "testWordBook"
}
Response

status : Created(201)
Body : 
{
    "id": 2,
    "isUsing": true,
    "name": "testWordBook",
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        },
        "update_userWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        },
        "delete_userWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        },
        "add_word": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words"
        },
        "get_user": {
            "href": "http://localhost:8080/api/v1/users/1"
        }
    }
}

아래와 같이 정상적으로 추가 됐다면 다음 상태에 있는 get_user를 요청 해보자.

{
    "id": 1,
    "name": "testName123",
    "email": "testEmail@test.com",
    "wordBookDTOList": [
        {
            "id": 2,
            "name": "testWordBook",
            "_links": {
                "get_userWordBook": {
                    "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
                }
            }
        }
    ],

	...
}

아래 생성한 유저를 요청한 결과이다 밑에 다음 상태를 설명해주는 부분은 생략을 하였다.

달라진 점으론 wordBookDTOList가 생겼다. 그리고 해당 wordBookDTOList의 wordBook을 조회할 수 있는 상태를 나타냈다.

3. Word Of UserWordBook 도메인

유저 개인 단어장의 단어들이다.

추가, 수정, 조회, 삭제가 가능하다.

1. Create

Request

POST http://localhost:8080/api/v1/users/1/wordbooks/2/words

Body : 
{
    "voca": "apple",
    "meaning": "사과"
}
Response

status : Created(201)
Body : 
{
    "id": 3,
    "voca": "apple",
    "meaning": "사과",
    "_links": {
        "update_word": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words/3"
        },
        "delete_word": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words/3"
        },
        "get_userWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        }
    }
}

단어를 2개 정도 생성해보고 다시 get_userWordBook을 호출하게 되면 아래와 같이 단어가 추가되고 해당 단어에서 갈 수 있는 상태인 수정과 삭제 요청을 반환한다.

{
    "id": 2,
    "isUsing": true,
    "name": "testWordBook",
    "wordDTOList": [
        {
            "id": 3,
            "voca": "apple",
            "meaning": "사과",
            "_links": {
                "update_word": {
                    "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words/3"
                },
                "delete_word": {
                    "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words/3"
                }
            }
        },
        {
            "id": 4,
            "voca": "banana",
            "meaning": "바나나",
            "_links": {
                "update_word": {
                    "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words/4"
                },
                "delete_word": {
                    "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words/4"
                }
            }
        }
    ],
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        },
        "update_userWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        },
        "delete_userWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2"
        },
        "add_word": {
            "href": "http://localhost:8080/api/v1/users/1/wordbooks/2/words"
        },
        "get_user": {
            "href": "http://localhost:8080/api/v1/users/1"
        }
    }
}

그룹과 관련하여 그룹 관리자와 그룹 사용자로 나뉘게 된다. 그룹 관리자와 그룹 사용자의 기능은 나누어서 구현하였으며 그룹 참여 기능을 구현하게 되면 이후에 다른 권한에 대한 결과값 구현 내용을 추가 하겠다.



4. StudyGroup 도메인

개인 유저들이 모여서 그룹을 만드는 도메인이다.

아직 그룹 참여 기능은 구현되지 않았다. 해당 기능을 구현하기 위해선 어떤 방식으로 그룹에 참여할지에 대한 설계가 필요할것 같다. 추후 회의를 통해서 정하도록 해야겠다.

추가, 수정, 삭제, 조회가 가능하다

1. Create

Request

POST http://localhost:8080/api/v1/users/1/study-groups
Body : 
{
    "name": "testStudyGroup"
}
Response

status : Created(201)
Body : 
{
    "id": 6,
    "name": "testStudyGroup",
    "userDTOList": [
        {
            "id": 1,
            "name": "testName123"
        }
    ],
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6"
        },
        "update_studyGroup": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6"
        },
        "delete_studyGroup": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6"
        },
        "create_studyGroupWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks"
        },
        "get_user": {
            "href": "http://localhost:8080/api/v1/users/1"
        }
    }
}

그룹이 생성되며 그룹 사용자와 그룹 단어장이 반환된다. 그룹 단어장은 현재 없는 상태이므로 반환되지 않도록 하였다. 또한 그룹 생성자는 그룹 관리자 권한을 가지게 되며 해당 관리자가 아닌 유저가 그룹 단어장에 접근 하게 되면 update_studyGroup, delete_studyGroup, create_studyGroupWordBook 해당 링크들을 반환하지 않도록 구현하였다.

이후 다시 get_User를 요청해보겠다. 아래와 같은 결과값이 반환되며 이외 부분은 모두 생략하였다. 각 그룹을 조회 할 수 있는 링크 정보가 담겨 있다.

{
    "id": 1,
    "name": "testName123",
    "email": "testEmail@test.com",
    "studyGroupDTOList": [
        {
            "id": 6,
            "name": "testStudyGroup",
            "_links": {
                "get_studyGroup": {
                    "href": "http://localhost:8080/api/v1/users/1/study-groups/6"
                }
            }
        }
    ],
    ...
}


5. StudyGroupWordBook 도메인

그룹에서 사용하는 단어장이다. 유저 단어장과 기능은 동일 하다.

추가, 수정, 삭제, 조회가 가능하다

1. Create

Request

POST http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks
Body : 
{
    "name": "testWordBook"
}
Response

status : Created(201)
Body : 
{
    "id": 10,
    "isUsing": true,
    "name": "testWordBook",
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10"
        },
        "update_studyGroupWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10"
        },
        "delete_StudyGroupWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10"
        },
        "add_word": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10"
        },
        "get_studyGroup": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6"
        }
    }
}

그룹 단어장은 그룹 관리자만 생성할 수 있으며 관리자에게는 update_studyGroupWordBook, delete_StudyGroupWordBook 상태로 갈 수 있는 링크가 반환된다. 이외 add_word, get_studyGroup은 모든 그룹 참여자에게 반환 한다.

6. Word Of StudyGroupWordBook 도메인

그룹 단어장의 단어이다. 유저 단어장의 단어 기능과 동일 하다.

추가, 수정, 삭제, 조회가 가능하다

1. Create

Request

POST http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10
Body : 
{
    "voca": "apple",
    "meaning": "사과"
}
Response

status : Created(201)
Body : 
{
    "id": 11,
    "voca": "apple",
    "meaning": "사과",
    "_links": {
        "update_word": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10/words/11"
        },
        "delete_word": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10/words/11"
        },
        "get_studyGroupWordBook": {
            "href": "http://localhost:8080/api/v1/users/1/study-groups/6/wordbooks/10"
        }
    }
}

유저 단어장의 단어와 유사하다 수정과 삭제를 할 수 있으며 이전 상태인 get_studyGroupWordBook 링크를 반환 한다.

정리

현재까지 개발된 내용으로 대략적인 단어장의 기능은 모두 동작하게 됐다. 하지만 부족한 점과 생각해야할것들을 정리 해보겠다.

첫번째는 먼저 개발만 달려오다보니 API 명세에 대한 내용을 잊고 있었다. 현재 API 반환값은 self -description 이 없기 때문에 완벽한 Rest Api라고 부를수 없다.

두번째는 테스트 코드 수정 문제 이다. 테스트 코드를 먼저 작성하게 되면서 오류가 발생하는 부분이 줄어드는것은 좋은 점이라 생각하지만 서비스의 구조가 바뀌거나 했을때 수정해야하는 부분이 생각보다 많았다. 다음 부턴 테스트 코드를 작성할때도 조금 더 큰 그림을 보고 당장에 돌아가는 코드보단 잘 설계된 코드로 방향을 맞추어 최대한 수정하는 일이 적어지도록 노력 해봐야겠다.

부족한 점 두가지 모두 그룹 참여 기능을 구현한 후 조금씩 수정해 나가도록 해보겠다.