오늘의 Troubleshooting
쁘띠 TFT 프로젝트
Insomnia 생성 및 공유
- API 명세서를 작성한 김에 Insomnia를 이용한 입력들을 일괄작성하여 팀원분들께 배포하면 좋을 것 같아 시작했다
- 작성한 http request를 Collection채로 보내기! (Json파일)
- 보낸 파일에서 필요한 세팅을 알려드리고 작업을 마쳤다
API 명세서 수정
- 기존에 response[Error] 를 통해 경우에 따른 에러 메시지를 정리 해두었는데..
=> 이중 중복되는 에러 부분들은 중복표시를 하여 API 구현 때 무시하도록 표시를 해주었다!
(유효성 평가와 인증 미들웨어를 구현하기로 하였기에!)
팀 배치 API 생성
- 입력을 배열로 받기에 이를 for문을 통해 반복해가며 추가 유효성 평가를 진행해보기로 했다.
for (let i = 0;i < formation.length;i++) {
// 유효성 평가 미들웨어로 챔피언 배열 받아올 예정
const agent = await prisma.agents.findFirst({ where: { name: formation[i] } })
myAgent[i] = await prisma.myAgents.findFirst({ where: { name: formation[i] } })
// 보유 챔피언 확인
if (!myAgent[i]) return res
.status(400)
.json({errorMessage: `${formation[i]}(은)는 현재 보유한 챔피언이 아닙니다.`})
if (agent.position === "tanker") {
tank = true;
}
}
- 탱커가 1명이상 있어야되는 조건을 충족 시키기위해 변수를 만들어서 제어 하였다
//선언부에 추가
let tank = false;
//for 문 내부에 추가
if (agent.position === "tanker") {
tank = true;
}
- 팀 편성 시, 같은 팀 소속이 2명 이상일 경우,
시너지 효과가 있는 것을 나타내기 위해 시너지들을 모아 중복되는 값만 읽게 만들었다
//Set() 으로 중복값 제거 효과 + join()으로 괄호 삭제 및 || 연산자로 없을 경우 none 사용
const synergy = [...new Set(myAgent.map(e => e.synergy).filter((e,idx,arr) =>{
if (idx !== arr.indexOf(e) && arr.indexOf(e) !== -1)
return true
else return false
}))].join("") || "none"
대표 캐릭터 설정 API
- 이 경우 팀 배치 API의 단수형이기에 쉽게 수정하여 만들었다… 인줄 알았는데..?
const { agent } = req.body;
const { key } = req.params;
const myAgent = await prisma.myAgents.findFirst({ where: { name: agent } })
// 보유 챔피언 확인
if (!myAgent) return res
.status(400)
.json({ errorMessage: `${agent}(은)는 현재 보유한 챔피언이 아닙니다.`})
// 저장
const updateUser = await prisma.users.update({
where: { userKey: +key },
data: {
favoriteAgent: +myAgent.agentKey,
}
})
// 반환
return res
.status(201)
.json({
message : "대표 챔피언이 변경되었습니다.",
favorite: myAgent.name
})
-
대충 문자열을 JSON으로 구문 분석할 때, 이 문자열이 유효한 JSON이 아닐 때 뜨는 에러라고 한다..
=> 자세히 입력 값을 훑어보니 “ 대신 ” 문자가 들어가 있었던 것이다! (휴..)
유효성 검사 미들웨어 만들기
-
챔피언의 유효성 검사 미들웨어를 구현하기로 했다(그나마 재사용성이 높아서)
-
챔피언 유효성 검사도 name(string) 과 key(int) 값으로 나눠져 함수를 2개를 만들었다
-
기본적인 구조는 이러하다
try {
const agentValues = req.body
// 입력값 할당 (pickup 일때도 있고 agent 일때도 있음)
const agentKey = +agentValues?.pickup || +agentValues?.agent
// 입력값 확인
if (!agentKey || !Number.isInteger(agentKey)) return res
.status(400)
.json({ errorMessage: "선택할 챔피언의 <agent_key>를 입력해주세요" })
const agent = await prisma.agents.findFirst({ where: { agentKey } })
if (!agent) return res
.status(404)
.json({ errorMessage: `<agent_key> ${agentKey}에 해당하는 챔피언은 존재하지 않습니다` })
// 챔프 값 반환
req.agent = agent
next();
//오류들 반환
} catch (err) {
next(err)
}
개선점 분석
- 팀 노션에 하루 일정관리를 위해 목표를 적어두어 각자 역할분배 및 시간조율이 되도록 해야겠다
지식창고
알고리즘 코드 카타
체육복
- 문제
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost,
여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때,
체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
-
조건
-
전체 학생의 수는 2명 이상 30명 이하입니다.
-
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
-
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
-
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
-
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
-
function solution(n, lost, reserve) {
let answer = 0;
answer += n - lost.length
// 중복값 확인 및 삭제 + 정렬
lost = lost.filter((e) => {
if(reserve.includes(e)) {
reserve.splice(reserve.indexOf(e),1)
answer++
return false
}
return true
}).sort()
// 정렬
reserve.sort()
for (let i = 0;i < reserve.length;i++) {
const low = lost.indexOf(reserve[i]-1)
const high = lost.indexOf(reserve[i]+1)
let recive = 0;
if (low >= 0) recive = lost.splice(low,1)
else if(!recive && high >= 0) recive = lost.splice(high,1)
if (recive) answer++
if (lost.length <= 0) break
}
return answer;
}
- 다른 코드 분석
function solution(n, lost, reserve) {
const students = {};
let answer = 0;
// 학생 배열 생성(+ 정렬효과)
for(let i = 1; i <= n; i++){
students[i] = 1;
}
// 도난 / 여벌 학생 일괄 할당
lost.forEach(number => students[number] -= 1);
reserve.forEach(number => students[number] += 1);
// 학생 마다 판정
for(let i = 1; i <= n; i++){
// 여벌 학생과 도난 학생이 -1 관계일 때
if(students[i] === 2 && students[i-1] === 0){
students[i-1]++;
students[i]--;
// 여벌 학생과 도난 학생이 +1 관계일 때
} else if(students[i] === 2 && students[i+1] === 0){
students[i+1]++;
students[i]--;
}
// 분배 완료
}
// 체육복이 1개 이상인 학생들만 확인
for(let key in students){
if(students[key] >= 1){
answer++;
}
}
return answer;
}