👩🏫 오늘의 출석
❓열아홉 번째, 9 to 9을 해 본 소감❓
3주 동안 함께한 팀원들과 마지막 진행한 프로젝트 날이었다! 오늘 발표를 진행하며 다른 팀은 어떻게 코드를 짜고 어떤 어려움이 있었는지 알 수 있는 시간이었다. 벌써 팀이 바뀌고 3주가 지났다니.. 자바 기초 씹어 먹기를 목표로 정하며 웃던 날이 아직도 기억나는데 이제 또 헤어질 시간이 되었다.😭 3번의 팀원들이바뀔 때마다다 모두 좋은 팀원들과 만나 기분 상하지 않고 팀 프로젝트를 진행할 수 있어서 너무 감사했는데 또 새로운 팀원들을 만날 시간이 되었다. 제발, 캠프가 끝이 날 때까지 계속 좋은 팀원들과 좋은 기억을 가지고 프로젝트를 진행할 수 있었으면좋겠다. 🙏🏻
📑오늘 학습한 내용
🧩오늘의 알고리즘 :정수 제곱근 판별 🧩
문제 :임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
class Solution {
public long solution(long n) {
long answer = 0;
double sqrt = Math.sqrt(n);
if(sqrt % 1 == 0) {
answer = (long)Math.pow(sqrt + 1, 2);
}
else answer = -1;
return answer;
}
}
Math 클래스에서
sqrt() 함수는 제곱근을 구할 수 있고
pow() 함수는 제곱을 구할 수 있다.
🧩 오늘의 SQL : 흉부외과 또는 일반외과 의사 목록 출력하기 🧩
문제 : DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.
SELECT DR_NAME, DR_ID, MCDP_CD, date_format(HIRE_YMD,'%Y-%m-%d') as HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC
오전에는 Spring 입문 강의를 듣다가 막혀서 그 부분에서 시간을 쓰고 보니 오전이 다 지나가고 발표를 진행할 오후가 되었다.
😎 프로젝트 회고 😎
🗂️ 프로젝트 설명
💪🏻 캠프 관리 프로그램 : 내배캠 스프링 수강생들을 관리하는 프로그램
이번 프로젝트는 모든 팀이 같은 주제를 가지고 드디어 자바를 활용하여 프로젝트를 진행하였다.
기본적인 요구사항은 정의 되어 있었으며, 필수 요구사항과 추가 요구사항으로 나누어져 있었고 중간중간 조회 형식은 자유롭게 팀원의 재량으로 진행되었다.
우리 팀은 일단 필수 요구사항을 각자 한 파트씩 맡고 완성되는 상황을 보고 추가 요구사항을 구현할 수 있으면 진행하기로 하였고, 다행히 팀원들이 각자의 파트를 잘 진행해 준 덕분에 추가 요구사항까지 다 끝낼 수 있었다.
캠프 관리 프로그램은 크게 수강생 관리 파트와 점수 관리 파트로 나누고 그 안 세부적인 기능을 구현하도록 진행되었다.
-- 필수 요구 사항 --
수강생 관리
1. 수강생 등록
2. 수강생 목록 조회
점수 관리
3. 과목과 회차별 점수 등록
4. 점수 수정
5. 특정 과목 점수 조회
-- 추가 요구 사항 --
수강생 관리
1. 수강생 정보 조회
2. 상태별 수강생 목록 조회
3. 수강생 삭제 및 해당 점수 삭제
점수 관리
4. 수강생의 과목별 평균 등급 조회
5. 특정 상태별 수강생의 필수 과목 평균 등급 조회
🛠️ 기술 스택
🔊 협업 툴
Git, Github, Miro, Notion, Zep, Slack
🪄 구현 기능
- 수강생 관리
- 수강생 등록 및 과목 선택, 수강생 정보 수정 등 수강생의 전반적인 정보를 관리
- 수강생 등록하기 - 등록할 수강생의 이름을 입력 받아 ID 값을 부여 함, 조건에 맞게 최소 3개 이상의 필수 과목과 2개 이상의 선택 과목을 필수적으로 입력 받도록 함.
- 수강생 아이디 검색 - 수강생의 ID를 찾을 때 사용하는 기능으로, 수강생의 이름을 입력하면 해당 이름을 가진 ID 값을 전부 보여주는 기능 ⇒ 우리팀이 개인적으로 추가한 기능
- 수강생 전체 목록 조회 - 1번 기능을 통해 등록된 모든 수강생의 정보(이름, ID, 상태, 선택한 과목)를 출력함.
- 수강생 상태별 목록 조회 - GREEN, RED, YELLOW 3가지의 상태별로 수강생을 조회할 수 있는 기능 ⇒ 기본적으로 수강생을 등록할 때 GREEN으로 저장되어 있으며 상태 변경을 원한다면 아래의 5번 기능에서 수정할 수 있음.
- 수강생 정보 수정하기 - 선택한 수강생의 이름 또는 상태를 변경할 수 있는 기능.
- 수강생 삭제하기 - 저장되어 있는 수강생을 삭제하는 기능으로 수강생을 삭제하면 해당 수강생의 점수 기록도 함께 삭제되도록 함.
- 점수 관리
- 수강생의 시험 점수 등록, 회차별 등급 조회, 점수 수정 등 점수와 관련된 전반적인 부분을 관리
- 수강생의 과목별 시험 회차 및 점수 등록 - 점수를 등록할 수강생이 선택한 과목 중 한 과목을 선택하여 회차와 점수를 입력할 수 있음. 이때 점수를 입력하면 자동으로 등급이 추가되어 저장됨.
- 수강생의 과목별 회차 점수 수정 - 점수를 수정할 수강생의 ID를 입력하면 저장되어 있는 점수 목록을 출력해줌. 이를 보고 수정할 과목의 ID와 회차를 선택하고 수정할 점수를 입력 받아 저장함.
- 수강생의 특정 과목 회차에 대한 등급 조회 - 2번 기능과 마찬가지고 조회하고 싶은 학생의 ID를 입력 하면 해당 학생이 수강중인 과목을 보여줌. 이를 보고 조회할 과목의 ID와 회차를 입력 하면 성적을 출력함.
- 수강생의 과목별 평균 등급 조회 - 평균 등급을 조회하고 싶은 학생의 ID를 입력하면 해당 학생에 점수가 등록되어있는 모든 과목별 평균 등급이 출력 됨.
- 상태별 수강생들의 평균 등급 조회 - 현재 상태별 수강생의 인원수를 볼 수 있도록 출력해줌. 이후 조회하고 싶은 상태를 입력 하면 상태별 필수 과목의 평균 등급을 조회할 수 있음.
🏹 트러블 슈팅
구조 변경 부분
-
Student 객체에서 Map으로 관리하려고 하였으나 Student 객체에 의존적인 코드 작성이 이루어져서 Score를 따로 관리하는 scoreList를 생성
-
상태별 수강생을 조회하는 메소드 구현할 때 studentList에 stream을 활용해서 구현함
문제점 : filter에 조건을 걸고 forEach로 출력을 하면해당 상태의 수강생이 없는 경우를 찾아내지 못함. filter 조건 이후에 findFirst() 메소드를 사용해서 list가 비었는지 객체가 있는지 확인 하려고 했더니 forEach를 적용하지 못함
해결 방법 : 결국 stream을 사용해서 studentStatusList(조회하려는 상태와 같은 학생들)를 List로 추출하고.isEmpty() 메소드를 활용해 List가 비어있는지 확인하고, 비어있지 않으면 수강생들을 출력함
-
특정 과목에 대한 grade를 조회할 때 학생 ID와 과목만 입력 받아 선택한 과목의 모든 회차의 성적을 출력하도록 구현함
문제점 : 1회차부터 차례대로 성적을 입력하지 않으면 성적 조회가 되지 않는 문제가 발생
해결 방법 : 학생 ID와 과목은 물론 회차까지 선택을 하여 그에 대한 Grade를 출력하도록 수정함
-
점수를 수정할 때 GradeCalculator의 calculateGrade 메소드를 호출하지 않고 구현함
문제점 : 점수를 수정할 때 등급(Grade)이 자동으로 업데이트되지 않아, 점수와 등급이 다른 경우가 발생
해결 방법 : 점수를 수정할 때, 새로운 점수에 대해 자동으로 등급을 계산하도록 GradeCalculator의 calculateGrade 메소드를 호출하여 새로운 점수를 입력 받은 후 점수를 Score에 설정하고, 동시에 계산된 등급도 Score에 설정되게 하였고, setScoreAndGrade라는 하나의 메소드로 점수와 등급 계산 및 업데이트를 한번에 처리하도록 수정함
🤗 좋았던 부분
- App class를 분리한 것
– App 클래스에 수강생 관리, 점수 관리 메서드를 작성하였고 모든 코드를 다 작성하고 나니 600줄이 넘는 코드와 순서가 엉망인 상태로 코드들이 App 클래스에 작성되었다. 코드 동작에는 문제가 없었지만, 가독성 및 관리의 용이성 등을 생각해 팀장님께서 용도에 맞게 메서드를 분리하자고 제안하셨고, 말씀대로 용도에 맞게 분리를 하니 한눈에 봐도 어떤 코드들이 어느 클래스에 위치하고, 동작하는지 알 수 있게 되어 너무 좋았다. 또한 이런 식의 피드백을 주고받을 수 있었다는 점이 좋았다.
- GitHub 사용시 이슈를 생성하여 브랜치를 연동하여 사용한 것
– 개인적으로 GitHub를 사용해 본 지 얼마 안 돼서 이슈 기능을 어떻게 사용하는 건지도 모르고, 다른 팀원들도 비슷한 기초 지식 수준으로만 GitHub를 사용했었는데 이번에는 팀장님께서 이슈를 생성하는 방법과 관련 템플릿을 미리 만들어주셔서 이슈를 생성하고 PR를 작성하는 데 큰 어려움 없이 사용할 수 있었다.
- GitHub 코드 리뷰 기능을 사용한 것
– 이 부분은 좋았던 점이자 아쉬웠고, 그래서 다음 팀 프로젝트 때는 개선하고 싶은 부분이기도 하다. 바로 PR을 하고 다른 팀원들이 내가 올린 코드를 보고 코드 리뷰를 해주는 것이었다. 거의 팀장님께서 주로 코드 리뷰를 해주셨는데, 어느 부분에서 수정이 필요한지, 어떤 점이 부족한지를 바로바로 내가 작성한 코드와 함께 볼 수 있어서 너무 좋았다.
😣 아쉽다고 생각한 부분 & 🤔 개선하고 싶은 부분
- GitHub 코드 리뷰를 모든 팀원들이 활발하게 진행해주었다면 어땠을까?
– 위에서 말했던 좋았던 점도 있었지만 아무래도 팀장님께서만 주로 이 기능을 사용해 피드백을 해주셨기 때문에 다른 사람들의 의견을 알 수 없었다는 점이 아쉬웠다. 물론 나도 코드만 보고 리뷰를 해줄 실력이 아니라 다른 팀원들의 코드를 보고 리뷰를 해주지 못한 점이 많이 아쉬었다. 다음 팀 프로젝트 때는 나도 코드 리뷰를 열심히 해주고 싶다. 그러기 위해선 실력을 많이 키워야겠다.
- 예외처리(try-catch)를 더 열심히 각자 파트마다 했으면 어땠을까?
– 사실 코드 짤 때 내 코드 요구 사항과 다른 팀원의 코드를 사용해서 작성해야 한다는 부분에 정신이 팔려서 예외 처리는 생각도 하지 못했었다. 거기다 일단 기능을 먼저 작성하고 시간이 남으면 예외 처리를 하자고 해서 코드 작성하고 오류 없이 동작할 수 있도록 하는 데에만 초점이 맞춰져 있었다. 동작을 해보면서 '이런 부분에 예외 처리가 있으면 좋겠다, 나중에 예외 처리할 때 다시 좀 더 생각해 봐야지!' 하고 가볍게 넘어갔는데 예외 처리까지는 할 시간이 없어서 결국 진행하지 못한 점이 많이 아쉬웠다.
- 튜터님께 찾아가 이런저런 여러 조언들을 많이 들었으면 어땠을까?
– 처음에 미로로 구조 틀을 잡을 때, 우리끼리 진행한 것을 바탕으로 튜터님께서는 어떻게 생각하는지에 대한 의견을 들어보았으면 어땠을까 하는 점이 아쉬웠다. 워낙 팀원들끼리 큰 오류 없이 각자의 파트를 잘 진행해서 튜터님께 도움을 받을 생각을 거의 하지 못했다. 코드가 잘 동작해도 우리가 작성한 코드가 다른 사람들의 시선으로 보았을 땐 어떤지, 개발자의 시선으로 보았을 때는 어떤지에 대한 피드백을 받아보지 못한 점이 아쉽다. 다음 팀 프로젝트 때는 튜터님께 열심히 찾아가 이런저런 조언을 들어보는 것도 좋을 것 같다.
- 추가적으로 Stram을 사용하는 것은 좋지만 언제, 어디에 사용하는지를 제대로 알고 적절하게 사용했으면 어땠을까? 하는 팀원의 의견도 있었다.
💞 이번 팀 프로젝트를 통해 내가 배운 것
- GitHub 이슈 생성과 연관하여 브랜치 생성
- 이슈를 생성하는 방법과 이슈를 생성할 때 템플릿을 미리 지정해 두면 모두가 같은 틀을 가지고 이슈를 생성할 수 있다는 점을 알게 되었다. 또한 이슈를 생성하여 #이슈 번호로 브랜치를 생성하면 이슈와 브랜치가 연동되어 이슈에서 브랜치와 연동되어 코드를 볼 수 있다는 점도 새롭게 알게 되었다. GitHub는 배울수록 재미있는 기능들이 참 많은 것 같다. 프로필 꾸미는 것도 그래서인지 더 재미있었다. 또한 인텔리제이에서 다른 팀원의 브랜치에 있는 코드를 pull 해보는 것도 이번 팀 프로젝트에서 처음 해 보았다.
- 다른 팀원들이 작성한 코드를 이해하고 사용하는 것
- 그 전 프로젝트들은 아무래도 본격적으로 백엔드 관련해서 진행한 것이 아니라 본격적인 시작 전에 프론트 쪽 기술을 가지고 프로젝트를 진행한 것이라 각자 파트를 가지고 디자인하는 것에 조금 더 초점을 맞춰져 있었지만, 이번 프로젝트부터는 자바를 배워서 진행한 본격적인 프로젝트의 시작이었다.
- 그래서 자바의 객체 지향적인 부분들을 사용하여 코드를 작성해야 하고 파트 별로 서로 유기적으로 연결되어 있어 내 파트만 이해하고 코드를 작성하면 끝나는 것이 아니라 다른 팀원들이 작성한 코드를 이해하고 메서드 등을 가져와 사용하며 코드를 작성해야 했다. 아무래도 다른 팀원이 작성한 코드를 보고 이해하고, 내가 필요한 부분을 뽑아와 사용해야 해서 처음 시작할 때는 걱정이 많이 되었다. 지금 내 실력으로 그게 가능할까, 다른 팀원이 작성한 코드를 이해하고 사용할 수 있을까? 했지만 다행히 큰 무리 없이 프로젝트를 진행하여서 너무 다행이었다!