시작하기전 DB세팅
SELECT * FROM "MEMBER"
WHERE 1 = 0
-- MEMBER 테이블을 복제해서 MEMBER_S 테이블 생성
-- 테이블 컬럼 복제(NOT NULL 제약조건만 복제됨)
CREATE TABLE MEMBER_S
AS SELECT * FROM "MEMBER"
WHERE 1 = 0
-- 컬럼 기본값 지정
ALTER TABLE MEMBER_S
MODIFY ENROLL_DT DEFAULT SYSDATE
ALTER TABLE MEMBER_S
MODIFY SECESSION_FL DEFAULT 'N'
-- PK 제약조건 추가
ALTER TABLE MEMBER_S
ADD CONSTRAINT MEMBER_S_PK PRIMARY KEY(MEMBER_NO)
ALTER TABLE MEMBER_S
ADD CONSTRAINT MEMBER_S_CHK CHECK(SECESSION_FL IN ('Y', 'N'))
-- 시퀀스 생성
CREATE SEQUENCE SEQ_MEMBER_NO_S NOCACHE
-- 샘플데이터 추가
INSERT INTO MEMBER_S VALUES(
SEQ_MEMBER_NO_S.NEXTVAL,
'test01@naver.com',
'pass01!',
'오가람',
'01012341234',
DEFAULT, DEFAULT, DEFAULT, DEFAULT
)
COMMIT
<!--
조회되는 행의 개수 : 1행
파라미터 타입 : edu.kh.comm.member.model.vo.Member
조회되는 타입 : java.lang.String -> string
파라미터로 VO가 전달된 경우
1) 패키지명 + 클래스명을 모두 작성해야 한다.
2) mapper에서 VO에 저장된 값을 얻어와 사용할 경우 #{필드명}을 사용한다.
단, VO에 반드시 Getter가 작성되어 있어야 한다.
-->
<select id="test3" parameterType="edu.kh.comm.member.model.vo.Member" resultType="string">
SELECT MEMBER_TEL FROM MEMBER_S
WHERE MEMBER_EMAIL = #{memberEmail}
AND MEMBER_PW = #{memberPw}
AND SECESSION_FL = 'N'
</select>
mybatis-config에서 작성후
<!-- 별칭 작성 부분 -->
<!-- VO클래스의 패키지명 + 클래스명 모두 작성하는것이 불편하기 때문에 짧은 별칭 부여 -->
<typeAliases>
<typeAlias type="edu.kh.comm.member.model.vo.Member" alias="member"/>
</typeAliases>
위에 파라미터 타입을 member로 간단하게 작성할수 있다
<!-- resultMap 태그
- SELECT 조회 결과(ResultSet)의 컬럼과
조회 결과를 옮겨 담을 VO의 필드명이 일치하지 않을 때
이를 매핑시켜 조회결과가 필드에 세팅되게 하는 역할
[resultMap 속성]
1) type : 조회 결과를 담을 VO의 타입 또는 별칭
2) id : 만들어진 resultMap 태그를 지칭할 이름(식별명)
[resultMap 내부 작성 태그]
<id> : PK 역할의 컬럼 - 필드 연결
<result>: PK을 제외한 나머지 컬럼 - 필드 연결
-->
<resultMap type="member" id="member_rm">
<id property="memberNo" column="MEMBER_NO"/>
<result property="memberEmail" column="MEMBER_EMAIL"/>
<result property="memberPw" column="MEMBER_PW"/>
<result property="memberNickname" column="MEMBER_NICK"/>
<result property="memberTel" column="MEMBER_TEL"/>
<result property="memberAddress" column="MEMBER_ADDR"/>
<result property="profileImage" column="PROFILE_IMG"/>
<result property="enrollDate" column="ENROLL_DT"/>
<result property="secessionFlag" column="SECESSION_FL"/>
</resultMap>
// 로그아웃
@GetMapping("/logout")
public String logout(SessionStatus status) {
// 로그아웃 == 세션을 없애는 것
// * @SessionAttributes을 이용해서 session scope에 배치된 데이터는
// SessionStatus라는 별도 객체를 이용해야만 없앨 수 있다.
logger.info("로그아웃 수행됨");
//session.invalidate(); 기존 세션 무효화 방식 X
status.setComplete(); // 세션이 할 일이 완료됨 -> 없앰
return "redirect:/"; // 메인페이지 재요청
}
// 커맨드 객체
// @modelAttribute 생략된 상태에서 파라미터가 필드에 세팅된 객체
logger.info("로그인 기능 수행됨");
// 아이디, 비밀번호가 일치하는 회원 정보를 조회하는 Service 호출 후 결과 반환 받기
Member loginMember = service.login(inputMember);
/* Model : 데이터를 맵 형식(K:V) 형태로 담아 전달하는 용도의 객체
* -> request, session을 대체하는 객체
*
* - 기본 scope : request
* - session scope로 변환하고 싶은 경우
* 클래스 레벨로 @SessionAttributes를 작성하면 된다.
*
* @SessionAttributes 미작성 -> request scope
*
* */