마신사 프로젝트 8일차 - 2022.12.5 (월)
새롭게 완성한 유저스토리를 토대로 본격적인 화면 구성 설계 작업에 들어갔다.
프로젝트 2일차때 이미 한번 진행했던 작업이었지만 멘토님의 조언을 바탕으로 더 명확하고 자세하게 유저스토리가 수정되었기 때문에 기존의 화면 구성 설계 또한 수정이 필요하였고
수정된 유저스토리에 부합하는 화면 구성에 대한 레퍼런스들을 찾아보며 오전에는 3개의 페이지에 대한 화면 구성을 완료하였다. (확실히 2일차때 한번 설계해본 경험이 있어 처음보다는 빠른 속도로 진행할 수 있었다.)
오후에는 나머지 페이지들에 대한 화면 구성을 완료한 후, 기능 정의서를 작성하여 각 페이지마다 필요한 기능들과 정리하였고 이를 바탕으로 우리에게 필요한 기술 스택들 역시 정리하며 7일차 작업을 마무리하였다.
마신사 프로젝트 9일차 - 2022.12.6 (화)
여태까지 정리해 온 유저 스토리와 화면 구성 설계, 기능 정의서들을 토대로 DB에 필요한 테이블과 각 테이블에 필요한 컬럼들을 정의하며 본격적인 DB 설계 작업에 들어갔다.
프로젝트 2일차 때 한번 진행한 경험이 있어서 처음보다는 순조롭게 진행되었지만 멘토링을 통해 DB 설계의 중요성을 확실히 느꼈던 터라 오전 내내 DB 설계에 대한 회의가 진행되었다.
그렇게 마무리된 내용을 토태로 오후에는 MySQL Wokrbench를 이용하여 DB를 생성하였고 그 뒤에는 API 명세서를 작성하였다.
그러다 회원가입 방식에 대한 문제에 부딫혀 최종적으로 네이버 Open API를 이용한 "네이버로 로그인하기"를 적용하기로 결정하고 이에 대한 레퍼런스를 찾아본 후 8일차 작업을 마무리하였다.
마신사 프로젝트 10일차 - 2022.12.7 (수)
오전에는 강사님에게 조언을 받아 DB를 일부 수정하기로 결정하고 DB 수정 작업을 진행한 뒤 이에 따라 API 명세서도 수정 작업을 진행하였다.
화요일에 API 명세서를 작성할 때는 그냥 기능 정의서에 적힌 순서대로 API를 정리했어서 명세서가 뭔가 뒤죽박죽인 느낌이 들었는데
오늘 명세서를 수정할 때는 DB의 각 테이블 별로 해당 기능에 대한 API를 정리하며 작업을 진행하니 이전보다 수월하게 진행되었다.
그렇게 DB 작업을 마친 뒤, 최종적으로 멘토님에게 DB와 API 명세서에 대한 피드백을 요청하였지만 멘토님의 바쁜 스케줄로 주중에는 피드백을 받기 힘든 상황이라
일단 팀원들 모두 지난주에 수집한 데이터들에 대한 전처리를 진행한 후 지금까지 해온 작업을 바탕으로 본격적인 개발 작업을 진행하기로 결정하여 하루종일 데이터 전처리 작업을 진행하며 드디어 개발 외적인 부분을 마무리하였다. (
데이터들이 다들 제각각이라 전처리하기 매우 까다로웠다..)
마신사 프로젝트 11일차 - 2022.12.8 (목)
어제 개발 외적인 부분을 마무리하여 드디어 본격적인 개발 작업에 들어갔다.
백엔드를 맡은 나는 Spring Boot를 사용하여 먼저 기본적인 MVC 패턴 세팅 작업을 진행하였는데 애초에 DB의 테이블도 적지 않고 컬럼이 꽤 많이 있는 테이블도 있었기에 하루 종일 거의 이 작업만 진행하게 되었다.
MVC 패턴 세팅 작업을 완료한 후 외래키가 엮이지 않은 테이블에 대한 아주 기본적인 CRUD 기능 메소드들 몇개를 구현하며 10일차 작업을 마무리했다.
이날은 오류나 출력에 대한 문제가 없이 코딩이 원활하게 진행되었지만 바로 다음날에 오늘은 예상하지 못했던 이런저런 실수들로 인하여 문제와 오류들이 발생해 곤욕을 치뤘다..
마신사 프로젝트 12일차 - 2022.12.9 (금)
목요일에 CRUD 기능 메소드 구현 중 어떤 메소드들은 JDBC로 DB 쿼리문 작성하기가 복잡하여 골치아팠는데 이에 대한 해결법으로 myBatis를 사용하기로 결정했다.
Spring Boot에서는 MyBatis Framework를 제공하기 때문에 MyBatis 사용을 위한 기본적인 세팅은 수월하게 진행했으나 쿼리문 적용시 외래키 컬럼에 대한 에러 발생으로 인하여 많은 시간을 소요했는데
첫번째로, Spring Boot에서 JPA를 이용하여 Entity 정의시에 DB에 이미 있는 컬럼이 또 다른 컬럼명으로 생성되는 문제를 겪었었다. 원인은 JPA를 이용하여 컬럼명을 카멜케이스로 작성할때 MySQL에서는 해당 컬럼명을 스네이크 케이스로 자동 변환하여 Entity 구조를 생성/수정해주는데
MySQL에서는 breathability라고 입력하고 Spring Boot에서는 breathAbility로 컬럼을 정의하여 DB에 breath_ability라는 새로운 컬럼이 불필요하게 생성되었고 이를 다시 삭제하고 MySQL에서 breathability 컬럼명을 breath_ability로 수정하니 문제가 해결되었다.
두번째로, Image 객체의 외래키 컬럼 데이터인 maskId를 추출하고자 일단 MyBatis에서 select문의 resultType으로 Mask 객체를 지정하니 객체 데이터가 불러와지지 않고 null로만 출력이 되었다.
이를 해결하고자 resultType 대신에 resultMap을 사용하기로 하고 resultMap 정의시 PK는 <id>로 나머지 컬럼들은 <result>로 입력하여 정의하였는데 이 또한 전과 같은 결과가 나왔다...
아무리 고민해도 해결 방법이 떠오르지 않아 강사님께 질문하여 해결 방법을 찾았는데 resultMap 정의시 외래키 관계에 있는 컬럼은 <result>가 아닌 <association>이나 <collection>을 사용해야 한다는 점이었다.
이 또한 외래키 관계 설정에 따라 입력값이 다른데 <association>은 1:1 관계, <collection>은 1:다 관계일 경우 입력해줘야했고 나의 경우에는 1:다 관계였기에 <result>가 아닌 <collection>을 이용하여 컬럼에 대한 정보를 입력하였더니 그제서야 원하는 Mask 객체를 출력할 수 있었다.
여기서 또 다른 문제점이 있었는데 Mask 객체에서 maskId만 추출하여 Image 객체에 저장하려고 했는데 DTO 설정에서 Long maskId가 아닌 Mask mask로 정의해서 Mask 객체가 프론트로 전달되어 maskId 이외의 불필요한 컬럼들의 데이터도 함께 반환되어 문제였다.
다행히 금방 해결법을 찾을 수 있었는데 Image DTO에서 Mask mask를 Long maskId로 수정하여 최종적으로 원하는 결과값을 반환받을 수 있었다.
마신사 프로젝트 13일차 & 정기 멘토링 - 2022.12.10 (토)
멘토님의 바쁘신 스케줄로 인하여 DB 설계와 API 명세서 작성에 대한 조언을 해당 작업을 마친 3일뒤에야 들을 수 있었다. 솔직히 이미 어느정도 개발 작업이 진행된 상태라 문제점이 없기를 바랬는데 치명적인 문제점들을 들을 수 있었는데
첫번째로, 웹서비스를 구현할때 각 테이블의 히스토리(누가 업데이트를 언제 어떻게 하였는지의 내용)를 담은 히스토리 테이블도 추가적으로 만들어줘야 하는데 이 부분은 경력자들이 아닌 이상 생각해볼 수 없는 부분이기도 하고 프로젝트 기간이 그렇게 넉넉하지 않기 때문에 히스토리 테이블에 대한 필요성만을 인지하며 넘어가기로 했다.
두번째로, API 명세서 작성시 Response Parameter를 작성하는 것을 까먹은 점을 지적받았고 웹서비스 구현시 DB에서의 DELETE 메소드는 절대 사용하지 않고 삭제해야 하는 데이터는 DB에서 삭제하는 것이 아닌 따로 컬럼을 만들어 상태를 변경해줘야 한다고 하셨고 회원 아이디와 같이 민감한 데이터에 대한 GET, PUT 메소드 실행시 url encoding을 적용해야 하는 점도 지적하셨다.
세번째로, 우리가 유저들에게 보여주는 결과가 주관적으로 "부드럽다", "까슬거린다"가 아닌 "면 소재입니다"와 같은 객관적인 데이터를 보여줄 수 있도록 데이터의 출력값에 대한 점을 지적받았다.
마지막으로, 모든 API는 Authorization이 필수사항이니 이를 꼭 조사하여 적용하라고 신신당부하셨다.
다양한 문제점을 지적받고 나서 멘토님이 기다려줄 수 있는 1시간 반 안에 해결할 수 있는 점들을 팀원들과 회의하여 수정한뒤 멘토님에게 무사히 컨펌을 받고나서 추가적인으로 Docker와 Swagger에 대한 공부의 필요성을 언급하셨다.
그렇게 멘토링이 끝난 후, Docker는 웹 서비스 구현의 거의 마지막 단계라 판단되어 일단 하루가 마무리되기 전에 Swagger에 대해 구글링해보며 Spring Boot에 Swagger 적용해보기로 마음먹어 세팅을 완료하였지만 에러가 발생하면서 서버가 아예 종료되는 문제를 겪었는데
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 에러였고
Spring boot 2.6 버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser로 변경되면서 몇몇 라이브러리에서 오류가 발생하는 것이 원인이라
application.properties에 spring.mvc.pathmatch.matching-strategy=ant_path_matcher 입력하여 default값을 변경하여 문제를 해결하며 최종적으로 Spring Boot에 Swagger를 적용하여 Swagger UI로 출력하는데 성공하며 하루를 마무리하였다.
'빅데이터 부트캠프 > 팀 프로젝트' 카테고리의 다른 글
마신사 프로젝트 4주차 (빅데이터 부트캠프 116~120일차) (0) | 2022.12.24 |
---|---|
마신사 프로젝트 3주차 (빅데이터 부트캠프 111~115일차) (0) | 2022.12.17 |
마신사 프로젝트 1주차 (빅데이터 부트캠프 100~105일차) (0) | 2022.12.03 |
웹페이지 페이징 및 파일 다운로드 구현 미니 프로젝트 (빅데이터 부트캠프 98~99일차) (0) | 2022.11.25 |
기본 웹페이지 구현 미니 프로젝트 (빅데이터 부트캠프 86~89일차) (0) | 2022.11.12 |
댓글