JDBC

[JDBC] 회원가입 기능 구현하기(mybatis + Servlet)

jongh0 2025. 6. 10. 19:48

 

[JDBC]

JDBC(Java Database Connectivity)는 자바 언어를 사용하여 데이터베이스에 접근하고 관리할 수 있도록 지원하는 자바 API이다. 다시말해서, 자바 프로그램에서 SQL을 실행하고 데이터를 가져오거나 변경하는 등의 데이터베이스 작업에 필요한 기능을 제공하는 인터페이스와 클래스의 집합이라고 할 수 있다.

 

회원가입을 다루는 간단한 JDBC 설계에 대해서 알아보자.

 

[JDBC 구조]

JDBC를 설계하려고 할 때, 크게 4가지 클래스로 나눌 수 있다.

 

1. MemberVo

2. Member ~~ Controller

3. MemberService

4. MemberDao

 

1. MemberVo

db 테이블 구조

 

 

MemberVo 클래스

 

 MemberVo 클래스에는 Oracle로 미리 구현해 놓은 유저 테이블에 컬럼들을 필드로 지정한 클래스이다.

내가 자바코드를 통해서 유저 테이블에 접근하거나, 테이블로부터 결과를 리턴받아야 하는 경우에 MemberVo 클래스 객체를 통해서 값을 주고 받으면 유연하게 데이터를 처리할 수 있다.

 

2. MemberJoinController

 

해당 컨트롤러에서는 사용자에 입력값에 따른 요청에 대해서 데이터를 입력받고, 해당 데이터를 통해서 1번에서 말한 MemberVo 객체를 생성하여 해당 객체로 MemberService의 ~~ 기능을 하는 메서드에 객체를 넘겨준다. 반환으로는 DB 접근을 통한 결과를 반환 받고, 해당 결과를 통해서 어떤 응답을 넘겨줄지에 대한 작업을 한다.

 

Servlet doGet() 메서드

 MemberJoinController는 @WebServlet 어노테이션으로 사용자가 /member/join 요청을 보내게 되면 어떤 작업을 처리해야할지 대기한다. 요청에는 여러방식이 있는데 대표적으로 get 방식과 post 방식이 존재한다.

 

사용자가 get 요청을 하게 된다면, req.getRequesDispatcher() 메서드와 forward()메서드를 통해서 프로젝트 내에 java와 html 구조를 동시에 가지고있는 jsp 파일에 요청과 응답을 포워딩한다. 자바코드만으로도 Printwrite 오브젝트를 통해서 out.print() 메서드로 사용자에게 html 마크업 코드를 시각적으로 보여줄 수는 있지만 상당히 귀찮은 작업이므로 jsp를 통해서 html과 jstl + java 를 활용하여 사용자에게 화면을 응답을 해줄 수 있다.

 

 

doPost() 메서드에는 post방식의 사용자 요청을 서버에서 받았을 때, 해당 메서드가 실행된다. 

 

 

사용자가 post방식으로 요청을 보낼 때, form태그를 사용했다면 사용자 입력값은 req객체에 파라미터에 값이 들어온다. 해당 파라미터의 값을 참조하기위해서 req.getParameter(input 태그에 name속성값); 을 사용한다.

 

 

아까 말했듯, 홈페이지 사용자를 다룰 DB 테이블 구조를 가지고있는 MemberVo 클래스로부터 객체를 생성해서 해당 객체에 setter메서드를 통해 사용자가 사용하고싶어하는 id, pwd, nick을 필드값으로 할당한다.

 

 

사용자가 설정하고싶어하는 입력값을 담고있는 객체(vo)를 통해 memberService 클래스에 join() 메서드를 실행하고 결과를 리턴받는다.  try catch 구조를 통해서 만약 오류가 발생했다면 catch구문이 실행되어 에러에 대한 내용을 printStackTrace() 메서드를 통해서 출력하고, resp.sednRedirect() 메서드를 통해서 /error 요청에 대한 작업을 처리하고 문제가 없이 정상적으로 실행되어 회원가입이 정상적으로 완료되었다면 /member/login 요청을 처리하여 로그인 웹페이지를 사용자에게 보여주도록 한다.

 

