[AS 서비스 개발] 2. 로직 개발, 사용자 정보 입력 받고 조회 구현

2024. 3. 5. 22:48Github 프로젝트/AS 서비스 프로젝트

728x90
반응형
SMALL

지난 포스팅에서는 kotlin 환경 설정을 진행 하였고,

이번 포스팅은 사용자 정보 입력, 조회 구현을 진행 하도록 하겠습니다.

 

Chapter02 부분 참조

 

https://github.com/BerkleyLim/AS_process

 

GitHub - BerkleyLim/AS_process: AS 처리 알고리즘 및 앱 개발

AS 처리 알고리즘 및 앱 개발. Contribute to BerkleyLim/AS_process development by creating an account on GitHub.

github.com

 

 

1. 요구사항 목록

TV AS 서비스
- 다음은 AS 서비스를 받고자 한다.
- 고객 마다 찾아오는 유형은 각각 다른데 A고객은 AS 신청 이력 조회를 하고 싶고, B고객은 AS 신청 내역을 변경하고 싶어 한다. C고객은 AS건 취소를 원하고 D고객은 AS 신청을 하고 싶다.
- 따라서 메뉴는 “신청”, “조회”, “변경”, “취소”  총 4가지로 구분되어 있다. 따라서 고객이 원하는 서비스 각 기능을 구현해야 합니다.
- 서비스 진행 전 본인의 인적사항이 필요합니다.
- 기본 인적사항은 “이름”, “나이”, “휴대폰번호" 를 입력 받고 AS 서비스를 진행하기 위해 AS 번호가 필요합니다.

1) 신청인 경우
- 입력 값 : 이름, 나이, 휴대폰번호, 모델 명, 불능 사유, 출장 희망일, 접수일
- 출력 값 : as서비스번호
- 로직 흐름 설명
   - 입력 값을 바탕으로 데이터를 저장하고, 사유 추가, 불능 원인은 본래라면 수리기사가 작업 진행 후 변경 해야 하지만, 연습이기 때문에 판매자 입장으로 진행 해야 하는 로직에서 하루가 지나면 변경 처리(불능 원인 코드, 불능원인, 진행사항, 진행사항코드)를 입력 하는 방식하고, 처리완료일을 진행하자> > - 이후, 데이터 저장하여 성공 메시지를 띄어본다.

2) 조회인 경우
- 입력 값 : 이름, 나이, 휴대폰 as서비스번호
- 출력 값 : as서비스번호, 모델명, 접수일, 불능 사유, 불능 원인코드, 불능 원인, 출장희망일, 처리완료일을 출력해보자.

3) 변경인 경우
- 입력 값 : 이름, 나이, 휴대폰번호, as서비스 번호, 모델명, 불능 사유, 출장 희망일, 접수일
- 출력 값 : as서비스번호
- 로직 흐름 설명
    - 모델명, 불능 사유, 출장 희망일 변경 가능
    - 이후, 데이터 저장하여 성공 메시지를 띄어본다

4) 취소인 경우

- 입력 값 : 이름, 나이, 휴대폰 as서비스번호
- 출력 값 : as서비스번호, 모델명, 접수일, 불능 사유, 불능 원인코드, 불능 원인, 출장희망일, 처리완료일을 출력해보자.
- 이벤트 진행 이후, 2일이 지나면 처리 완료로 default로 설정 하여 로직을 작성하세요.

 

 

 

2. 요구사항 분석 (단계별 이행)

- 사용자 정보를 먼저 입력 받는다. (이름, 나이, 휴대폰 번호)

- 출력에 필요한 Schema 형식을 구현해본다.

  => 지금 단계에서는 DB 연동 x, JSON 형식으로 Mock Server 방식으로 하드코딩 입력하고 테스트 진행

  => 차후, Spring boot 및 Ktor를 이용하여 WebSocket 방식으로 결과 값 출력하는 형식으로 지정 예정

 

 

3. Schema 구조 

- 지금 단계에서는 신청, 조회, 취소, 변경 에 필요한 Schema를 작성한다.

 

- 필요 스키마 

- no(번호), age(나이), phone_nm(휴대폰번호), as_scv_nm(AS 서비스 번호), model_nm(모델명), impsb_desc(불능사유), impsb_cuz_cd(불능 원인코드), impsb_cuz(블능 원인), prefer_deli_date(출장희망일), receipt_date(접수일), prcsCpltDate(처리완료일), 

 

 

4. 사용자 정보 추가

- 다음은 고객이라고 가정하고, 사용자 정보를 추가한다.

