# 230530일자
## 공지 - 필독. (2023.05.30 업데이트)
- 작업 시작하기 전에 어떤 브랜치에서 시작해야하는지(어제의 경우 User) 확인해서 check out한번 하고 시작해주세요.
- 컨트롤러 주소명은 a.b.c꼴로 갑니다. 중복 피하기 위해서
- 예를들어 라벨링 관련이면 dolabeling.xxxx꼴로.
- 로그인 관련은 intercepter에서 관리합니다. 주소를 a.needlogin.b 꼴로 만들어주세요.
- 무조건 두번째, .과 . 사이에 needlogin이 존재해야만 인터셉터가 작동합니다.
- https://myhappyman.tistory.com/116
- context.xml파일 업데이트(23-06-05).
## 세션 기록용(위키 올릴필요 없음)
- loginUserID -- 로그인한 유저의 아이디(문자열)
- loginUserIMG -- 로그인한 유저의 프로필 이미지파일(이미지)
- loginUserRating -- 로그인한 유저의 등급. 신용도.
- bundleCount -- 내가 등록한 번들 갯수
- projectCount -- 내가 등록한 프로젝트 갯수
- workingNow -- 작업중인 데이터번호(bigdecimal)
- joinProjectCount -- 내가 조인한 프로젝트 갯수
# 번외 20230521
- 남은 일수가 정확히 한 달 남음. 발표빼면 한 주?
# 계정관련 기능
## 로그인/로그아웃
- 세션을 이용하여 로그인, 로그아웃되도록 작성.
- 세션ID를 이용하여 중복로그인시 기존 로그인한 회원이 튕기도록 설정.
# 할 일
- 게시판 - 1명 나준호
- 자유게시판, 공지게시판, 플랫폼 관련 문의게시판, 데이터라벨링 관련 QNA게시판이 필요.
- 페이지 나눌것을 고려해 주세요. 한 페이지에 글은 15개 정도로?
- 게시판, 댓글, 대댓글 등의 DB는 자유롭게 설계하고 만들어 주세요.
- 자유게시판은 자유롭게 글 쓰는 공간.
- 누구나 글 쓸 수 있음.
- 맨 윗줄에는 플랫폼에서 지정한 공지가 보여야함
- 플랫폼 공지는 업데이트가 뜸하므로 매번 DB를 따로 조회하지 않고 백에서 들고 있어야함.
- 댓글, 대댓글은 자유롭게 누구나 쓸 수 있습니다.
- 공지게시판은 플랫폼 공지를 쓰는 공간.
- 모두에게 보이기 버튼을 체크하면, 자유게시판 등에서 전광판처럼 맨 위에서 모두에게 보여져야 함.
- 관리자 권한을 갖고 있는 사람이라면 수정 가능하고, 위에서 보이는 전광판 공지를 내릴 수 있어야함.
- 플랫폼 문의게시판은 플랫폼 이용 관련 질문하는 게시판. 개인글만 보인다.
- 개인 QNA를 조회 가능하며, 개인 답변을 확인 가능하다.
- 댓글기능은 굳이? 란 느낌이라 댓글은 없애는게 좋을거같습니다.
- 데이터라벨링 관련 QNA 게시판은 데이터라벨링 당 붙어있는 게시판으로 라벨링 참여자만 볼 수 있다.
- ex) 고양이 개 사진 분류하기 관련 QNA게시판에는 이 사진이 고양이인가요? 하고 묻는다.
- 답변은 데이터라벨링 등록자가 답변 가능하며, 모든 라벨링 참여자가 볼 수 있다.
- 실제 데이터가 사진이라면 사진을 보여줄 수 있어야 한다.
- 댓글/대댓글 기능을 통해 유저의 2차질문, 데이터 소유자의 2차답변 또한 가능해야 한다.
- 데이터라벨링 방법에 대한 글은 4번째 게시판의 공지격으로 나오면 좋다.
- 이 글을 작성할 때 이미지를 넣을 수 있도록 해야 한다.
- 이미지를 넣는 방법에 대해 고민해서 페이지를 작성해주세요.
- 다음 사항은 준호님의 원활한 개발을 위해 필요한 사항이니 0522 오전에 만들어 공유하겠습니다.
- User table에 is_admin column
- DataBundle table
- Data table
- 필요하거나 질문 등이 있다면 카톡, 디스코드, 깃헙 등에 자유롭게 남겨주세요.
- 라벨링 필요 페이지 - 2명 - 유성훈, 신용대
- 라벨링 등록 페이지
- 파일 대량업로드 처리. 데이터가 잘 구분되도록 할 것. DB관리가 중요. - o
- 업로드시에는 무조건 공개대상을 only uploaded로 만들고, 관리 페이지에서 변경 가능하도록 할 것. - o
- 공개 대상은 다음과 같음.
- public. 조건없이 모두에게 공개. 1
- advanced. 라벨링 어느정도 한 숙련자에게만 공개. 2
- only accepted. 참여를 요청한 후 데이터 업로드한 사람이 수락했을때 공개. 8
- only certified. 이메일 인증 완료된 사람에게만 공개. 4
- and면 16
- 로직: 16이상이면 and임. 따라서 userinfo ==조건 이어야만 가능.
- 16 이하면 or임. userinfo | 조건 > 0 이면 가능.
- advanced or accepted
- advanced or certified
- accepted or certified
- advanced or accepted or certified
- only advanced and accepted.
- only advaced and certified
- only advanced and accepted and certified
- 작업이 너무 어렵다면 아래의 and들 또는 or들은 구현하지 않아도 됨.
- 오라클은 bitand만 지원되므로 bitor, bitxor을 다음과 같이 정의해줘야함.
```
CREATE FUNCTION bitor(x IN NUMBER, y IN NUMBER) RETURN NUMBER AS
BEGIN
RETURN x + y - bitand(x,y)
END;
```
16이면 and.
bitand(16,access_level) 이 16이면 bitand(bitor(userlevel,8), access_level) = access_level-16 이어야만함.
bitand(16,access_level) 이 0이면, bitand(bitor(userlevel,8), access_level) > 0 이면 됨.
따라서
select * from project_table
where (access_level is not null) and(
(access_level>=16
and bitand(bitor(userlevel,8), access_level) = access_level-16 )
or(access_level<16
and bitand(bitor(userlevel,8), access_level) > 0))
- MyDatas 라벨링 관리 페이지
- 사용자가 업로드한 데이터번들들을 관리하는 페이지. - o
- 데이터 라벨링 현황을 볼 수 있음. - o
- 상세 관리 페이지로 이동 가능. - o
- 특정 데이터번들 상세 관리 페이지
- 데이터 업로더가 접근 가능한 페이지. - o
- accepted 방식의 경우, 참여 요청을 받아주는 페이지가 필요. - o
- 요청시에는 해당 유저의 정보(신뢰점수나 활동량, ID 등)이 노출되어야 한다. - o
- 해당 요청을 받으면 해당 참여자의 나의 라벨링 하기 페이지에 추가된다.
- 거부도 가능. - o
- 유저 id명으로 검색해서 추가하기 기능 가능.
- 참여자를 kick하는 기능도 필요. - o
- 라벨링 등록시 했던 공개대상 설정을 변경 가능. - o
- 데이터 공개 종료후 정산 버튼 누르면 정산해야함.
- 정산은 다른 서버에서 하므로, "정산중"이라고 출력하고, 데이터번들 상태를 정산중으로 바꿀것.
- 참여자 숫자 제한...? 어떻게 하지? 아이디어좀
- 라벨링 데이터 관리 페이지
- 데이터의 비활성화/활성화가 가능해야함. - o
- SQL관련 요청사항
- 특정 데이터번들의 특정 번호가 입력으로 주어졌을 때, 그 번호보다 크거나 같은 값의 데이터 딱 하나만 리턴하는 매퍼 메소드를 추가해주세요. 예를 들어 3번 데이터번들의 5번이라고 주면 6번(비활성화 상태면 7번)을 주는 식으로.
- 데이터번들 넘버, 숫자 두개 a,b가 입력으로 주어졌을 때, 활성화된 데이터중 a 또는 b 이상의 데이터들에서 상위 하나만 리턴하는 쿼리를 짜 주세요. ex) 3,7,2면 3번 데이터번들에서 7번 데이터가 활성화 상태면 7번을, 아니라면 2번, 그것도 아니면 3번, ... 의 방식으로.
- 라벨링 하기 페이지 - 2명 - 이미주, 박아멘
- 라벨링 할거 찾는 페이지
- 라벨링 할 수 있는 데이터번들을 볼 수 있다.
- accepted조건을 제외하고 다른 조건에 맞으면 조회 가능하다.
- accepted의 경우에는 join하기를 누를 수 있어야 한다.
- 페이지를 넘길 수 있어야 한다.
- 카테고리에 따라 나눠진다.(분류, 명명 등) - 제어역전을 이용하여 카테고리 신설 가능하면 좋을지도.
- 내가 하다만/한 라벨링 페이지 / 라벨링 히스토리?
- DB구성을 (User, dataBundle), status, settlement,
- 내가 참여한 데이터번들들을 관리할 수 있다.
- 더이상 접근 불가능한 완료된 데이터는 정산전/중/완료로 나누어지며, 완료시에는 평점이 나와야 한다.
- accepted는 수락대기 상태로 있어야 하며, 거절되었다면 거절됨으로 재요청 버튼이 있어야 한다.
- kick 당한 경우에는 조회만 가능하고, 라벨링 하기는 접근 불가능하다.
- 남들이 조회가능한 개인 라벨링 히스토리 페이지
- 이거는 그냥 개인정보 조회 공개버전 느낌이라
- 라벨링 하기 페이지
- 프론트적 요소가 크다.
- 요청시 DB에 상황에 맞춰 업데이트하는 요청이 되도록 짤 것.
- 다양한 라벨링 종류에 대한 답변을 만들어야함.
- 라벨링 페이지 요청시 어떤식의 라벨링인지에 대한 정보를 담은 페이지가 가도록 짤 것.
- 모두고려하기가 되면 머리아픔.
- 사실 라벨링 종류를 불문하고, 데이터-라벨 쌍으로 구성만하면 되긴 합니다.
- file01, "['dog', 'cat']", Park
- 불특정 다수의 작업자가 할 수 있는 작업 위주로 라벨링 가능하게. 전문가가 가능한건 우선순위가 많이 뒤쳐진다.
- 구현해야 할 것
- DAO
- 1. getFileName - 대충 요청시 DB에 정보조회 => 데이터가 공개되었는가? 세션이 접근 가능한, 유효한 세션인가? 다음 데이터파일 이름을 반환하는데, 이 반환이 다른 사용자의 요청도 반영되어서 파일을 골고루 줘야함.
- DTO
- 어떤 데이터인가? 누가 라벨링했나? 라벨링 어떻게 했나?
- (DataBundle, DATA_NO, worked_by), Label
- 매퍼
- 그냥 구현
- DataDoLabelingMapper.xml(java)
- int addLabelData(LabelData labeldata)
- int addLabelDoList(LabelDoList labeldolist)
- ArrayList\<LabelDoList\> findLabelDoList(LabelDoList labeldolist)
- int updateLabelState(LabelDoList labeldolist)
- 컨트롤러
- 첫 입장시와 버튼을 눌렀을때, 종료 눌렀을때가 다르게.
- 앞부분 프론트단 JSP(이거는 굳이?)
- 입장시 페이지
- 라벨링 내용 입력할것(버튼 또는 input text, 드래그 등)
- 제출하기, 그만두기 버튼.
- 라벨링 결과 정산
- 목표는 1주일 안에 백엔드 구현. 프론트는 없어도 됨.
## DB table 정리
- 게시판 관련(준호님이 스키마 작성해주세요)
- 게시물
- 게시물 번호
- 머리말
- 작성자
- 제목
- 내용
- 첨부 파일
- 작성 날짜
- 댓글
- 게시물 번호
- 댓글 번호
- 작성자
- 작성 날짜
- 내용
- 대댓글
- 댓글 번호
- 작성자
- 작성 날짜
- 내용
- 데이터 등록하는 관점
- DataBundle
- 번들번호 - primary key
- 누가 올렸는가? (index)
- 접근권한
- 주제
- 가이드라인
- 라벨링 방식
- 카테고리(버튼 만들기용)
- 진행상태
**QNA 관련은 준호님이랑 처리할것
- 데이터 번들 접근 신청
- 번들번호
- 접근 요청한 유저
- 위에 두개 묶어서 primary key
- 상태
- Data
- 어떤 번들 소속인가?
- 파일이름 겸 번들내 데이터 번호
- 위에 두개 묶어서 primary key
- 활성화 상태
- 데이터 소모하는 관점
- 라벨한 결과물
- 데이터가 어떤 번들 소속인가?
- 파일이름 겸 번들내 데이터 번호
- 누가 라벨링했나?
- 위에 세개 묶어서 primary key
- 라벨링 결과
- 라벨링 참여
- 누가 참여했는가?
- 몇번 데이터번들인가? (indexing 필요)
- 위에 두개 묶어서 primary key
- 현재 상태는? -> 참여중, 킥당함, 수락요청중, 거부됨, ...
- 정산 결과
- add
- find(사용자 정보를 기반으로 어떤 데이터번들 참여했는지랑 상태어떤지 등 받게.)
- update(사용자의 상태를 변경 가능하게. 사용자가 누구인가와 상태 변경사항을 받고 수정하기.)
라벨링 공개시(누구나 참여가능하면) ProjectSession으로 createDoLabeling(번들넘버)를 호출할것. autowired로 싱글톤패턴이어야만함.
## labeling_do state
0 : 신청대기
1 : 수락
2 : 거절
3 : 밴
4 : 초대
## project_how
0 : 직접 타이핑
1 : 버튼 누르기
2 : 영역 드래그
## data_activation
0 : 비활성화
1 : 활성화
2 : 신고됨
## proejct_progress
0 : uploaded상태 -> 프로젝트 올리긴 했는데 아무도 참가 못함
1 : 진행중
2 : 종료됨(정산)
## 남은 할거
- 전체적인 코드 리팩토링
- index, menu
- 메인페이지에서 인데스 페이지 분리해서 페이지들 include
- 메뉴 바 설정
- 번들 등록 페이지
-
- 번들 관리 페이지
- 번들 관리에서 번들 누르면 바로 라벨링 등록 -> 뭐 할건지 선택으로 변경
- 번들에 마우스 올리면 간단한 설명 노출
- 파일 관리 페이지
- 라벨링 프로젝트 등록
- 라벨링 프로젝트 관리페이지
- 메뉴같은거로 프로젝트 권한 수정하는거랑 라벨링 유저 관리하는거 분리
- 참가자 관리에서 권한 바꾸면 페이지 이동이든 뭔가 이벤트 발생하게
- 라벨링 프로젝트 찾기페이지
- 전체 라벨링 프로젝트에서 권한에 맞게 조회하기.
- 현재 유저의 상태에 따라 조인상태 등을 같이 표시해줄것.
- AJAX 사용할것
- 내가 참여한 라벨링 프로젝트 찾기페이지
- 개인 유저가 참여한 프로젝트를 나열한다.
- 마찬가지로 페이지 따로, 내용물은 AJAX로 따로.
- 정산
- 라벨링 서버쪽에서 project_no 넘겨주면 그거 받아서 db조회해서 인공지능 학습
- 뭐 어떻게 하는건데
- 학습된 인공지능으로 라벨링한 데이터 정산
- 라벨링 이상하게 한 유저 분별
## 나중에 후순위로
- 관리자 페이지
0, 1, 2, 4, 6, 8, 10, 12, 14,
18,20,22 24, 26, 28, 30
servlet-context.xml에 넣어줘야 함
<interceptors>
<interceptor>
<mapping path="*.needlogin.*"/>
<beans:bean id="loginInterceptor" class="com.hiddenlayer.dalabel.intercepter.AuthLoginInterceptor"/>
</interceptor>
</interceptors>
show_labelable_projects.jsp - 용대
내가 할 수 있는거(아직 신청안함)조회하기
reg_labeling + labeling.js - 성훈
라벨링 방법에 대해 버튼추가 등을 할경우와 그렇지 않을 경우 등에 대해 json 생성후 요청하기.
json 양식
버튼일경우
```
'{type:"button",info:["버튼1", "개", "고양이", "car"]}'
```
범위일경우
```
{type:"area"}
```
타이핑일경우
```
{type:"input"}
```
중요한거 - 한글, 영어, 숫자, 띄어쓰기 만 가능.(검증필요)
타입에 따라서 submit하기 직전에 hidden input에 다음을 생성
{
타이핑이나 범위는 쉽고
버튼일경우 일단 type:button 하고
}
if 버튼이면-> button들에 적당한 class붙여서 jquery로 반복문 돌리면서 해당 button들의 특정 값 가져와서 object에 순차적으로 넣어주기. -> v라 하면
obj.info=v 꼴로 추가해서 input에 그걸 stringify해서 넣어주기
어렵나?
버튼 생성은 했나?
생성할때 적당한클래서 .abc를 붙인다고 치면
$(".abc").each((a,b)=>{
여기에서 a가 인덱스이고 b가 obj인데
info[a] = ~~~
})
우리조는 뭘 했나?
- 유저 관련
- 로그인, 회원가입 등 기본적인 기능들
- 인터셉터를 활용하여 로그인상태 권한 체크 및 권한 없을경우 로그인 페이지로 리다이렉트
- 세션리스너 세션 활용을 통한 중복로그인 방지기능
- 파일 관련
- 데이터 압축파일 업로드, 이를 활용한 라벨링 등의 플랫폼 목적에 맞는 기능들.
- 멀티스레드를 활용하여 압축해제가 속도저하가 이루어지지 않도록 함.
- 스레드를 매번 생성/제거하는 것이 아니라, 하나의 스레드에서 할 일을 체크하여 작업하도록 함.
- 라벨링 관련
- 업로드된 데이터 기반으로 라벨링 테마를 생성하여 다수의 이용자가 라벨링 가능하도록 함.
- 하나의 사용자는 하나의 프로젝트에만 참여 가능하며, 사용자를 밴 하는 기능 등을 추가함.
- 다수의 사용자의 요청에 대해서 서버에서 적절히 배분하여 데이터를 넘겨주며, 세션이벤트를 통해서 응답 없이 세션이 닫히는 경우의 데이터에 대한 처리를 함.
- 비트마스킹 기법을 활용하여 라벨링 참여 권한에 대한 처리를 함.
-
- 라벨링 하는 쪽은 백엔드정도만 수행하였습니다.
- DataDoLabelingMapper
- select project_no, project_title, project_requestor, project_how, dolabel_state from
(
select project_no, project_title, project_requestor, project_how, row_number() over (order by project_no desc) as rn
from Labeling_project
where project_no<#{start} and (
(project_access_level is not null) and(
(project_access_level>=16 and bitand(bitor(#{grade},8), project_access_level) = project_access_level-16 )
or(project_access_level<16
and bitand(bitor(#{grade},8), project_access_level) > 0)))
)
left join(select * from labeling_do where dolabel_user=#{userid})
on project_no = dolabel_project_no
where rn<=#{getnum}
갑자기 회원가입, 번들삭제 안됨 -> 나만 그런가?
라벨링 등록도 안됨
■ 인공지능 – 인공지능을 활용한 라벨링 결과 정산, 사용자 신뢰도 평가
■ 데이터 라벨링 - 인공지능을 학습시키기 위한 데이터를 라벨링 할 수 있는 환경 제공
■ 데이터 업로드 - 라벨링에 사용 될 데이터 번들 업로드(압축파일을 업로드하면, 사용자 이름, 업로드한 파일명에 난수화를 더해서 폴더 생성 후 압축풀기)
■ 사용자 차등 관리 - 사용자의 등급을 통해 라벨링 접근 권한 차등 관리
■ 라벨링 관리 - 잘못된 데이터 비활성화, 내가 올린 프로젝트에 참여중인 유저 관리
■ 회원 관리 - 로그인, 회원가입, 회원정보 조회, 수정, 탈퇴(라벨링 관련 데이터가 바로 삭제되는 것을 방지하기 위해 탈퇴 시 휴면계정으로 전환 후 일정 시간 뒤에 삭제)
■ 게시판 - 공지, 자유게시판
■ 데이터 신고 - 잘못된 데이터 발견시 신고하여 업로더에게 보고
### 대충 프로젝트 후기 쓸곳
================
나준호 : 개발이라는 것을 배우고 처음 다른사람과 협업을 해봤습니다. 협업을 하며 몰랐던 기술이나 서투른 기술을 다시 배우고 익히며 프로젝트를 완성하게 되어 만족스러운 경험이였습니다. 이번 경험을 통해 배운 기술과 협업간의 소통 방법을 기반으로 앞으로 더 성장할 수 있는 기회가 되었다고 생각합니다. 부족한 점을 채워준 팀원들에게 감사합니다.
이미주 : 프로젝트를 통해 혼자는 할 수 없을거라 생각했던 것들을 협업으로 완성해나가는 것을 보면서 협업의 중요성을 많이 느꼈습니다. 그리고 진행하는 동안 부족한 점을 많이 느꼈는데 도움을 받아 한걸음 나아갈 때의 기분을 잊지 않고 앞으로도 더 노력을 해야겠다고 생각했습니다.
유성훈 : 협업을 하며 난관에 봉착할 때도 있었지만, 지나고 나니 뿌듯합니다. 기술적으로도 많이 배울 수 있었던 값진 경험이었습니다. 이 경험을 발판 삼아 더욱 성장할 수 있도록 하겠습니다.
select data_no, label_result from labeling_result
where project_no = (select project_no from Labeling_project where project_no=#{project_no} and project_requestor=#{userid})