3. MemberService

 

 

다음은 MemberService 에 회원가입 메서드의 join() 메서드를 알아보자.

해당 메서드에서는 SqlSession을 생성하여 쿼리문 데이타를 담아둘 수 있는 객체를 생성하고 sqlsession 객체와 사용자 정보가 담긴 vo 객체를 통해 MemberDao 클래스의 join() 메서드를 실행한다. 반환받은 결과를 토대로 조건문을 통해 해당 쿼리문을 커밋할지 롤백할지 결정한다. sqlsession의 자원을 사용했으면 자원을 반납해주어야 하므로 finally 블럭에 close() 메서드를 통해 닫아주고 return으로 결과를 반환한다.

 

 

4. MemberDao

 

 

 MemberDao클래스에서는 직접 생성한 sqlsession 객체에 쿼리문을 담아주고 실행시키는 작업을 한다. 

Sqlsession 객체에는 sql 명령문을 처리하는 메서드를 가지고 있다. INSERT 명령문을 실행시켜주기 위해서 insert() 메서드를 사용하며, 파라미터 2번째로 사용자가 사용하고 싶어하는 데이터가 담긴 객체가 들어간다. 그러면 구체적인 sql 쿼리문은 대체 어디있냐면, "MemberMapper.join"을 확인해야한다.

 

mybatis 설정으로 쿼리문을 미리 설정해두고 해당 쿼리문에 키워드를 통해서 쿼리문을 불러올 수 있다.

mybatis 구성에 담긴 설계도같은 xml 파일 내부를 확인해 보면

 

 다음과 같이 mappers 라는 태그로 쿼리문에 대해서 다루고 있는 xml 파일을 포함시키도록하는 코드가 존재한다.

member-mapper.xml 에는 다음과 같은 구문이 존재한다.

 

 

쿼리문을 매핑하기위해서 가장 큰 키워드는 mapper태그에 namespace 속성으로 지정해줄 수 있다.

그리고 mapper 태그 내에서 sql에 존재하는 DDL DML 명령어와 동일하게 태그가 존재한다.

회원가입은 테이블에 INSERT 해주어야하는 작업이므로 insert 태그를 통해서 id속성에 부키워드로 join을 설정하였다.

그리고 해당 태그내에 내가 사용하려는 INSERT 쿼리문을 적어주면 된다.

 

 여기서 아까 MemberDao에 insert()메서드에 2번째 파라미터로 사용된 사용자가 입력한 데이터가 담긴 vo 객체에 대해서 해당 쿼리문에 사용하기 위해서 #{userId}와 같이 #{객체의 필드명}을 통해서 쿼리문을 작성해주면 된다. 

 

그러면 MemberDao에서 vo객체로하여금 필드에 담긴 데이터로 해당 쿼리문이 작동하게 되고 결과로 수정된 행의 개수를 리턴하게 되는것이다.

 

login 기능도 다음 구조와 매우 흡사하다 다만, MemberDao에서 sqlsession을 통한 메서드 실행으로 .seleteOne() 메서드를 사용하게 되고 매핑된 쿼리문 키워드("MemberMapper.login") 그리고 접속하려는 아이디와 비밀번호가 담긴 객체(vo)를 메서드에 담아주기만 하면된다.

 

 

 selectOne() 메서드의 경우 한 개의 열 결과가 반환되는 명령문 기능을 할 것이므로 mapper.xml 파일에서 resultType 속성으로 MemberVo (객체를 담고있는 클래스 위치) 를 값으로 설정해주면 selectOne() 메서드로 반환되는 타입은 MemberVo형식의 객체로 반환하게 된다.

 

 모든 사용자 목록을 받아오고 싶다면 selectList()를 쓰게되고 해당 메서드는 resultType을 동일하게 MemberVo로 설정하게 되면 각각의 결과에 대해서 객체를 생성해서 리스트에 담아 반환해준다. 그리서 반환되는 타입은 List<MemberVo> 이다.