목차
- post
- 로그인 기능 구현
- 글쓰기 구현
- 포린 키
Post
*
post를 써야 하는 이유
인증을 해야 하기 때문에 무조건 post로 넘겨야 한다.! *그래야 안전함!*
그래도 안전하지 않음, ( http에서 body에 전부 노출됨 )
get은 쿼리여서 String 암호화 불가능
post는 암호화가 가능
get, post 둘 다 하던 노출은 됨
*
그렇기 때문에 서비스를 할 때는 https를 써야 한다 (security 추가)
https를 쓰지 않으면 결제 서비스도 불가능해진다. 민감한 정보를 암호화/ 복호화된 상태로 보내야 하기 때문
https를 쓰기 위해서는
값을 지불하고 도메인 등록만 https 서비스 회사에 등록해주면 된다.
그렇게 하면 ip로 도메인으로 넘어갈 때 ip -> 도메인 서버 -> security 서버 -> 도착
이렇게 통신하게 되어서 안전해진다.
https 서비스 회사에서는 정보를 암호화 복호화를 진행해서 개인 서버 운영자도 그 테이블 값을 확인할 수 없다(원본 값) 즉, 암호화된 키가 테이블 값에 담기게 된다.
여기서 중요한 건, post로 보내면 암호화/ 복호화가 가능하지만 get으로 url로 보내면 암호화/ 복호화가 불가능합니다.
그래서, 우리는 post로 action을 모두 설정을 해둬야 합니다.
로그인 기능 구현을 위해 UserController에 Session를 DI 합니다.
왜냐하면 Session에 사용자의 정보를 담아서 보내줘야 하기 때문입니다.
그리고 userRepository에 mLogin으로 구현했던 것을 활용하여 데이터를 비교하기 위해서 DB에서 담아옵니다.
담아 온 것이 맞다면 userEntity에 User 정보가 객체 형태로 담아져서 받게 됩니다.
그렇지 않다면 null값을 반환을 합니다.
(사용자가 입력한 값이 DB에 있지 않아서 null값을 반환할 수 없었던 것)
Principal - 인증자(접근 주체)
Jstl
기존의 <% %> 태그는 톰켓이 해석해서 던져줬지만 jstl의 경우에는 톰켓이 해석하지 못하기 때문에 taglib를 추가를 해서 jstl을 사용할 수 있게 합니다.
taglib의 원본 출처
https://downloads.apache.org/tomcat/taglibs/taglibs-standard-1.2.5/README_bin.txt
when을 if로, otherwise를 else처럼 사용하면 됩니다.
auth의 경우는 인증이 필요한 화면에 이동할 때
인증이 필요하다고 느껴지면 경로에 넣어주며
user는 사용자의 정보가 session에 저장이 되어있고
session에 저장되어 있는 상태인 그 사용자의 정보를 가지고 수정하거나
로그아웃할 때 user 사용자의 session을 사용하기 때문에
user경로를 추가해줍니다.
auth/....
user/....
분리
Controller 안에서
@ResponseBody를 자료형 앞에 쓰면 그 함수만 RestController가 됨
history.back();
을 사용해서 console 창에서 로그인을 실패했을 때 alert를 보여준 다음에 사용자가 아이디를 다시 입력하지 않도록 script언어인 history.back(); 을 사용해서 구현합니다.
Script 태그를 사용해서 표현하는데 alert를 띄울 때마다 이렇게 일일이 닿으면 불편합니다.
그래서 새로운 package를 만들고 거기에 Script 함수를 모아둡시다.
Script Class 생성
이렇게 해주면 아래처럼 한 줄의 코드를 치면 끝납니다.
Script.back안에
String 매개변수의 msg로 "로그인 실패"를 넣어줍니다.
위에처럼 로그인 성공을 했을 때에도 기존의 redirect:"/" 방식으로 하면 String으로 return 되기 때문에
기존의 방식을 바꿔 주기 위해 JavaScript를 사용해서 구현을 하여
"로그인 실패"처럼 편하게 함수를 만들어 줍니다.
back함수에는 scrpit 문인 location.href=""를 사용해서 안에 이동하고 싶은 주소를 입력합니다.
로그인 창에 잘못 입력하면 아래와 같이 구현됩니다.
글쓰기 구현
Post 클래스를 만들고 (새로운 데이터를 저장하기 위해서 ) 다음과 같이 설정합니다.
@Lob는 longtypetext 데이터 type 형태입니다.
userId 추가를 해주고 나서
getter, setter 추가를 해줘야 합니다, 그렇게 해야 DB가 Spring에 접근할 수 있기 때문입니다.
yml 설정을 변경하고 실행해보면
DB에 테이블이 만들어집니다
DB 테이블을 만들고 none으로 설정을 바꿔 줘야 합니다.
그렇지 않으면 서버를 실행할 때마다 DB를 초기화해서 생성하기 때문입니다.
그리고 회원가입으로 DB에 세명의 데이터를 넣고 실습해보자.
그전에 가입했던 DB가 다 날아가서 다시 만들어 줘야 합니다.
아래와 같이 회원가입으로 데이터를 넣어 줍니다.
쿼리문을 다음과 같이 작성합니다.
현재 쿼리문 실행으로 한 문장 씩 실행해본다. 그렇게 하면 어디서 오류가 나는지 알 수 있다.
(전체 쿼리문으로 실행하면 오류가 어디서 터졌는지 알기 어려움)
포린 키에 대해서
다음과 같이 4가지 관계가 있습니다.
1 : N 관계와
N : 1 관계
N : N 관계
1 : 1 관계
one to many
one to one
many to one
many to many
마치 영화 예매를 할 때
영화를 보는 사람의 정보 테이블과
영화의 상영정보 테이블을 보면
N:N 관계입니다.
이렇게 되면 테이블을 여러 테이블로 쪼개야 합니다.
1:N이 될 때까지 말입니다.
그렇게 해야 DB설계 원칙인 무결성의 원칙을 지킬 수 있기 때문입니다.
Tips
N에 포린 키(foregin key-외래 키)를 생성합니다.
Reference
https://daesuni.github.io/jstl/
https://downloads.apache.org/tomcat/taglibs/taglibs-standard-1.2.5/README_bin.txt
'BackEnd > Spring' 카테고리의 다른 글
[Spring][10]ORM, JPA oneToMany[양방향 Mapping 실습] (0) | 2021.07.08 |
---|---|
[Spring][9]RDB, Object Relationship Mapping in Spring[관계형 데이터베이스, ORM] (0) | 2021.07.07 |
[Spring][7]Join practice[회원가입 실습] (0) | 2021.07.01 |
[Spring][6]Desigin of RestfulAPI/UPDATE in CRUD[RestfulAPI와 업데이트 실습] (0) | 2021.07.01 |
[Spring][5]TCP/JPARepository for CRUD[TCP통신과 JPA를 이용한 Repository 설계] (0) | 2021.06.30 |