2024. 3. 5. 22:48ㆍGithub 프로젝트/AS 서비스 프로젝트
지난 포스팅에서는 kotlin 환경 설정을 진행 하였고,
이번 포스팅은 사용자 정보 입력, 조회 구현을 진행 하도록 하겠습니다.
Chapter02 부분 참조
https://github.com/BerkleyLim/AS_process
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 쓰는 형식으로 저장하는 형식으로 진행 해보겠습니다.
'Github 프로젝트 > AS 서비스 프로젝트' 카테고리의 다른 글
[AS 서비스 개발] 1. Kotlin 백엔드기반 AS 개발 프로젝트 시작 (0) | 2024.03.03 |
---|