# CRUD

게시글과 사용자 일대다 관계 
게시글과 첨부파일 일대다 관계
게시글과 태그 다대다관계 

댓글 사용자 일대다 관계
댓글 대댓글 일대다 관계 (댓글 하나당 여러 대댓글 가능)
좋아요 싫어요 하나의 댓글에 같은 사용자가 여러번 투표하는 것을 막히 위해서 사용자를 식별 해야 한다.

댓글에 대댓글이 있을 경우 댓글이 삭제 되면 자식은 고아가된다 그래서 데이터에베이스의 논리적 삭제를 사용한다. (삭제 플래그를 남김)
그래서 댓글은 삭제 하고, 삭제되었다는 글을 출력하여 준다.

(more - 3가지 경우 1. 삭제된 댓글이면서 대댓글도 없다. 이때는 아무것도 출력할 필요가 없다.
 2. 삭제된 댓글이지만 대댓글이 있따. 삭제되었다는 글을 표시하고 대댓글은 계속 출력.
 3. 살아 있는 댓글 이다, 자신도 출력하고, 자식 댓글도 계속 출력한다.)

MORE

# 인증과 인가

제가 아는 내용 :  

          인가란, 인증된 사용자가 권한(접근권한 등)이 있는지 확인 하는 것  
          인증이란, 사용자 본인이 맞는지 확인 하는것

 

절차 : 인증 후 -> 인가


- 실생활에서 예를 들면, 어느 연구소에 처음 출근하는 사용자가 출입을 희망 한다고 가정하자, 사용자는 연구소에 처음 왔기 때문에 출입권한이 없다. 이 과정에서 연구소의 직원으로 등록하여 
 
권한을 주는 것이 바로 인가이고, 직원으로 등록 되었기 때문에 출입이 가능하여 이 것을 인증 되었다고 한다.

- 실제 Web 서비스에서 예를 들면,  인증된 사용자가 아니면, 즉 로그인 하지 않은 사용자는 글을 작성하고 수정하고 삭제 할수 없다 또, 인가된 사용자가 아니면(권한이 부여된) 로그인한 사용자라도 글 작성, 수정, 삭제를 할 수있지만 

자신이 작성하지 않은 글도 수정 이나 삭제 할 수있으면 안된다.   

라라벨에 auth middleware, 스프링에 security 내장된 기능을 사용 할 수 있다.

회원가입

가입 확인 절차

- 사용자 등록 폼을 처리할 때, 사용자가 등록한 이메일 주소로 활성화 코드를 포함한 가입 확인 메일을 보낸다.
- 메일에는 가입 확인을 위햇 우리 서비스로 다시 들어오는 URL을 포함하는데, URL에 포함된 활성화 코드로 사용자를 찾아서 사용자 정보를 업데이트한다.
  (URL ex auth/confirm/{code}  , 60바이트 랜덤문자 )

사용자 테이블에 confirm_code와 , 가입 확인 여부(activated) 

즉, 사용자 form 전송 -> (정상적인 값인지 체크 후)  -> 사용자 테이블에 활성화 코드를 기록(60바이트 랜덤 문자) -> 가입 확인 메일 전송 -> confirmcode로 확인 
-> confirm code = null, activated =1   

고려사항 : 이미 로그인한 사용자가 회원가입 주소를 직접 입력 하는 것을 막아야함
             ex) 기본사용자는 'guest' redirect 

 

 


소셜 로그인 작동원리


웹 브라우저  웹 서버  소셜
1  ------------------------------------------------------->
2  <-------------------------------------------------------

3 ------------------------------------------------------------------------------------------------------------------------->
4 <-------------------------------------------------------------------------------------------------------------------------

5 -------------------------------------------------------------------------------------------------------------------------->
6 <--------------------------------------------------------------------------------------------------------------------------

7------------------------------------------------------------>
8<-----------------------------------------------------------

ex) 구글로 로그인

1. 사용자가 구글로 로그인 버튼을 클릭한다.
2. 웹 서버가 구글로 로그인 페이지를 띄운다.

3. 사용자가 구글 아이디와 비밀번호를 입력하여 구글에 로그인을 요청한다.
4. 구글이 사용자에게 이용하는 사이트에 제공 할 정보, application에 승인 할 것을 물어보는 페이지를 띄운다.

5. 사용자가 제공 정보 및 구글로 로그인 허락한다 
6. 구글에서 쿼리스트링으로 코드(토큰?)이 redirect로 반환된다.

7. 최초 구글에서 제공된 정보와 일치하는 사용자가 있으면 로그인 하고, 아니면 회원가입을 한다.
8. 해당 사용자로 로그인 처리를 하고, 자사 서비스 홈페이지로 redirect 한다.

   

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));



int num = Integer.parseInt(br.readLine());
int[] p = new int[num+1];
int[] dp = new int[num+1];


for(int i =0;i<num;i++) {

p[i]=Integer.parseInt(br.readLine());

}



dp[0]=0;
dp[1]=p[1];
if(num>1)
dp[2]=p[1]+p[2];

for(int i=3;i<=num;i++) {

dp[i]=Math.max(dp[i-1],Math.max(dp[i-2]+p[i],dp[i-3]+p[i-1]+p[i]));

}


bw.write(dp[num]+"\n");



bw.flush();
br.close();
bw.close();
}

 

 

참고한 블로그

https://debuglog.tistory.com/80

'알고리즘' 카테고리의 다른 글

백준 10818번 자바(JAVA)  (0) 2019.10.15
백준 11721 자바(JAVA)  (0) 2019.10.14
백준 11719 자바(JAVA)  (0) 2019.10.14
백준 11718 자바(JAVA)  (0) 2019.10.14
백준 10818번 자바(JAVA)  (0) 2019.10.14

+ Recent posts