사용자가 View를 통해서 로그인 정보(ID, PW)를 입력하여 로그인을 요청했다는 가정하에 진행
Controller에 로그인 정보가 넘어왓을 때
위와 같은 구조로 순서는
View - Controller - try( Service - Dao ), catch(LoginException)
진행
Controller 데이터 처리는 저번 포스트와 같이 하면 된다. ( https://qdgbjsdnb.tistory.com/238 )
소개한 8가지 방법 중 아무거나 써도 된다.
이 중 7번째
@Controller
public class MemberController {
@Autowired
private MemberService ms;
@RequestMapping("login.me")
public String loginCheck(Member m, Model model, HttpSession session) {
Member loginUser;
try {
loginUser = ms.loginMember(m);
session.setAttribute("loginUser", loginUser);
return "redirect:goMain.me";
} catch (LoginException e) {
model.addAttribute("msg", e.getMessage());
return "common/errorPage";
}
return null;
}
}
Member 타입 객체 loginUser는
Spring이 객체화 해 준 Service 인터페이스인 MemberService 타입 객체 ms의
loginMember 메소드를 이용하여 로그인 정보(ID, PW)를 넘긴다.
loginUser = ms.loginMember(m);의 loginMembe메소드나 그 하위 메소드에서
throw new LoginException을 하용하기 때문에 try catch문이 필요.
MemberService.java
public interface MemberService {
Member loginMember(Member m) throws LoginException;
}
MemberServiceImpl.java
@Service
public class MemberServiceImpl implements MemberService {
@Autowired
private SqlSessionTemplate sqlSession;
// 이렇게만 쓰면 Autowired로 생성되지 않기 때문에 xml에 따로 명시해야함
// root-context.xml에서 진행
@Autowired
private MemberDao md;
@Override
public Member loginMember(Member m) throws LoginException {
System.out.println(sqlSession.hashCode());
Member loginUser = md.loginCheck(sqlSession, m);
return loginUser;
}
}
SqlSessionTemplate sqlSession은 DB를 연결해주는 라이브러리를 이용한 객체
저번에 설명한 대로 설정파일을 읽어 Spring에서 자동 생성한다. ( https://qdgbjsdnb.tistory.com/236 )
MemberDao md; 또한 컨트롤러에서 Service생성과 똑같이 생성된다.
이번엔 굳이 try catch를 사용하지 않고 throw를 사용
※참고 - 기존의 서블릿 방식으로 객체를 수작업으로 생성하면 .hashcode를
여러번 호출 하였을 때 값이 계속 바뀌는것을 확인 할 수 있다.
Spring에서는 Spring 컨테이너로 생성해준 객체의 .hash코드를
여러번 호출하면 매번 같은 값을 출력하는걸 확인할 수 있다.
이를 통해 같은 객체를 매번 새롭게 생성하는것이 아닌 재사용을 통해
메모리를 좀 더 효율적으로 사용하고 있다고 확인할 수 있다.
MemberDao.java
public interface MemberDao {
Member loginCheck(SqlSessionTemplate sqlSession, Member m) throws LoginException;
}
MemberDaoImpl.java
@Repository
public class MemberDaoImpl implements MemberDao{
@Override
public Member loginCheck(SqlSessionTemplate sqlSession, Member m) throws LoginException {
Member loginUser = sqlSession.selectOne("Member.loginCheck", m);
System.out.println("Dao Member : " + loginUser);
if (loginUser == null) {
throw new LoginException("로그인 정보가 존재하지 않습니다.");
}
return loginUser;
}
}
MemberDaoImple에서는 SqlSessionTemplat과 myBatis 메소드를 이용해서
DB를 조회해온다.
메소드 명, 사용법은 저번에 설명한 mybatis와 완전 같음.
( https://qdgbjsdnb.tistory.com/228?category=733892, https://qdgbjsdnb.tistory.com/229?category=733892 )
sqlSession.selectOne("Member.loginCheck", m);
조회 결과를 통해 try catch
mybatis와 DB 관련 라이브러리를 이용하기 때문에 pom.xml에 라이브러리 추가는 필수이다.( https://qdgbjsdnb.tistory.com/237 )
LoginException.java의 경우는 간단하게 다음과 같다.
public class LoginException extends Exception{
public LoginException(String msg) {
super(msg);
}
}
이와 같이 Spring을 이용하면 이와같이 코드의 길이가 매우 짧아지고
자동으로 해주는것(프로그래머가 아닌 Spring Container가)이 많아져 편리하다.
특히 누구든 코드 분석하기가 훨씬 쉬워져 다른 사람과 작업에 좋다.
협업에 알맞지만 Spring 구조와 설정 사용법 등 너무 복잡하고 어렵다는 단점이 있다.