본문 바로가기
코딩

2022.03.25_33일차_spring(8)_회원페이지(2)_수정과 탈퇴, 자동로그인

by 흥뷰자 2022. 3. 30.

학습내용

이 다음 학습 내용 : 
나머지 필요한 페이지들 - 마이페이지에 있는 버튼 연결 페이지들
자동로그인에서 세션과 쿠키의 관계

회원 정보수정과

회원탈퇴



마이페이지는

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 필수로 적어줘야 한다.

 

 

 

 

댓글