🍳 더 자세한 내용은 ↑ pdf 파일 참조.
-
성남에서 교육을 받으며 성장과 발전에 대한 목마름으로 시작한 아이디어.
-
개발 공부를 하고싶은데 내가 원하는 스터디를 찾기 힘들다면?
-
COSMOS에서 내가 공부하고 싶은 분야별로 나만의 스터디 를 만드는 것은 물론,
LMS 학습관리시스템 으로 스터디를 효율적으로 관리해보자!
- 2021-12-07 ~ 2021-12-30 (약 1개월, Official) : 교육기관 마감기한
- 2022-01-03 ~ : 팀원들과 추가기능 구현
김철진
/ cheoljin408 : 팀장 및 메인개발자, 코드 형상관리김병준
/ Joonkb : 메인개발자, 개발 리더김서연
/ westkitekim : 메인개발자, 산출물 관리김중혁
/ KimJoongHyeok : 메인개발자, 의사소통 리더이 용
/ nogy21 : 메인개발자, 스터디 리더
- TDD와 Agile 방식을 선택하여 필요시마다 설계, 구현, 테스트를 반복하였다.
💷설계 image(접기/펼치기)
💶레이아웃 및 UI 설계
- 비회원 : 비회원은 메인페이지에서 현재 모집중인 스터디만 확인할 수 있다.
- 회원 : 별도의 회원가입 절차없이 소셜로그인(네이버/구글) 기능을 통해 회원으로 서비스이용이 가능하다.
- 스터디리더 : 스터디를 만든 회원, 스터디를 관리하는 회원
- 스터디원 : 스터디에 가입되어 있는 회원
- 메인페이지에서 등록되어 있는 스터디 정보를 최신순으로 6개 보여준다. 스터디 정보에는 스터디 유형, 사용 언어, 스터디 등록일자, 스터디 리더에 대한 정보가 조회된다.
- 회원상태에서 더보기를 클릭하면 스터디 리스트 페이지로 이동한다.
- 스터디 리스트 페이지 상단부에 스터디 유형, 사용 언어별로 검색할 수 있는 기능이 있다.
- 스터디 리스트 페이지는 페이징 처리가 된다.
- 스터디 카드뷰를 클릭하면 해당 스터디의 상세 페이지로 이동한다.
-
스터디리더 : 스터디리더는 스터디를 개설(등록)하고 수정, 삭제 등 스터디의 전반적인 관리를 할 수 있다.
- 스터디 관리
- 스터디 등록 : 스터디 만들기에서 스터디 이름, 유형, 사용 언어와 소개를 적고 스터디를 새로 만들 수 있다.
- 스터디 수정 / 삭제 : 스터디리더가 자신이 만든 스터디의 상세페이지로 이동하면 스터디에 대한 정보를 수정하거나 삭제할 수 있다.
- 스터디 상세 페이지 : 스터디 카드뷰를 클릭하면 해당 스터디에 관한 자세한 정보를 확인 할 수 있다. (스터디 상세 소개 등)
- 댓글 작성 / 수정 / 삭제 : 스터디 상세 페이지에서 댓글을 작성하거나 수정, 삭제할 수 있다. 댓글의 수정 및 삭제는 작성한 본인만 가능하다.
- 참여신청 관리
- 참여신청 알림 : 내가 개설한 스터디에 어떤 회원이 신청했는지 확인할 수 있다.
- 참여신청 수락 / 거절 : 내가 개설한 스터디에 신청한 회원들을 수락하거나 거절할 수 있다. 알림페이지에서 해당 카드뷰 알람을 클릭 후 모달창에서 수락 / 거부를 할 수 이/ㅅ다.
- 스터디 관리
-
스터디원
- 스터디 참여 신청 : 스터디 상세 페이지에서 스터디 신청이 가능하다.
- 참여신청 알림 : 내가 신청한 스터디에 대한 수락 / 거절 결과를 확인할 수 있다. 만약 스터디리더이면서 다른 스터디의 스터디원이라면 우측 상단의 버튼으로 알림페이지 이동이 가능하다
- 공지사항 작성 : 스터디리더는 공지사항 작성 / 수정 / 삭제가 가능하며 공지사항 등록시 다중 파일 업로드와 다중 이미지 파일 업로드가 가능하다. 공지글을 등록시 텍스트 편집기로 작성할 수 있다.
- 과제 관리 : 스터디리더는 과제 공지글을 작성 / 수정 / 삭제가 가능하며 과제 공지를 할 때 파일과 이미지 다중 업로드가 가능하다.
- 과제 제출 : 스터디원은 과제 공지 게시판에서 댓글로 파일 및 이미지 업로드로 과제 제출이 가능하다.
- 스터디 모집상태 변경 : 스터디리더는 LMS 페이지 헤더에서 스터디 모집상태를 변경할 수 있다.
- 스터디 수정/삭제 : 스터디리더는 LMS 페이지 사이드바에 위치한 스터디설정에서 스터디수정/삭제가 가능하다. 하지만 스터디 모집상태는 그 전에 종료상태일 때만 수정/삭제가 가능하다.
표 펼치기/접기
일자 | 이슈 내용 | 해결 방안 |
---|---|---|
21.12.10 | 오라클(ORACLE)에서 테이블명의 길이 제한 에러코드 ORA-00972 identifier is too long Cause: An identifier with more than 30 characters was specified.Action: Specify at most 30 characters. | 테이블명은 오라클에서 30자로 제한을 하고 있으며 30자를 초과시 오류를 생성할수 있음. Oracle 8 버전대에서는 상관없지만 9버전 이상으로 가면서... Alias가 20바이트(영문20자 한글10자)가 초과하면 상기와 같은 오류가 난다. |
21.12.11 | Oracle PL/SQL if 조건문 c varchar2(200):= '자바'; 를 begin에서 c := '자바'; 로 작성했음에도 에러 | 컨트롤러에서 처리하는 것으로 해결 |
21.12.11 | Git 문제상황 : 파일의 크기가 1MB이상일 경우 에러발생 에러코드 : the remote end hung up unexpectedly | 소스트리에서 자동적으로 push하여 해결완료 |
21.12.12 | Lombok을 사용하여 Getter , Setter를 정의하였고 → 이를 View에서 출력을 하려고 객체의 인스턴스 변수명을 입력하였으나 빨간표시로 제대로된 출력을 할 수 없었음 | 타임리프로 해당 객체의 인스턴스 변수를 출력하기 위해서는 해당 객체의 Getter 메서 드를 사용하게 된다. 하지만 Lombok을 사용하여 의도치 않은 이름의 Getter 메서드가 정의되었고 해당 메서드를 통해서 출력을 할 수 없었음. (eName → EName) |
21.12.13 | Study 관련 Service Interface를 스터디 참가신청, 스터디 게시판 댓글과 같이 관련된 기능을 총체적으로 묶어 Service Interface를 구현할 지, 분화하여 구현할 지에 대한 고민을 하였음 | 기능별로 최대한 분화하여 Service Interface(및 Controller)를 설계한다. 원칙적으로 정해진 것은 아니기 때문에 업무와 서비스의 성격에 따라 결정한다. 하지만 인터페이스가 커지고 메서드 수가 많아진다면 응집도 즉, SOLID원칙 중 단일 책임 원칙(SRP) 을 고려하여 판단해야 한다. |
21.12.14 | resource 폴더 아래 프로젝트명 . mapper 이름으로 디렉토리를 만들어서 mapper.xml파일을 만들면 파일경로를 찾지못함 | resource 폴더 아래 프로젝트명 . mapper 이름으로 디렉토리를 만들어서 mapper.xml파일을 만들면 파일경로를 찾지못함 |
21.12.14 | MyBatis 인스턴스 변수명, 테이블 컬럼명 불일치로 인한 자동참조 에러 | 파라미터 타입을 선언하여 참조 |
21.12.15 | 부트스트랩 카드 정렬 이슈 | css 태그에 모든 div의 정렬(div {} |
21.12.15 | ORA-00911: invalid character, MyBatis 쿼리 작성 중 잘못된 문자 존재. DB에서 작성한 내용을 그대로 사용하여 세미콜론 제거 누락 | 세미콜론 제거를 통해 해결 |
21.12.16 | MyBatis select 쿼리에서 객체안에 여러 객체가 있을 경우 , 클래스 depth가 두 번 이상 있는 경우에 데이터와 객체 자동 매핑이 불가 | resultMap 내부에서 을 사용하여 클래스 depth를 표현. 객체간의 resultmap collection을 사용해서 객체간의 관계를 해결 |
21.12.16 | MyBatis LowerCase 이슈, MyBatis에서 result map을 찾지 못함. | LowerCase 이슈. application.properties에 mybatis.type-aliases-package=org.kosta.finalproject.model.domain, mybatis.configuration.map-underscore-to-camel-case=true 설정 추가 |
21.12.16 | thymeleaf 이슈. 컨트롤러에서 전달한 객체를 타임리프로 사용은 가능했지만, 다시 컨트롤러로 전송하는 과정에서 studyDTO의 인스턴스 변수인 categoryTypeDTO, categoryLangDTO 의 인스턴스 변수( categoryTypeNo , categoryType, categoryLangNo, categoryLangType) 파싱 실패 | 비동기 전송으로 방식을 바꿈 |
21.12.17 | 스터디 상세보기에서 본문 내용을 String으로 출력 실패 CLOB 타입으로 DB에 본문 데이터를 저장하였고, 이를 가져와 사용하는 과정에서 String으로 변환되지 않았음. ERROR: oracle.sql.CLOB@77198f88 | 데이터를 조회하는 과정에서 DBMS_LOB.SUBSTR(column, DBMS_LOB.GETLENGTH(column)) 사용 |
21.12.18 | 자바스크립트 안에서 타임리프 사용할때 유의사항 | <script th:inline="javascript"> 2 |
21.12.18 | html 버튼 링크 이슈. 타임리프에서 버튼에 링크를 제공할 때 기존 html의 onclick=location.href로 이동 불가 | <button type="button" th:onclick=" |