본문 바로가기
카테고리 없음

2022.03.24_32일차_spring(7)_회원페이지(1)_회원가입과 로그인

by 흥뷰자 2022. 3. 28.

학습내용

회원가입과 회원가입처리 
로그인과 로그인처리

프로젝트부터 새로 만들기
MVC파일 구조짜기 폴더와 파일들 배치
이동경로와 페이지별 버튼구상


1. 리거시 프로젝트 생성

2. pom.xml세팅

- 버전정보 수정

java version : 11
spring version : 5.1.5

- 그외 dependency 추가

:  lombok, spring-test / spring-jdbc, ojdbc8, HikariCP, mybatis, mybatis-spring , log4jdbc-log4j2-jdbc4 (+ main/resources에 properties파일 추가)
log4j 버전 맞게 낮추기
servlet버전 변경
junit버전 바꾸기

3. 서버 우클릭 - add and remove 서버에 올려주기

4. 프로젝트 우클릭 - 메이븐 - 프로젝트 업데이트

   프로젝트 우클릭 - properties - 프로젝트 buildpath에 톰캣 서버 라이브러리 잡기

수동으로 다운로드 메이븐 파일로 설정하는 경우
.jav라이브러리 다운받아서 추가하는 경우 빌드패스에서 Add External JARs... 로 추가
메이븐리파지토리 사이트에 jar파일 다운

                                         프로젝트 퍼싯 - 런타임즈에 아파치 체크

5. 서버 주소 controller 지우는거로 바꾸기

6. 서버 스타트 체크 + 서버스타트 된 상태에서 웹으로도 요청해보기 http://localhost:8080

    (home.jsp지운경우 404페이지 없음에러 나오는데 문제는없음)

 

 


회원가입 페이지 만들기 위한 준비 : 프로젝트 폴더의 구조와 경로 짜기 & DB 테이블 준비하기  

구조

 

경로와 필요한 페이지 (폴더들과 패키지만 일단 추가)

 

main/resources 에 log4j 독타입 에러나는거 코드 살짝 수정해주고

com.member.controller 에 MemberController.java추가 //서블릿 컨텍스트 .xml에서 읽고 있는 패키지임

페이지를 만드는 순서

1. controller.java에 경로 매핑 (RequestMapping 상위폴더 경로- GetMapping/PostMapping/또는 Mapping)

2. 뷰즈 폴더 안에 해당 jsp페이지 만들기 


가입페이지 먼저

가입페이지와 가입페이지 처리 페이지 만들기: 페이지 만들기 전에 경로 매핑

 

앞으로 이제 csse등 모든 것들 webapp아래 resources아래 넣을 것.

.js

.img

web-inf에 들어가 있으면 절대안돼 숨겨놓는거나 마찬가지. 설정파일들을 숨겨놓는 것

주소경로 오픈해놔야함 = resource안에 때려박기

css파일 추가하고 jsp파일에 css 경로 연결

 


