사용자가 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 구조와 설정 사용법 등 너무 복잡하고 어렵다는 단점이 있다.





+ Recent posts