학습내용
회원가입과 회원가입처리 로그인과 로그인처리 프로젝트부터 새로 만들기 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으로 처리
이 다음 학습 내용 :
회원 정보수정과
회원탈퇴
나머지 필요한 페이지들
마이페이지
회원정보수정, 수정처리 페이지
회원탈퇴, 수정처리 페이지
댓글