이제 웹상 경로는 다 /resources/
/안하면 상대경로로 알아서 들어가버림....
(경로는 서블릿xml에서

 

바디에 페이지 내용 구성

 

 

DB 테이블 작성 (sql developer)

 

 

회원가입 처리 페이지 띄우기 (controller.java) - singupPro.jsp

 

같은 주소로 쓰고싶으면 어노테이션을 분기처리

아니면 

데이터에서 받아오는 정보들은 여러가지 타입이니까 dto나 vo로 받아주자

도메인 패키지 내부에 MemberVO.java만들고

 

컨트롤러에 매개변수로 보내줌

처리는 서비스가 . 비지니스 로직처리는 서비스로 가야디

(그다음 서비스에서 매퍼야 디비서 뭐좀 가져와~~다이렉트로할거야 (처리할거 많으면 그 사이에 DAO가 낄 수도 있음))

서비스 클래스 만들기- 인터페이스와 구현클래스로 ~~

서비스.java 

던져주는 서비스에 던져줄 멤버 vo 매개변수로 넣어야

 

세트

 

매퍼랑 서비스만 (도메인 빼고) 빈한테 객체생성 등록. (도메인은 그릇만든거라 빼고)

매퍼는 마이바티스 스캔에서 뜨고 할거고 = 등록은 어디에? 서비스는 루트에. 루트 세팅 (mapper를 mybatis-spring이 스캔 하도록)

서비스는 스프링에서 (서비스 인터페이스와 구현클래스) 작성 둘다 root-context.xml에 

 

컨트롤러에서 주입  서비스야일해

서비스를 Autowired 

DB가서 처리할거는 회원가입매퍼 - 인터페이스와 구현클래스

인터페이스에 쿼리문 실행시킬 메서드 추가

 

 

인터페이스: 멤버 정보 줄테니 그 정보로 쿼리문 실행해라

구현 sql문은 MemberMapper.xml 파일에 작성

 

controller에서 사용자로부터 입력받은 VO의 변수값을 뷰로 보내고 싶으면 @ModelAttribute("전달할VO명")을 해당 매개변수 앞에 붙인다

뷰페이지

signup.jsp에서 폼을 작성하고 넘기면

signupPro.jsp에서 다음과 같은 결과를 얻게 된다

 


 

한글깨짐 방지 - web.xml에 

필터와 필터매핑 세트로 설정

 


메인 페이지 만들기  : 만들기 전에 컨트롤러에서 경로 이어주기(매핑)

 

뷰에 - main.jsp파일 생성해서 페이지 구성 (로그인 버튼과 회원가입 버튼)

* 버튼 클릭은 다 겟요청이다. = 페이지 바꿔치기

온클릭 값은 자바스크립트 영역

 

 

가입 처리 페이지에서 , 버튼누르지 않아도 성공시 입력한 숫자의 초(5)가 지난 후 메인으로 바로 이동
옛날문법인데 

 

 


로그인 페이지와 로그인 처리 페이지 만들기 : 페이지 만들기 전에 컨트롤러 먼저 매핑 // 처리요청에는 매개변수 필요

비지니스 로직처리는 서비스가 : 로그인하면 아이디와 비밀번호가 맞는지 체크해야 함.

컨트롤러 -> 서비스(인터페이스와 구현클래스) -> 매퍼(인터페이스와  구현xml) -> 데이터 처리 결과 반환하는 데이터타입이 int가 됨

위에처럼 회원가입과 동일하게 결과를 뷰페이지로 넘기기 위해 Model 이용

뷰페이지에서 el태그로 해당 결과를 이용한 페이지 구성 

페이지에서는 로그인 성공시 메인으로 이동

로그인 실패시 뒤로가기

로그인 페이지

* <input type="submit"> 은 여러개가 있으면 onclick이 먹히지 않는다 

post방식으로 login처리창으로 다함께 넘어가버리니까 다른 링크를 걸어줄거는 꼭 !!! button으로 하자

로그인 처리 페이지


로그인처리는 몇가지 더 할 게 있음 

로그인 상태 유지 - 세션과 쿠키 사용

 

 

웹컨테이너(톰캣=WAS안에 있는 것 중 하나 WAS는 웹서버와 웹컨테이너 합친것)

웹 컨테이너 안에 세션 컨테이너 있다. 하나의 웹 브라우저에서 하나의 세션을 생성.  세션은 여러개가 되지. 각 세션을 구분해야 함. 이를 위해 handShake(통신 약속)할 때  서버가 각 브라우저에 대한 내부 저장공간 할당하여 id를 부여 id발부해서 공유. 톰캣에서 발부할 때는 JSESSIONID. 브라우저별로 구분되는 것. / 발급받은건 내부에 쿠키로 갖게 됨

웹브라우저는 서버에 요청할 때 마다 이 세션id를 보내서 서버가 어떤 세션 사용할 지 판단하게 함 (자동처리되는 부분인데 눈으로 확인가능)

브라우저 끄면 사라지고, 다시 열면 id 다시 발급 (로그인 다시 해야 함)

쿠키 목록 중 JSESSIONDI인 쿠키가 세션 ID공유할 때 사용

로그인 하지 않아도 세션은 생김 (브라우저에서 유지되는 보존공간 : Session)

 

로그인 시 세션에 키로 속성하나 추가(session내부객체로) 로그인하면 그 세션이 있고, 로그인 안하면 그 세션이 없고

세션 내부객체 

스프링 MVC에서 제공하는 클래스 : HttpSession :  request.getSession()할 때 session이 저장되어있는 객체.

HttpSession 클래스의 메서드 주요 너댓개

1. void setAttribute(String name, Object value) : name속성명으로 value속성값 세션에 추가 / 로그인하면 (memId, 사용자id값)

세션에 할당된 고유 아이디 리턴 String getID()

2. Object getAttribute(String name) : name이라는 키값(세션의 속성명)으로 세션의 속성 값(object로) 꺼내기 / getAttribute(memId)했는데 null이면 로그인을 안한거고, null이 아니면 로그인을 한적이 있는거지.

페이지가 여러개인데 한페이지에서 분기처리 할 것. result가 아니라 sessionScope에서 memId를 찾을 것.

3. void removeAttribute(String name) : name 속성과 값 삭제

4. void invalidate() : 현재 세션에 저장된 모든 세션속성 제거

5. int setMaxInactiveInterval(int interval) : 세션을 유지하기 위한 유지시간 할당 (초단위), default 1800초(30분) 해당시간이 지나면 다시 로그인했을 때 이전 로그인 기록이 사라져서 자동로그인이 안됨


 

세션 추가하기.

션 얻어오기  방법1: 
(최종목적지 뷰까지보이게 하려고)
컨트롤러에서 세션을 쓰고싶으면 메서드의 매개변수로 세션을 추가. 서비스에서 같이 쓸거면 서비스 부를 때 매개변수로 같이 넣어줌. 해당 서비스 매개변수들 다 늘려줌 (서비스와 매퍼클래스)



서비스에서 매개변수로 받아서 로그인이 되면 세션에 id속성을 추가 
session.setAttribute(memId, member.getID()) 이름을 로그인한 VO id로 memId를 fix 
누가 들어오든 이 값은 달라지지만 이름은 memId로 동일 . 로그인 여부 체크는 memId가 있냐 없냐로 체크

세션 얻어오기 방법 2:  컨트롤러가 아닌 다른 어느 웹에서든 꺼내는 방법

서비스 임플에서 바로 세션 꺼내기

ServletRequestAttributes request context holder클래스 

RequestContextHolder.getRequestAttributes() 리퀘스트 설정 정보를 홀딩하고 있는 클래스에서 . request객체(HttpServletRequest객체)의 속성들만 가져오는 메서드

우리가 쓰는건 servlet이니까

세션을 사용하기 위해서는 request객체를 불러와야 함

ServeltRequestAttributes변수에 담아줌 (형변환해서 담아주면 타입이 HttpServletRequest 타입이 됨 .getRequest(); 

 ////우리가 계속 쓰던 내부 객체 리퀘스트 객체. 여기까지 오면 요청에 관련된 모든 정보들을 다 뺄 수 있쥐

request.getXXX()

세션도 그 중 하나

변수 안쓰고 한줄로도 나열 가능


뷰에서 사용하려면

sessonScope애서 값을 꺼내서 세션에 담긴 값을 꺼내쓰면 된다.

로그인 여부 

result로도 가능하지만 sessionScope로도 가능 - 세션으로도 가능

SessionScope 세션스코프 : 브라우저가 요청 받으면 브라우저 닫을 때까지의 범위. 세션스코프 내에서 session영역에 저장된 데이터나 객체를 자유롭게 사용할 수 있다.

${sessionScope.변수명} 

세션스코프에 있는 변수명이 뭐인 값이나 객체를 출력해라~~

 

로그아웃 해서 세션 기존거부터 지우도록 작성하고 주소창에 http://localhost:8080/member/logout바로 요청해서 세션지운 후 로그인 실패해서 결과를 확인해본다 

컨트롤러에

session.invalidate()는 세션의 모든 세션속성을 지우는거고

해당 id의 세션속성만 지우고 싶다면

 

 


 

로그인상태에 따라 메인페이지가다르게 보여야 함

기존에 메인페이지에서 로그인을 안 한 상태면 (memId가 없는 상태) 로그인과 회원가입 버튼이 있어야 함.

로그인을 한 상태면(memId가 있으면) 메인에서 마이페이지와 로그아웃 버튼이 있어야 함.

memId는 sessionScope에 있는거니까 해당 브라우저가 완전히 닫기면 사라지게 됨

해당 페이지를 다시 열면 로그아웃 상태가 되는 걸 확인할 수 있다.


로그인 페이지도 로그인 상태에 따라 다르게 보여야 함

마찬가지로 taglib으로 처리

 

 


이 다음 학습 내용 : 

회원 정보수정과

회원탈퇴

 

나머지 필요한 페이지들

마이페이지

회원정보수정, 수정처리 페이지

회원탈퇴, 수정처리 페이지

 

 

 

댓글