Skip to content

[IC2_BE] 신용진 - 설문조사 서비스 과제#16

Open
sirin0762 wants to merge 27 commits into
FC-InnerCircle-ICD2:mainfrom
sirin0762:main
Open

[IC2_BE] 신용진 - 설문조사 서비스 과제#16
sirin0762 wants to merge 27 commits into
FC-InnerCircle-ICD2:mainfrom
sirin0762:main

Conversation

@sirin0762

@sirin0762 sirin0762 commented Nov 25, 2024

Copy link
Copy Markdown

2024-11-29 리뷰완료

  • 기능 : 도메인 및 Jpa Entity 객체 설계, 설문조사 생성 비즈니스 로직구현
  • 리뷰 문의점
    • 이번 사전과제에서는 도메인 객체와 Jpa의 Entity를 나눠서 도메인 객체는 비즈니스 로직을, Entity는 영속화와 관련된 로직을 담당하게 설계를 의도했습니다. 이러한 방식의 개발은 처음이라 해당 설계 포인트가 적절한지, 각 객체에 온전한 책임이 할당되었는지 궁금합니다.
    • 요구사항 생성과 관련한 테스트가 테스트로서의 기능을 하고 있는지 궁금합니다. 자사에서는 Junit을 통한 테스트를 진행하지 않아 잘 모르기에 남들보다 더 구체적으로 알려주셔도 괜찮습니다.
    • 로깅에 대해서 보통 어떤방식으로 진행하시는지 궁금합니다.
    • 기타 의도를 모르겠는 코드, 맘에 안드는 부분 모두 편하게 말씀해주시면 감사하겠습니다. 제가 제일 못한다고 생각하기에 열심히 맞아가면서 배워보려합니다.

@sirin0762 sirin0762 added the WIP 작업을 진행중일 때 사용 label Nov 25, 2024
@sirin0762 sirin0762 self-assigned this Nov 25, 2024
도메인 객체와 엔티티 객체를 분리하는 방향으로 설계를 진행하였습니다.
목표는 JPA와의 결합도를 낮추는 것으로, 이번 프로젝트에서는 JPA는 그저
DB CRUD 정도를 수행하는 정도로 사용할 예정입니다.

설문조사 객체(Survey) 를 보시면, 설문항목(Question)에 의존하고 있으나
Jpa Entity에서는 그렇지 않은 모습을 보이고 있습니다. 설문조사 객체는
설문항목을 최대 10개만 가질 수 있다는 제약을 가지고 있기에 이를 위해
Quesiton을 가지고 있으나, 설문항목 엔티티는 CRUD만 진행하기에 굳이 설문항목을
알 필요가 없다고 판단하여 다음과 같이 설게하였습니다.
설문조사 생성에 대한 비즈니스 로직을 구현하였습니다.
주요 도메인은 하기와 같으며, 도메인 객체와 JPA Entity를 분리하는 방향으로 설계를 진행했습니다.
[주요도메인]
- Survey : 설문조사
- Question : 설문항목
- Answer : 설문항목에 대한 답
@sirin0762 sirin0762 added Needs Review 작업이 완료되어 리뷰가 필요할 때 사용 and removed WIP 작업을 진행중일 때 사용 labels Nov 29, 2024
@sirin0762 sirin0762 added WIP 작업을 진행중일 때 사용 and removed Needs Review 작업이 완료되어 리뷰가 필요할 때 사용 labels Dec 5, 2024
@sirin0762 sirin0762 added Needs Review 작업이 완료되어 리뷰가 필요할 때 사용 WIP 작업을 진행중일 때 사용 and removed WIP 작업을 진행중일 때 사용 Needs Review 작업이 완료되어 리뷰가 필요할 때 사용 labels Dec 7, 2024
@sirin0762

sirin0762 commented Dec 7, 2024

Copy link
Copy Markdown
Author

