Back-end/Spring

Spring) 로그인 동작 만들기(테스트 형태)

luana_eun 2022. 4. 29. 16:56
728x90

로그인 동작 전 준비

- MemberVO 

- DB에 유저테이블에 유저 한명 이상

- DB연결할 dataSource, SqlSessionFactory, SqlSessionTemplate 객체Bean. 

 

 

1. MemberDAO에 추상메서드로 로그인 메서드 만들어놓기

   public void loginMember(String userid, String userpw); 이렇게 직접 적는것 보다 vo객체를 사용하는 것이 좋다. 

   이렇게 따로 정보를 가져와서 처리하는 방법은 뒤에 5번에 적어보겠다. 

// 로그인 동작
public MemberVO loginMember(MemberVO vo);

 

 

 

2. 로그인 동작 sql문 생성

src/main/resource/mappers/memberMapper.xml

<select id="loginMember" resultType="com.myspring.domain.MemberVO">
  select * from tbl_member where userid=#{userid} and userpw=#{userpw} 
</select>

id="loginMamber" : 쿼리문의 이름을 loginMember라고 짓는다.

resultType 쿼리문의 결과를 com.myspring.domain밑의 MemberVO객체 형태로 반환해서 값을 넣는다.

#{ } : 이 형태는 조회와 동시에 가져와서 객체에 넣겠다는의미로, getter, setter역할을 동시에 한다. 

 

*** <풀패키지 짧게 줄이는 방법>

리턴타입에 적은 com.myspring.domain.MemberVO 풀패키지를 짧게 줄일 수 있다. 

src/main/resources에 mybatis-config.xml 파일을 열고(없으면 생성) configuration태그 안에 패키지명을 적는다. 

다른곳에서 객체를 호출했을때 패키지명이 없으면 이 파일에 와서 찾게된다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  
  <configuration>
  	<typeAliases>
  		<package name="com.myspring.domain"/>
  	</typeAliases>
  
  </configuration>

이렇게 하면 다음과 같이 select의 리턴타입에 패키지명 없이 바로 객체명을 적을 수 있다. 

<select id="loginMember" resultType="MemberVO">
  select * from tbl_member where userid=#{userid} and userpw=#{userpw} 
</select>

 

 

 

 

3. MemberDAOImpl 에 실제 메서드 구현. 

1번에서 만들었던 추상메서드를 구현한다. 

@Override
public MemberVO loginMember(MemberVO vo) {
  System.out.println("DAO: loginMember(vo)실행");
  MemberVO voResult = sqlSession.selectOne(NAMESPACE + ".loginMember", vo);
  System.out.println("DAO: 로그인 완료!");
  
  return voResult;
}

NAMESPACE로 mapper안에 있는 loginMember라는 아이디를 가진 대상이 호출, 그 호출할때 vo객체를 같이 넘긴다.

selectOne은 객체 하나를 가져온다는 의미다. (로그인 조회한 결과를 객체로 가져오기 위해)

voResult : 로그인 조회 결과를 MemberVO 객체에 남는다. 

 

 

 

4. 실행 테스트

src/test/java 밑에 MemberDAOTest.java에 테스트 코드를 작성한다. 

@Test
public void 로그인체크() {
	System.out.println("Test: 로그인 체크 테스트");
	MemberVO vo = new MemberVO();
	vo.setUserid("admin");
	vo.setUserpw("1234");
	MemberVO voResult = dao.loginMember(vo);
		
	if(voResult != null) {
		System.out.println("Test: 회원이 있음");
	} else {
		System.out.println("Test: 비회원");
	}
}

 

 

 

5. DAO함수에 값 따로따로 처리하기

위의 2번에서 vo객체로 한꺼번에 받는거 말고, id, pw 이렇게 따로 들어오게 할려면 어떻게 해야할까. 

방법 1) 따로 들어온 값을 vo객체에 넣기

          이 방법은 이미 위에 했으니 넘어가고

방법 2) Map 사용하기

@Override
public MemberVO loginMember(String userid, String userpw) {		
  Map<String, Object> paramMap = new HashMap<String, Object>();
  // 여기에 사용할 키 값은 DB컬럼명과 같아야한다.
  paramMap.put("userid", userid);
  paramMap.put("userpw", userpw);		
  MemberVO voTemp = sqlSession.selectOne(NAMESPACE + ".loginMember", paramMap);
		
  return voTemp;
}

테스트 실행

@Test
public void 로그인체크() {
	System.out.println("Test: 로그인 체크 테스트");
	MemberVO vo = new MemberVO();
	MemberVO voResult = dao.loginMember("admin", "1234");
		
	if(voResult != null) {
		System.out.println("Test: 회원이 있음");
	} else {
		System.out.println("Test: 비회원");
	}
}

 

728x90