기본키는 즉,프라이머리 키는 해당테이블의 식별자 역할을 합니다. 바로 이 제약조건으로테이블에 하나만 지정할 수 있습니다. 예를 들면, 사람을 식별할 때는 사람의 이름 대신 주민등록번호를 사용합니다. 그 이유는, 바로 유일한 성질을 가지고 있기 떄문입니다. 이렇게 중복성이 없는 유일성을 가진 성질을 의미합니다. 그 중 사용자가 선택한 것을 기본키라고 할 수 있습니다.
유니크 키는 유일성을 가지기 위해 설정한 것입니다. 따라서 지정이 되면중복이 되는 것을 제어하는 역할을 하게 됩니다. 에를 들면 회원 이름을 중복으로 설정하지 않게 하는 것입니다. 중복되는 이름의 경우에는 뒤에 숫자를 붙여서 최초의 한 사람만 기입할 수 있도록 하는 것입니다. 결국, 프라이머리 키는 유니크 키의 성질을 포함하는 것을 알 수 있습니다. 그 중에, 설계자가 기본적으로 선택한 키라고 할 수 있습니다. 유니크키는 하나의 테이블에 각각 컬럼마다 지정이 가능합니다. 그러나 프라이머리키는 오직 하나만 설정할 수 있습니다.
2️⃣ 댓글 좋아요 수만 오르고 좋아요 취소는 되지 않는 에러*
원인) 쿼리문에서 findByUserIdAndUsername 이라고 명시했지만, ()안 매개변수값 순서를 거꾸로 입력
해결) 올바르게 순서 정렬 후 정상 작동
3️⃣ 유효성 검사가 정상적으로 수행되지않지만 에러없이 통과*
원인) Build.gradle 파일 내부 dependencies 설정에서 상위버전 valid dependency와 하위버전이 동시에 존재할 경우 dependency간 충돌이 있어 애플리케이션은 에러는 없지만 유효성 검사가 진행되지 않음
해결) 사용되지 않거나 중복으로 설정되어진 dependency를 주석처리 또는 삭제하는 것으로 정상적으로 유효성 검사 수행
4️⃣ AWS S3 서버 이미지 업로드 불가
문제) S3에 이미지가 로컬에만 저장되고 S3로 convert 되지 않음
원인) 추측 - ACL(액세스 제어 목록) 권한설정 문제
해결) 추측 - 모든 사람(퍼블릭 액세스) 부분에 객체에 나열 권한을 부여
5️⃣ 예외처리 부분*
문제) 모든 에러의 상태코드가 200번으로 반환됨
원인) MsgResponseDto로 customException 부분의 메세지부분만 return이 되고 Httpstatus 코드는 반환이 안되고 있었기 때문에 발생함
해결) 반환타입을 ResponseEntity로 감싸고 HttpStatus 상태코드도 같이 반환하는 방식으로 변경
6️⃣ CORS 에러*
문제) api사용시 cors 에러
발생원인) CORS설정을 하지않아 프론트 3000포트에서 백 8080포트의 자원요청 불가
해결) 서버에서 CorsConfigurationSource를 통한 CORS 설정으로 해결
(추가 해결 방안)
@CrossOrigin 어노테이션 사용 컨트롤러 또는 사용할 메소드에 어노테이션을 추가
WebMvcConfigurer 설정스프링 프로젝트를 생성하면 @SpringBootApplication 어노테이션이 적용된main함수에서WebMvcConfigurer 을 @Bean으로 등록하여 Cors매핑을 추가
7️⃣ 토큰이 삭제되지 않아 토큰 만료 메세지가 계속 뜨는 에러
문제)만료된 토큰을 계속 들고 있어서 만료되었습니다 메세지가 계속 뜸
원인)토큰 값이 만료되면 자동적으로 토큰 값을 삭제 해줘 야 되는데 계속 남아있음
해결)localStorage.removeItem("token")을 이용하여 status 401 이 뜰 때 if문을 사용하여 제거함
8️⃣ json 에러
문제)서버로 데이터를 전송할 때 json문자열로 보내야 하는데 변환되지 않는 에러
원인)"Content-Type": "application/json”이 담긴 config를 헤더 값에 넣어주지 못함
해결)config 만 해준 곳에 {headers : config} 를 넣어 직접 명시를 해줌으로써 해결
※ 그 외 트러블슈팅 해결 방법 - 프론트엔드 리엑트 코드는 잘 몰라서, 아래와 같이 스프링에 System.out.pringln 을 사용하여 들어가는 값을 확인해 주면서 에러 체크를 하기도 했다.
※ 아쉬웠던 부분 / 정리 💡
협업은 의사소통이 정말 중요하다. 특히 API 명세를 잘 작성하고 수정이 될 때마다 업데이트를 해줘야 한다.
각 파트가 서로의 기능이 완성이 될 때마다 공유를 하며 맞춰가는 과정이 필요했는데 나중에 한꺼번에 합치려다보니 더 힘들었던 것 같다. 완성된 기능끼리는 바로바로 합치는 과정이 필요하다.
1. 어려웠던 부분: 첫 협업 프로젝트로 프론트엔드 3명, 백엔드 3명이 팀이 되었다. 그런데 프로젝트 시작 후 프론트엔드 두 분이 갑자기 하차하시게 되면서 처음에 기획했던 스코프를 축소해야 하는 상황이 되었다. 어려운 상황 속에서 하는 데까지 협업을 경험할 수 있는 걸로 이번주 목표를 변경했다. 백엔드끼리의 협업은 이미 지난주차에 경험한 터라 크게 어려운 부분이 없었는데, 프론트엔드와 붙이는 과정에서 생각지 못한 에러도 많이 터지고 특히 API명세와 다르게 작성된 코드들 때문에 그 부분을 수정하느라 고생을 많이 했다.
2. 느낀 점 : 어느 분야나 커뮤니케이션이 정말 중요하다는 것을 느낀 한 주 였다. 조금 과하다 싶어도 좋으니 자주 팀 회의를 통해 서로의 작업 상황을 확인하고, 수정된 부분을 바로바로 업데이트하는 게 정말 중요한 것 같다.
3. 새로 알게 된 내용: CORS해결 방법, 프로젝트 기획은 어떻게 진행되어야 하는지 ( 주제선정 - ERD/API - 기능분배 - 합쳐보기 - refactoring - 프론트엔드와 합치기 ... ), 그리고 프론트엔드와 기능별 작업이 완성되는 대로 미리미리 붙이는 작업을 해야 한다는 것을 배운 한 주였다.
4. 이번주 잘한 일: 이번주에 총 다섯 분이 하차하면서 41명으로 시작했던 b반이 23명이 되었다. 내가 나를 끊임없이 의심하고 다시 멘탈을 잡고 그렇게 끌고 왔던 49일. 항해 99를 시작으로 제로베이스로 시작해 지금까지 살아남은 사람들이 점점 줄어드는 걸 보면서, 이번엔 마음이 진짜 씨게 흔들렸다. 그래서 기술매니저님과 면담을 했다. 답정너지만 잘하고 있다는 말을 듣기 위해 찾아갔다. 스스로 의심이 들 때마다 지난주의 나와 이번주 나를 비교하면서 멘탈을 잘 잡자.
1. 어려웠던 부분: 오늘은 내가 맡은 기본 CRUD작업을 마무리하고 S3 업로드 후 수정하는 작업을 맡아서 진행했다. 오늘 점심부터 몸 컨디션이 급격하게 좋지 않아 자리에 앉아있는 것 자체가 너무 힘들었다. 팀원들에게 양해를 구하고 한시간 정도 쉬고 약먹고 다시 맡은 부분을 진행했다. 몸이 안좋으니 S3를 이용해 사진을 여러장 수정하는 코드를 짜는게 더 어렵게 느껴졌다. 결국 나중엔 팀원들의 도움으로 같이 화면공유를 하면서 코드를 완성 할 수 있었다.
2. 느낀 점 : 확실히 팀원들이랑 같이하면 막힌 문제도 답이 보이는 것 같다. 내가 놓치고 있던 부분을 다른 팀원들이 봐줄 수 있어서 좋은 것 같다.
3. 새로 알게 된 내용: 지난 프로젝트땐 S3로 이미지를 한장만 업로드하는 작업을 했는데, 이번엔 여러장 등록하는 작업으로 확장했다. 개별 수정까지는 구현 못했지만, List<>를 이용해 다중 이미지 업로드하는 법을 배웠다. 업로드 부분을 다른 팀워분이 작업해 주셨는데, 덕분에 어떻게 구현해야 하는지 배울 수 있었다.
4. 셀프칭찬 (오늘 잘한 일): 몸 컨디션이 안좋았지만, 그래도 맡은 부분을 마무리한 나 칭찬한다.
1. 어려웠던 부분: 클론코딩주차가 시작되었다. 현재 프론트엔드분들의 수가 부족해서 일주일 만에 두 명이 감당할 수 있는 스코프를 잡아야 했다. 기획회의를 통해 카톡과 슬랙과 같은 웹소켓을 이용한 채팅으로 갈 것인지 아니면 오늘의 집이나 에어비엔비, 마켓컬리와 같은 이커머스 서비스로 갈 것인지 고민을 하는데 시간이 좀 걸렸다. 프론트엔드분들의 UI 작업 수고를 덜어드리기 위해선 채팅서비스가 좋지만, 그걸 선택하기엔 백엔드에서 시도할 부분이 너무 없어서 결국 에어비엔비로 클론코딩을 진행하기로 했다.
2. 느낀 점 : 확실히 지난주에 머리가 깨져보니 이번주는 지난주보다 훨씬 수월하게 진행이 되는 느낌이다. 지난주의 실수를 반복하지 않기 위해 백엔드에서 먼저 API 명세 기본을 작성하고 다시 한번 프론트엔드 분들과 같이 API 명세를 수정하는 과정을 진행했다. 백엔드팀에선 서로 각자 맡은 부분을 테스트하기 편하게 로그인/회원가입 그리고 시큐리티 부분, 예외처리와 같이 전역적으로 사용되는 부분은 기본 세팅작업을 같이 진행했다. 역시 실수하고 깨져보는 경험이 중요한 것 같다.
3. 새로 알게 된 내용: 클론코딩을 위해 다양한 사이트들을 구경하면서 예전에는 보이지 않던 세세한 부분들이 보이기 시작했다. 예를 들면, 에어비엔비 같은 경우 로그인/회원가입 모달창이 따로 분리되지 않고 로그인 또는 회원가입으로 하나로 진행된다. 그리고 지도를 클릭했을 때 내 주변 숙소 정보가 뜨는데 도대체 어떻게 구현하는 걸까.... 예전엔 생각 없이 편하게 이용하던 서비스들이 알고 보니 복잡하고 견고한 설계로 만들어져 있다. 과연 나도 이런 아키텍처를 고안할 수 있는 날이 올까?
4. 셀프칭찬 (오늘 잘한 일): 오늘 각자 맡을 부분을 나누는데, 사실 마음 같아선 새로운 기능에 도전하고 싶지만 다들 마음이 그러하고 누군가는 지금까지 해왔던 기본 CRUD 작업을 맡아야 했다. 내가 기본 CRUD를 맡게 되었는데, 최대한 빨리 작업을 마치고 새로운 기능을 시도해 보려 한다. 배우려고 하는 나의 자세 칭찬해 ~_~
5. 내일 할 일: 내가 맡은 부분 끝내기 + S3 공부하고 맡은 부분 (S3적용 후 글수정) 마무리