- 사용자 입력 정보를 입력 이후 결과가 출력 됩니다.

fun main() {
    // 아래는 입력 받는 값 : Java에서는 Scanner sc = new Scanner(System.in) 과 비슷
    // 결국 Java와 사용 비슷하다.
    var sc : Scanner = Scanner(System.`in`)

    println("AS 서비스 이용 전 인적사항을 먼저 확인합니다.")
    print("이름을 입력하세요.")
    var name : String = sc.nextLine()

    print("나이를 입력하세요.")
    var age : Int = sc.nextInt()
    sc.nextLine()

    print("휴대폰 번호 입력하세요. (- 제외)")
    var phoneNumber : String = sc.nextLine()


    println("******************************************************************")
    println(name + "(" + age + ") : " + phoneNumber + " 회원 환영합니다.")
    println("******************************************************************")
    println()

}

 

 

 

5. 로직 추가

- 여기서 해당 메뉴의 따른 로직 선택

fun main() {
	......
    
    // 비즈니스 로직 부분
    while(true) {
        println("계속 하실려면 9 클릭, 종료 시 아무키나 클릭하여 주세요.")
        if (!readln().equals("9")) {
            break
        }
        println()
        println("******************************************************************")
        println("메뉴를 선택해 주세요. 1. 신청, 2. 조회, 3. 변경, 4. 취소")
        var menuNumber : Int = sc.nextInt();
        if (menuNumber == 1) {
            // 신청 메뉴
        } else if (menuNumber == 2) {
            // 조회 메뉴
        } else if (menuNumber == 3) {
            // 변경 메뉴
        } else if (menuNumber == 4) {
            // 취소 메뉴
        } else {
            // 메뉴 선택 잘 못 시
            println("메뉴를 잘 못 선택하였습니다.")
            println()
        }
    }
}

 

 

 

6. 샘플 데이터 삽입

<main/resources/data/dataSample.json>

[
  {
    "no": 1,
    "name": "홍길동",
    "phoneNumber" : "01011112222",
    "asServiceNumber" : "0111",
    "modelNumber" : "ab1aaaa111",
    "impsbDesc" : "스위치 고장",
    "impsbCuzCd" : 1,
    "impsbCuz" : "스위치 불량",
    "preferDeliDate" : "2024-01-01",
    "receiptDate" : "2024-01-02",
    "prcsCpltDate" : "2023-12-31"
  },
  {
    "no": 2,
    "name": "김길동",
    "phoneNumber" : "01022223333",
    "asServiceNumber" : "0112",
    "modelNumber" : "ab1aaaa112",
    "impsbDesc" : "스위치 고장",
    "impsbCuzCd" : 1,
    "impsbCuz" : "스위치 불량",
    "preferDeliDate" : "2024-01-01",
    "receiptDate" : "2024-01-02",
    "prcsCpltDate" : "2023-12-31"
  },
  {
    "no": 3,
    "name": "강길동",
    "phoneNumber" : "01033334444",
    "asServiceNumber" : "0113",
    "modelNumber" : "ab1aaaa113",
    "impsbDesc" : "스위치 고장",
    "impsbCuzCd" : 1,
    "impsbCuz" : "스위치 불량",
    "preferDeliDate" : "2024-01-01",
    "receiptDate" : "2024-01-02",
    "prcsCpltDate" : "2023-12-31"
  }
]

 

 

 

7. Data Class로 정의 하기

<main/kotlin/entity/AS.kt>

package entity

import java.time.LocalDate
import java.util.*