기능명세서

  • 설문조사 생성 API
    • Post /api/v1/surveys
    • item은 1 ~ 10개까지 포함가능
    • 단일 선택 리스트, 다중 선택 리스트의 경우 선택 할 수 있는 후보를 요청 값에 포함하여야 한다.
  • 설문조사 조회 API
    • GET /api/v1/surveys/{surveyId}
  • 설문항목 수정 API
    • PATCH /api/v1/surveys/{surveyId}/survey-item/{surveyItemId}
    • 단일 선택 리스트, 다중 선택 리스트의 경우 선택 할 수 있는 후보를 요청 값에 포함하여야 한다.
    • 설문받을 항목이 추가, 변경, 삭제되더라도 기존 응답은 유지되어야 한다
  • 설문조사 응답 생성 API
    • POST /{surveyId}/survey-item/{surveyItemId}/{surveyItemVersion}/survey-submission
    • 설문받을 항목에 대응되는 응답 값이 포함.
    • 응답 값은 설문조사의 설문받을 항목과 일치해야만 응답 가능
  • 설문 전체 응답 조회 API
    • GET /api/v1/surveys/{surveyId}/response
    • (advanced) 설문 응답 항목의 이름과 응답 값을 기반으로 검색할 수 있다.

응답 데이터 예시

설문 생성 후 조회 응답
{
    "code": 1000,
    "message": "요청 정상 처리되었습니다.",
    "data": {
        "id": 1,
        "name": "Customer Satisfaction Survey",
        "description": "Survey to evaluate customer satisfaction with our services",
        "questionResponses": [
            {
                "id": 7098992976706910464,
                "version": 1,
                "name": "What is your name?",
                "description": "Please provide your full name.",
                "type": "TEXT",
                "required": true,
                "surveyId": 1,
                "options": []
            },
            {
                "id": 8121888864774276615,
                "version": 1,
                "name": "Please describe your experience with our service.",
                "description": "Feel free to provide as much detail as you like.",
                "type": "PARAGRAPH",
                "required": true,
                "surveyId": 1,
                "options": []
            },
            {
                "id": 2397051438838496245,
                "version": 1,
                "name": "How satisfied are you with our service?",
                "description": "Choose one of the options below.",
                "type": "SINGLE_CHOICE_ANSWER",
                "required": true,
                "surveyId": 1,
                "options": [
                    "Very Satisfied",
                    "Satisfied",
                    "Neutral",
                    "Dissatisfied",
                    "Very Dissatisfied"
                ]
            },
            {
                "id": 3588147029527278395,
                "version": 1,
                "name": "Which of the following features did you use?",
                "description": "Select all that apply.",
                "type": "MULTI_CHOICE_ANSWER",
                "required": false,
                "surveyId": 1,
                "options": [
                    "Online Booking",
                    "Customer Support",
                    "Mobile App",
                    "Website"
                ]
            }
        ]
    }
}
설문 수정 후 조회 응답
{
    "code": 1000,
    "message": "요청 정상 처리되었습니다.",
    "data": {
        "id": 7098992976706910464,    -- 단답형이 단항선택형으로 수정
        "version": 2,
        "name": "How satisfied are you with our service?",
        "description": "Choose one of the options below.",
        "type": "SINGLE_CHOICE_ANSWER",
        "required": true,
        "surveyId": 1,
        "options": [
            "Very Satisfied",
            "Satisfied",
            "Neutral",
            "Dissatisfied",
            "Very Dissatisfied"
        ]
    }
}
설문 제출 후 조회 응답
{
    "code": 1000,
    "message": "요청 정상 처리되었습니다.",
    "data": null
}
설문 응답 전체 조회 응답
{
    "code": 1000,
    "message": "요청 정상 처리되었습니다.",
    "data": [
        {
            "surveyItemId": 7098992976706910464,
            "surveyItemVersion": 1,
            "surveyItemName": "What is your name?",
            "surveyItemDescription": "Please provide your full name.",
            "type": "TEXT",
            "required": true,
            "submissionInquiryResponses": []
        },
        {
            "surveyItemId": 8121888864774276615,
            "surveyItemVersion": 1,
            "surveyItemName": "Please describe your experience with our service.",
            "surveyItemDescription": "Feel free to provide as much detail as you like.",
            "type": "PARAGRAPH",
            "required": true,
            "submissionInquiryResponses": []
        },
        {
            "surveyItemId": 2397051438838496245,
            "surveyItemVersion": 1,
            "surveyItemName": "How satisfied are you with our service?",
            "surveyItemDescription": "Choose one of the options below.",
            "type": "SINGLE_CHOICE_ANSWER",
            "required": true,
            "submissionInquiryResponses": []
        },
        {
            "surveyItemId": 3588147029527278395,
            "surveyItemVersion": 1,
            "surveyItemName": "Which of the following features did you use?",
            "surveyItemDescription": "Select all that apply.",
            "type": "MULTI_CHOICE_ANSWER",
            "required": false,
            "submissionInquiryResponses": []
        },
        {
            "surveyItemId": 7098992976706910464,
            "surveyItemVersion": 2,
            "surveyItemName": "How satisfied are you with our service?",
            "surveyItemDescription": "Choose one of the options below.",
            "type": "SINGLE_CHOICE_ANSWER",
            "required": true,
            "submissionInquiryResponses": [
                {
                    "surveySubmissionId": 1,
                    "surveyItemId": 7098992976706910464,
                    "surveyItemVersion": 2,
                    "response": "Very Satisfied"
                }
            ]
        }
    ]
}

