앵귤러를 이용해서 동적 설문조사 페이지를 만들어 보기

2023. 3. 23. 21:11·Front-End/Angular

0. 개요

현재 앵귤러를 사용해서 설문조사하고, 데이터를 축적시키는 페이지를 만드는 일이 생겼습니다.

특이사항으로는 설문조사를 받는 사람들의 상태에 따라서, 다른 설문들이 보여져야 한다는 것이고, 이는 설문 페이지를 여러개를 만드는 과정이 될 것입니다.

이를 해결하기 위해서, 설문 내용만 입력하면, 해당 설문페이지를 만들수 있게 페이지를 작성해 보려고 합니다.

1. 공통 설문내용 및 서비스 생성

먼저, 설문을 할 데이터의 양식을 정했고, 이를 설문 받는 사람에 따라 변동시켜 사용할 수 있게 변수로 저장했습니다.

survey.ts

// text는 input-text 형식의 질문란 입니다. [ 질문, 입력한 값이 바인딩 될 key값]
// select는 input-radio 형식의 질문란 입니다.
// title : 질문
// selCont : radio버튼에 나타날 값
// selectData : 선택한 radio버튼이 바인딩 될 key값
// selContData : 선택한 radio버튼의 value값
// url : 저장 버튼을 눌렀을때, 요청을 할 url
export const FootballQuiz = {
  title: '축구',
  text: [
    ['가장 좋아하는 팀은 어디인가요?', 'favorTeam'],
    ['가장 좋아하는 선수는 누구인가요?', 'favorPlayer'],
    ['가장 싫어하는 선수는 누구인가요?', 'hatePlayer']
    ],
  select: [
    {title: '레반도프스키가 태어난 연도는?',
      selCont: ['1989', '1988', '1987', '1986'],
      selectData: 'lewanBirth',
      selContData: ['1989', '1988', '1987', '1986']
    },
    {
      title: '맨유의 홈구장은 어디일까요?',
      selCont: ['캄프 누', '완다 메트로폴리타노', '올드 트래포드','스탬포드 브릿지'],
      selectData: 'stadium',
      selContData: ['CampNou', 'WandaMetroplitano','OldTrafford','StampordBridge']},
  ],
  url: 'survey/save'

};

export const BasketballQuiz = {
  title: '농구',
  text: [
    ['가장 좋아하는 팀은 어디인가요?', 'favorTeam'],
    ['가장 좋아하는 선수는 누구인가요?', 'favorPlayer'],
    ['가장 싫어하는 선수는 누구인가요?', 'hatePlayer']
  ],
  select: [
    {title: '마이클조던이 태어난 연도는?',
      selCont: ['1961', '1962', '1963', '1964'],
      selectData: 'JordanBirth',
      selContData: ['1961', '1962', '1963', '1964']
    },
    {
      title: '현재 르브론 제임스가 소속한 팀은 어디일까요?',
      selCont: ['LA레이커스', '클리블랜드 캐벌리어스', '마이애미 히트','LA클리퍼스'],
      selectData: 'nowTeam',
      selContData: ['Lakers', 'ClevelandCavaliers','MiamiHeat','Clippers']},
  ],
  url: 'survey/save'

};

그 후, formBuilder를 활용해서 데이터를 바인딩할 formGroup을 초기화하는 함수를 생성해 주었습니다.

survey.service.ts

@Injectable({
  providedIn: 'root'
})
export class SelfExaminationService {

  formData: any = {};

  constructor(
    private http: HttpClient,
    private formBuilder: FormBuilder,
    ){

  }

  makeFormGroupData(surveyData: any): FormGroup {  // 폼 그룸 데이터 생성
    for(const textGroupName of surveyData.text) {
      this.formData[textGroupName[1]] = [''];
    }
    for(const textGroupName of surveyData.select) {
      this.formData[textGroupName.selectData] = [''];
    }
    console.log(this.formData);

    return this.formBuilder.group(this.formData);

  }

  formGroupDataInit(formGroup: FormGroup): void {  // 폼 그룹 데이터 초기화
    this.formData = {};
    formGroup = this.formBuilder.group([]);
  }
}

2. 설문 컴포넌트 만들기

먼저 ngSubmit과 formGroup 기능을 사용하기 위해서 App.module.ts에 ReactiveFormsModule 을 임포트 해주었습니다.

그 후에, $ ng g component survey를 이용해서 설문 컴포넌트를 생성하였고, survey.html에 아래 내용을 입력하였습니다.

<!--설문 영역-->
  <form (ngSubmit)="onSubmit()" [formGroup]="formGroup">
  <div class="survey">
    <div class="request">{{surveyData.title}}</div> <!-- 설문 제목 -->
          <div *ngFor="let p of surveyData.text; let i = index">
            <div> {{p[0]}} </div> <!-- text 설문 내용 -->
            <input type="text" formControlName="{{p[1]}}"> <!-- 설문 입력한 값 바인딩-->
          </div>
          <div *ngFor="let p of surveyData.select; let i = index">
            {{p.title}} <!-- radio 설문 내용 -->
              <div *ngFor="let sel of p.selCont let i = index">
                <input id="{{sel}}{{i}}" type="radio" name="{{p.selectData}}" formControlName="{{p.selectData}}"
                       value="{{p.selContData[i]}}">      <!-- radio 값 데이터 바인딩 -->
                <label for="{{sel}}{{i}}">{{sel}}</label> <!-- radio 설문 나타내줄 값 -->
        </div>
      </div>
  </div>
      <button type="submit" class="btn-1">저장</button>
  </form>

survey.component.ts

@Component({
  selector: 'app-input-self-examination',
  templateUrl: './input-self-examination.page.html',
  styleUrls: ['./input-self-examination.page.scss'],
})
export class InputSelfExaminationPage implements OnInit {
  surveyData = FootballQuiz;

  formGroup !: FormGroup;

  constructor(
    private selfExamService: SelfExaminationService
  ) {
    this.formGroup = this.selfExamService.makeFormGroupData(this.examinationData);
  }

  ngOnInit() {

  }

  onSubmit(): void {
    console.log('넘어간 데이터 :'+ JSON.stringify(this.formGroup.value));
    console.log( '요청 url :'+ this.examinationData.url);
  }

}

3. 변수 바꿔보기

현재는 survey.component.ts의 surveyData에 FootballQuiz데이터를 주었으니, 아래와 같은 화면이 출력됩니다. (CSS 코드는 생략했습니다)

해당 화면에서 값을 입력후 저장을 누르면 자동으로 데이터가 바인딩되어 콘솔창에 나타나는것을 볼 수 있습니다.

FootballQuiz를 BasketballQuiz로 바꿔보겠습니다.

바로 다음과 같은 화면이 출력되는 것을 확인 할 수 있습니다.

surveyData 에 설문하는 사람들의 조건을 통해서 변수를 조절한다면, 서로 다른 설문지를 보여줄 수 있을 것 입니다.

4. 정리

해당 페이지의 장점

  • survey.ts의 설문 양식에 맞는 값만 맞게 입력하면, 설문 화면을 쉽게 만들어 낼 수 있습니다.
  • 이를 통해서 코딩을 할 줄 모르는 사람들도 해당 양식에 맞는 값만 받아서 쉽게 페이지를 만들어 낼 수있습니다.
  • 데이터를 받아서 동적으로 화면을 구현해 주기 때문에, 재사용성이 큽니다.
  • 화면 구현 뿐만 아니라, 데이터 바인딩도 자동으로 해 줍니다.

해당 페이지의 단점

  • input-text 형식의 설문 사이사이에 input-radio형식의 설문을 끼워넣을수 없습니다. (text형식의 질문이 먼저 나온후, radio형식의 질문이 나오는 순서대로만 배치가 됨)
  • 당연하게도, 다른 형식의 질문 방식은 사용할 수 없습니다.
  • 또한 규격에 맞는 설문내용을 작성하지 않을 시, 에러가 발생 할 수 있습니다.
반응형
저작자표시 (새창열림)
'Front-End/Angular' 카테고리의 다른 글
  • Angular - 데이터 공유(Inject, Service)
  • Angular - 데이터바인딩 심화
  • Angular - 디렉티브, 반응형 모듈
  • Angular - 컴포넌트의 연결과 데이터 전달방법
LightSource
LightSource
어제보단 발전한 오늘의 나를 위한 블로그
    반응형
  • LightSource
    LightSourceCoder
    LightSource
  • 전체
    오늘
    어제
    • 분류 전체보기 (152)
      • Git (4)
      • Language (6)
        • Java (6)
      • Back-End (63)
        • Spring Boot (4)
        • MyBatis (1)
        • Oracle (1)
        • PL SQL (3)
        • JPA (26)
        • Spring Data JPA (5)
        • Spring MVC (8)
        • Spring (12)
        • Spring Security (2)
        • Redis (1)
      • Front-End (38)
        • 아이오닉 (2)
        • JSP (7)
        • JavaScript (4)
        • React (16)
        • TypeScript (3)
        • Angular (6)
      • AWS (1)
      • CI & CD (1)
      • 개발지식 (13)
        • 네트워크 (9)
        • CS 지식 (4)
      • 데이터모델링 (2)
      • Tool (1)
      • 프로젝트 (5)
      • 독후감 (2)
      • 잡생각 (0)
      • 면접 준비 (1)
      • 알고리즘 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    배열요소수정
    react
    배열요소삭제
    배요소열추가
    리액트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
LightSource
앵귤러를 이용해서 동적 설문조사 페이지를 만들어 보기
상단으로

티스토리툴바