// object 설정
data class AS(
    var no : Int?,
    var name : String?,
    var phoneNumber : String?,
    var asServiceNumber : String?,
    var modelNumber : String?,
    var impsbDesc : String?,
    var impsbCuzCd : Int?,
    var impsbCuz : String?,
    var preferDeliDate : LocalDate?,
    var receiptDate : LocalDate?,
    var prcsCpltDate : LocalDate?
) {
    override fun toString(): String {
        return "AS(no=$no, name=$name, phoneNumber=$phoneNumber, asServiceNumber=$asServiceNumber, modelNumber=$modelNumber, impsbDesc=$impsbDesc, impsbCuzCd=$impsbCuzCd, impsbCuz=$impsbCuz, preferDeliDate=$preferDeliDate, receiptDate=$receiptDate, prcsCpltDate=$prcsCpltDate)"
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as AS

        if (no != other.no) return false
        if (name != other.name) return false
        if (phoneNumber != other.phoneNumber) return false
        if (asServiceNumber != other.asServiceNumber) return false
        if (modelNumber != other.modelNumber) return false
        if (impsbDesc != other.impsbDesc) return false
        if (impsbCuzCd != other.impsbCuzCd) return false
        if (impsbCuz != other.impsbCuz) return false
        if (preferDeliDate != other.preferDeliDate) return false
        if (receiptDate != other.receiptDate) return false
        if (prcsCpltDate != other.prcsCpltDate) return false

        return true
    }

    override fun hashCode(): Int {
        var result = no ?: 0
        result = 31 * result + (name?.hashCode() ?: 0)
        result = 31 * result + (phoneNumber?.hashCode() ?: 0)
        result = 31 * result + (asServiceNumber?.hashCode() ?: 0)
        result = 31 * result + (modelNumber?.hashCode() ?: 0)
        result = 31 * result + (impsbDesc?.hashCode() ?: 0)
        result = 31 * result + (impsbCuzCd ?: 0)
        result = 31 * result + (impsbCuz?.hashCode() ?: 0)
        result = 31 * result + (preferDeliDate?.hashCode() ?: 0)
        result = 31 * result + (receiptDate?.hashCode() ?: 0)
        result = 31 * result + (prcsCpltDate?.hashCode() ?: 0)
        return result
    }
}

 

 

 

8. JSON 데이터 불려와 AS 객체에 입력하기

- JSON을 불려오고, 결과 값을 출력하는 형식으로 작성

- 객체 생성 시 Java와 다르게 C언어 처럼 객체 초기화 후 사용해줘야 한다.

- 또한 Call-By-Reference 가 금지되어져 있어 as_service 값을 리턴해준다.

<src/main/kotlin/Main.kt>

fun main() {
	...
 
    // c언어 처럼 변수를 초기화 해줘야 함
    var as_service : Array<AS?> = arrayOfNulls<AS>(1)

    // json 파일 오픈
    as_service = loadJsonFile(path)

    // java랑 다르게 변수는 무조건 초기화 해줘야함
    for (index : Int in 0 until as_service.size) {
        println(as_service[index])
    }   
    ...
}


/**
 * (1)
 * loadJsonFile : 다음은 json 파일읇 불려오는 메서드 입니다.
 * parameter : 경로
 * return : as_service 값, json 파일을 AS 객체에 삽입합니다.
 */
fun loadJsonFile(
    path: String
):Array<AS?> {
    // call-by-reference 지원 하지 않아 여기서 지원 후, as_service 만 리턴
    var as_service : Array<AS?> = arrayOfNulls<AS>(1)

    // java와 다르게 변수는 무조건 초기화 해줘야 됨:
    var jsonArray = JSONArray();

    //https://www.techiedelight.com/ko/write-json-to-a-file-in-kotlin/
    try {
        // 파일 읽어오기
        fun getResourceAsText(path: String): String? =
            object {}.javaClass.getResource(path)?.readText()

        jsonArray = JSONArray(getResourceAsText(path))


        as_service = arrayOfNulls<AS?>(jsonArray.length())


        for (index:Int in 0..(jsonArray.length()-1)) {
            var jsonObject = jsonArray.getJSONObject(index)

            // 다음은 as_service 를 각 json을 가공하여 AS 객체에 저장한다.
            as_service[index] = AS(
                jsonObject.getInt("no"),
                jsonObject.getString("name"),
                jsonObject.getString("phoneNumber"),
                jsonObject.getString("asServiceNumber"),
                jsonObject.getString("modelNumber"),
                jsonObject.getString("impsbDesc"),
                jsonObject.getInt("impsbCuzCd"),
                jsonObject.getString("impsbCuz"),
                LocalDate.parse(jsonObject.getString("preferDeliDate")),
                LocalDate.parse(jsonObject.getString("receiptDate")),
                LocalDate.parse(jsonObject.getString("prcsCpltDate"))
            )

        }
    } catch (e: Exception) {
        e.printStackTrace()

    }

    return as_service
}

 

 

 

9. 결과 값

 

 

 

여기서 DB 사용 전 JSON으로 사용하여 샘플 데이터 형식으로 사용하는 방식으로 사용하였습니다.

차후, Spring Boot 나 Ktor에 적용 이후 DB와 연동하여 사용을 할 것이며 이 방식은 단계적으로 나아가기 위해 미리 설정하였습니다.

다음 포스팅 때는 조회 구현 후 신청 시 JSON 쓰는 형식으로 저장하는 형식으로 진행 해보겠습니다.

728x90
반응형
LIST