고민포인트

  1. 다양한 타입의 설문항목을 어떻게 요청받을 것인가?

    • 이 부분은 래민님의 코드를 보고 바로 이해해버렸습니다.. 참고하여 리팩토링 진행하겠습니다.
  2. 패키지간 의존성은 어떻게 관리할 것인가?

    • 이 부분은 정말 모르겠습니다. 프로젝트의 설계부터 다시 진행되어야한다고 판단하고 있습니다. 관련 문서나 자료를 찾아봐도 패키지간 의존성에 대해 정확히 명시해 놓은 자료가 보이지 않아 혼란스럽습니다. 사실 이 부분은 은탄환이 없이 개발자 역량에 따라 갈리는 부분인가 싶기도 합니다.
  3. 도메인과 Jpa 엔티티를 분리하여 차후 JPA를 걷어내야하는 상황이 되어도 도메인과 서비스 컴포넌트는 지킬수 있게 하였는데 과연 의미가 있는 행위였는가?

    • 도메인과 Jpa 엔티티를 분리하여 개발한 것은 처음인데, 도메인 로직은 도메인에, Jpa entity는 persistence 정도만 담당하게 하여 도메인을 특정 기술에 종속되지 않게하는 것은 좋은 방법이였다고 생각합니다. 허나 실제 프로덕트 레벨로 올라가면 JPA를 걷어낸다는 건 프로젝트를 새로 만드는 것과 큰 차이가 없다고 생각하여 이게 과연 의미가 있는가 라는 생각도 듭니다.
  4. 설문항목의 응답을 설문항목의 Version 을 두어 관리한 부분

    • 설문항목은 특성 상 1개의 항목에 많은 답변이 존재하게 됩니다. 이러한 답변에 질문을 스냅샷하는게 DB 용량부분에서 좋지않다고 생각하여 설문항목에 Version을 두고 Join으로 풀어나갔습니다. 이 방식에 대해서 피드백 요청드립니다.
    • 또한 설문항목 수정이 빈번하게 일어날 것인가 라는 부분에도 그렇지 않다라고 판단이 되어 많은 Version으로 인해 문제가 발생하긴 어렵다고 판단하였습니다.

@sirin0762 sirin0762 added Needs Review 작업이 완료되어 리뷰가 필요할 때 사용 and removed WIP 작업을 진행중일 때 사용 labels Dec 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs Review 작업이 완료되어 리뷰가 필요할 때 사용

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant