학습내용
이 다음 학습 내용 : 나머지 필요한 페이지들 - 마이페이지에 있는 버튼 연결 페이지들 자동로그인에서 세션과 쿠키의 관계 회원 정보수정과 회원탈퇴 |
마이페이지는
controller - service - mapper - view : 로직 처리 필요 없으니까 컨트롤러와 뷰만 하면되지
컨트롤러
뷰 : 로그인을 한 사람은 볼 수 없는 페이지니까 memId로 분기처리
수정 페이지
회원정보수정 : 정보를 수정하려면 (memId의 정보에 해당하는) 수정페이지로 넘어가야 함. 수정페이지요청. 겟.
매퍼와 구현 질의문
뷰 : memId 에 해당하는 정보들을 가져와서 보여줄 부분 보여줌 있는 정보들은 보여주고 널이면 안보여주고 / 포스트로 submit하면, onclick걸지 않아도 호출됨~
**** update아니고 select . 리턴값 int 아니고 MemberVO타입 ( 찾을 값은 특정 id)
controller - service - mapper - view 방법 1. 컨트롤러로 뽑아서 매개변수로 던져주기 매개변수로 member가 들어가는게 아니고 맴버는 아이디로 검색해서 받은 결과를 받는 타입이 됨 컨트롤러 - 현재 로그인한 회원의 세션정보 memId 세션객체가 필요 서비스 인터페이스와 구현 : void니까 return있으면 안돼지 기본이지, (((서비스와 매퍼를 통해 DB에서 돌려받는 데이터타입이 MemberVO라고 헷갈리면안됨 무관 : 겟방식이라고 무조건 void가 되는건 아님 , 페이지 요청후 다른 화면으로 바로 redirect하려면 쓸수있음(로그아웃->메인) 서비스 인터페이스와 구현클래스))) 서비스와 서비스 구현클래스에서도 MemberVO로 받는다. 이건 sql찍어본 결과로 쉽게 알수 있다. 매퍼와 구현sql문 뷰 : memId 에 해당하는 정보들을 가져와서 보여줄 부분 보여줌 회원가입에서는 간단하게 @ModelAttribute를 이용했던 건데.. 차이점이 뭐지?ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 이건 단순하게 member정보들만 뷰로 전달하는것 HttpSession 이용한건 session에 들어있는 memId를 거쳐서 정보들을 가져와야 하는 거기 때문에 |
방법 2. 컨트롤러 없이 바로 서비스임플에서 꺼내오기
멤버객체정보를 모델을 통해 뷰로 고대로 전달
멤버의 정보를 가져와서 memberVO 객체로 담아서 고대로 호출한 곳으로 전달(return)
VO데이터타입으로 DB바인딩 할 때 java와 DB는 기본적으로 데이터타입이 다르기 때문에 (java는 object타입. db는 기본형) java에서 db로 변형시킬 때 옵션들, 데이터 타입이 뭔지를 정확하게 명시해야 함. 안그러면 에러가 발생함
ex. SQL문 처리할 때 null값이 jdbc타입 세팅안해놔서 나이 입력 null이 숫자쪽으로넘어오는 경우. 이때 setNull()해놓으면 null이 아닌 아무것도 없는거로 들어가게 됨
(DB에 넘기는 자바에서 int타입이면 자동 0이니까 이런 설정이 필요도 없지만 Integer인 경우가 문제..)
SQL문 처리 중 NULL에 대한 통합처리 세팅 = 마이바티스 설정정보파일 추가
- 스프링에 xml파일 mybatis-config & root-context.xml설정
설정정보 세팅해주는 독타입 mybatis사이트에 <!DOCTYPE configuration 부분 복붙하고
<configuration>태그 안에 설정정보들을 작성
DB jdbc타입에 널이 오면 아무것도 안넣겠따~~
+
root-context.xml에
sqlSessionFactory 태그 안에 한줄 추가
개별로 널로 넘어온 걸 INTEGER로 설정해서 널이 안되게 설정하는 법도 있긴하지 |
==> 결과
VO/DTO에 age같은 데이터 타입 int로 해놓으면 0으로 들어가게되고/ Integer로 해놓으면 없음으로 들어감(null)
* mybatis 문서 설명 참고
mapper.xml에 작성하는 모든 정보는 mybatis-config.xml에서 설정하면된다.
resultType="com.mapper....." 이름이 기니까 별칭 다는거
추가로 이 컨피그 xml 파일에 작성할 수 있는 것
mapper인터페이스 쓰지 않고 mapper.xml만 쓰고자 하는 경우
<mappers>태그 안에 쓸 xml파일 다 등록 해놓으면 된다. - sqlSession도 만들어야 하고/ session에서 쿼리문 실행시키는 것도 타이핑해서 자바로 만들으면 돼.. (인터페이스를 쓰는게 코드가 줄지, 인터페이스는 자바고 xml만 쓰는거보다 더 쉽게 작성할 수 있쥐. )
수정 처리 페이지
수정페이지의 <input>에서 데이터가 넘어오게 된다. 받을 수 있는 이유는 PostMapping으로 동일한 주소("modify")를설정했기 때문인가? 아니면 수정페이지의 form에서 넘겨주는 데이터가 <form action="/member/modify" method="POST">포스트방식으로 넘겨주기 때문인가? 아니면 둘다 때문인가? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
실제 들어가게 되는 주소는 /member/modifyPro?name=값&name=값&name=값... (모든 Pro페이지는 ?이하 값 없이는 접근 불가구나~~)
컨트롤러 : 수정페페이지의 <input>에서 넘어온 pw, age, email만 서비스로 보내니까 추가로 필요한 id(로그인한 사용자의 id니까 memId)는 서비스에서 세션관련 서비스에서 추가로 얻어오겠지
get에서 매개변수는 새로 생성하는 세션이나, 뷰로 전달하기 위한 모델
poist에서 매개변수는 <input>에서 받게 되는 데이터(객체)가 필수요소고, 뷰로 전달하기 위한 모델 옵션
서비스
서비스에서 실행메서드는 컨트롤러에서 던져준 재료가 있으면 매개변수를 그대로 갖지
memId를 생성하기 위한 HttpServletRequest, HttpSession 는 자체적으로 필요한 부분이니까 생성해야 하는거고
memId를 member내부에 함께 담아서 매퍼로 보내줘야 하니까 setId로 값을 채워준거
매퍼
받는 매개변수는 서비스에서 넘겨준 데이터 (DB관련 처리할 때 필요한것들)
뷰 model로 받아준 데이터로 보이는 결과화면 분기처리 - 아이디나 이름은DB에 있는 정보 그대로 보여주고
메일같이 필수적이지 않은 요소는 DB에 값이 있을 수도 없을 수도 있으니까
있는 경우 있는 걸받아와서 보여주고,
없는 경우 값을 채우지 않은 상태로 보여주면 됨
탈퇴페이지
탈퇴 확인 pw 한번 더 확인하고 탈퇴처리 페이지로 넘기니까 별다른 로직이 없어보이는데
pw확인 DB에서 <input>을 통해 입력받은 것과 비교해야 하는거니까 이건 탈퇴처리 페이지에서 처리하면 되니까
컨트럴러와 뷰만 하면 되겠군
컨트롤러
뷰
탈퇴처리 페이지
컨트롤러
매개변수를 String pw로 써도되겠지만 기존에 있는 서비스 idPwcheck를 쓸거니까 동일하게 MemberVO로 받아서 (들어오는건pw뿐이지만 -유일한 인풋태그) / 매개변수로 오는 model은 뷰에서 분기처리 하려고
추가로 필요한 id는 세션으로 꺼내자 - 여기서부터는 서비스로 넘겨야 함
서비스 로직 : id pw 체크하고 / 맞으면 delete 안맞으면 안하고.
앞에 id pw체크부분은 이미 만들어둔 idPwCheck메서드 또불러.
그 결과가 1이면 delete
member의 id에 memId넣어줘야 idPwCheck에서 사용가능하니까 잊지말고
(그럼 id대신 member.getId()로 뽑아온 값 동일하게 가능하기도 함)
+ 서비스에서 바로 뷰로 보내려고 하는데 그람 안대~~~~ 모델로 받아서 하는데는 컨트롤러란마랴~~
매퍼
뷰
중복되는 코드 따로 빼기 (중복 줄이기)
서비스임플에 세션을 빼오는 부분 - 아래로 따로 메서드로 만들어서 중복 부분 메서드호출로 바꾸기
모든 session자리를 getSession()으로 대체
주소창에 로그인 하지도 않고 마로 마이페이지로 들어가는 문제. 다른 페이지도 처리(delete/ modify)
로그인이 안되어있으면 돌려보내기
세션스코프로 로그인 이력이 있는지 없는지로 상태 체크
세션스코프를 임포트라든가 없이 바로 사용할 수 있는 이유?
기본으로 제공. 브라우저에 들어가는 순간 만들어지니까
// sessionScope 컨트롤러에서 처리 가능
아래쪽은 c:if로 안묶어도 상관없음 (이미 위에서 먼저 타고 나가니까)
/반대로 로그인하면 회원가입창과 로그인창 주소쳐서 못들어가게 처리~
자동로그인은 스프링시큐리티로도 rememberme기능으로도 가능하지만 여기서는 쿠키로 해보자
서버에서 쿠키생성 (비밀번호누출우려/ 폰에서는 예외)
현재 DB상 비밀번호 유출 문제 등등 추후 스프링 시큐리티로 비밀번호 저장시 암호화하는 클래스
쿠키
프로토콜에는 예전뭐했고 지금뭐하는 그런 상태정보가 없음.
해당 클라이언트와 지속하는 건 웹서버측 웹브라우저정보랑 서버에 저장된 웹브라우저 정보를 비교해서 동일한 웹브라우저인지 아닌지 판단을 하는것 : jsessionid = 쿠키로 저장된다고 했지.
상태로 없는 프로토콜위해 상태 지속위해 사용되는 게 쿠키 - 처음 요청했을 때 서버에서 발급받은jsessionid를 브라우저에 저장해놨다가 서버로 계속 보낼거야.
쿠키: 브라우저 정보를 브라우저에 저장. 서버요청시 쿠키가 가진 정보 다가지고 넘어가게 됨. =웹브라우저가 요청할 때 쿠키 같이 보내면서 요청해~~~
브라우저는 웹브라우저에 포함된 쿠키가 뭔지 보고 판단을 하지.
사이트에 한번 가게 되면 그 사이트에 나의 쿠키 정보가 저장됨 2일 뒤 접속했는데 쿠키 안없어졌으면 상품 추천도 해주고.
쿠키 해놓으면 좋은 거: 이전에 로딩해논거 빨리 로딩됨.
자동로그인 체크하는 경우
쿠키를 같이 만들어서 보내기
브라우저를 껐다 켜도 쿠키가 있으면 로그인으로 변경
쿠키는 웹페이지 요청할때마다 보냄
쿠키 이름, 값, 유효시간, 도메인(서버 우리 서버 . 도메인은. 로컬호스트), 패스(경로 /member/xxx...) 등으로 구성
이름 값의 쿠키를 유효시간이 지나지 않은 내에서 도매인+패스쪽으로 보내주겠다~~ 쿠키를 이렇게 세팅가능
지정안하면 생성한 그 페이지 말고 다른경로에서는 해당 쿠키를 못찾음. 지정한 부분의 하위는 다 갈 수 있음 (/ = 모든경로)
생성하는 법 : 내장된 클래스 사용 new Cookie(String name, String value);
서버 응답할 때, response객체에 실려 사용자 브라우저에 저장됨. MapType(키, 값)형식으로.
유효기간 설정 필수
Cookie cookie = new Cookie(String name, String value);
cookie.setMax(60);
cookie.setDomain("localhost");
cookie.setPath("/");
리스폰스 객체에 쿠키 추가해야 서버로 전달되는거임. 서버에서 쿠키를 들고 브라우저에 응답가능함
response.addCookie(cookie객체);
쿠키 클래스 내부의 메서드들은 이름, 값 도메인, 패스, 유효시간 읽어오고, 도메인 패스 유효시간 설정 등등 있고
서버에 있는 쿠키 읽어오는 메서드 (스프링, 자바 내장객체) : 리퀘스트 내장객체에서 쿠키 읽어와야 함. 쿠키가 이름이 있다고 이름으로 가져오는 기능은 없어서
요청마다 request객체에 담겨서 계속 같이 다니는 쿠키니까 거기서 꺼내야
리퀘스트에 쿠키 있는지 다 꺼내봐야 함
Cookie[ ]배열로받아 = request.getCookies();
그다음 배열에서 찾고싶은 쿠키 이름을 검색! getName(), getValue()
쿠키삭제는 따로 없음 그냥 유효시간을 0로 해서 갱신. (음수로 하면 브라우저 닫길때 없어짐) 서버에 저장은 가능한데 삭제는 없으니까
cookie.setMaxAge(0);
response.addCookie(cookie);
로그인.jsp에서 체크박스 추가해서 컨트롤러에 넘어가는 인자로 추가한 후, 찍히는 게 뭔지 확인하고 그거로 처리하면 됨
체크하면 1, 체크안하면 null값 확인
쿠키를 만드는 부분:
idPwCheck한 후 그 결과가 있으면 1이니 까 , 이 때 자동로그인 체크했다면 쿠키를 만들어줘야하니까
그 로직 내부가 됨
리스폰스객체가 필요하니까 쉽게하려면 컨트롤러에서 던져주는거
쿠키 확인 . 로그인한 이후 연결되는 / 모든 경로에서 지정시간내에서 쿠키가 확인됨
메인페이지 들어왔을 때 쿠키가 있는지 체크해서 자동로그인할거니까
쿠키 확인을 main요청 컨트롤러에서 쿠키 꺼내서 확인.
request에서
메인에서 jsp 도달하기 전에 컨트롤러에서 간단하게 쿠키를 뽑아보자
coo배열에는 JSESSIONID는 반드시 있어서 널은 나올 수 없음
쿠키 생성하고 나서 처리해주는 페이지는 loginPro페이지
비로그인인데 쿠키 있으면 로그인 처리
세션과 쿠키는 서비스에만든다. jsp로 이동차리하는건 controller에서 처리
로그인 폼 요청하면, ====> (세션은 없고, 쿠키만 있는 사람) 컨트롤러에서 로그인 겟매핑 부분에
세션도 만들고, ===> 브라우저가 닫기기 전에 페이지 이동할 때 계속 로그인 상태 유지하는 정보니까 로그인 이력 보려면 쿠키만 만드는 게 아니고 세션 함께 만들어야 함.
자동로그인 체크했으면 쿠키도 갱신 (만드는거랑 동일) ===>
return "redirect:/member/main"; 리다이렉트로 가게 되면 main컨트롤러에 있는 코드들이 다시 실행됨.
과
return "member/main";의 차이점 뷰페이지까지 들고갈 데이터가 필요한 경우, 컨트롤러 서비스 까지 다녀와야 하지만 그런게 아니면 바로 메인으로 가도됨 . 특별히 로직 처리 없이 로그인해서 보여줄 jsp 페이지만 바꿔줘야 하는 경우.
ㅡㅡㅡㅡ
문제점 확인
매퍼.xml
select문에는 resultType 필수로 적어줘야 한다.
'코딩' 카테고리의 다른 글
2022.05.02 노드만들고사용하기 module.exports={}, const {} = require() (0) | 2022.05.03 |
---|---|
2022.03.30_36일차 (0) | 2022.04.23 |
2022.03.23_31일차_spring(06) (0) | 2022.03.24 |
2022.03.22_30일차_spring(5) (0) | 2022.03.24 |
2022.03.21_29일차_spring(4)_EL, JSTL (0) | 2022.03.22 |
댓글