Front-end

JSP & Servlet DAY 6 ( 회원관리 시스템 실습, MVC, JDBC, Maven, Mybatis )

도키마 2024. 7. 31. 17:41



 

 

 

 

오늘의 노래 추천 🧚‍♀️

 

 
피터팬 (Peter Pan)
아티스트
EXO
앨범
The 1st Album 'XOXO' Repackage
발매일
1970.01.01

 

요즘 피터팬만 들으면 심장이 너무 아파요

 

 


 

 

 

 

 

 

 

 

 

 

 

 

DAY 6

 

 

 

 

 

 

 

 

 

 

 

 

 

ㅡ  MVC pattern ㅡ

디자인 패턴 중 하나인 mvc 패턴

 

model2

 

 

 

 

 

 

 

 

ㅡ  JDBC, MVC pattern model 1,2실습 ㅡ

 

model1 ㅡ> 로직과 view 를 모두 jsp 에 작성

model2 ㅡ> 로직과 view 파일을 분리 작성

 

 

 

 

ㅡ DB 연결 및 파일 생성 (jdbc) ㅡ

 

Data Source Exlorer

  

Oracle 선택

 

Oracle 11 선택

 

JAR List 에서 Add JAR 후 경로 선택

 

xe, localhost 설정

 

sql 파일 생성

 

type, name, database 설정

 

 

 

 

ㅡ sql 테이블, 컬럼 생성 코드 ㅡ

 create, select, insert into, values

create table mvcTable (name varchar2(30), age varchar2(10), phone varchar2(35));

SELECT * FROM MVCTABLE;

insert into mvctable values('박소희',22,'010-1234-5678');

 

 

 

model1

ㅡ model1 JSP 파일에 JDBC 코드 복붙 (ㅎㅎ)

Class.forName

 

	<%
		// MVC Model1 ㅡ> Logic과 View를 모두 jsp에 작성
		String name = "";
		String age = "";
		String phone = "";
		
		// 1. 오라클과 연결할 드라이버 객체 만들기
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		
		try { // 1. 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			// 2. DB 연결
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "12345";
			
			conn = DriverManager.getConnection(url, user, password);
			
			if(conn != null) {
				System.out.println("연결성공");
			}else {
				System.out.println("연결실패");
			}
			
			// 3. sql Query 문 작성
			// 로그인 > 테이블에 데이터가 있는지, 그 데이터와 일치하는지 확인
			// 아이디, 비밀번호가 일치하는 데이터의 모든 컬럼 가져오기
			
			String sql = "SELECT * FROM MVCTABLE";
			
			psmt = conn.prepareCall(sql);
			
			// ? 인자 채워주기 (데이터 바인딩)
			//psmt.setString(1, id);
			//psmt.setString(2, pw);
			
			// 4. sql 문 실행
		
			rs = psmt.executeQuery();// 리턴타입이 ResultSet
			// 실행을 위해서 executeQuery 를 사용하는데 리턴타입이 ResultSet
			// 조회된 데이터를 테이블형태로 표현하는 자료구조
			// cursor 형태로 컬럼명을 가르키고 있기에 한칸 내려줘야 데이터에 접근 가능
			// * cursor 가 가르키고 있는 데이터만 가져올 수 있음
			
			// rs.next();
			// 커서를 내렸을 때 값이 있으면 true 를 반환 그렇지않으면 false 반환
			
			if(rs.next()) {
				name = rs.getString(1);
				age = rs.getString(2);
				phone = rs.getString(3);
				System.out.println(name+"님 환영합니다");
			}else {
				System.out.println("로그인에 실패했습니다");
				System.out.println("ID 와 비밀번호를 확인해주세요");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally { // 5. DB 연결 종료(자원 반납)
			try {
				if(rs != null) {
					rs.close();
				}if(psmt != null) {
					psmt.close();
				}if(conn != null) {
					conn.close();
				}
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	%>
	이름 : <%=name %>
	나이 : <%=age %>
	번호 : <%=phone %>

 

** WEB-INFO 의 라이브러리에 oracle6 파일 넣어주기

 

 

콘솔 출력
출력 결과

 

 

 

 

 DTO 생성 

constructor, getter and setter

 

public class UserDTO {
	
	String name;
	String age;
	String phone;
	
	public UserDTO(String name, String age, String phone) {
		this.name = name;
		this.age = age;
		this.phone = phone;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}
}

 

 

 

 

 

JSP 영역에 DTO 객체 생성 

new UserDTO

 

dto.get

 

get

 

getter 메서드를 이용해 dto 객체 값 받아주기 

 

 

 

 

model2

ㅡ model2 JSP 파일에 JDBC 코드 복붙 (ㅎㅎ) 

Class.forName

 

 

 

UserDAO 자바 파일을 생성 후 생성자 객체 안에 jdbc 코드 그대로 담아주기

 

public class UserDAO {

	// 생성자 객체 내에 jdbc 코드 담아주기
	public UserDAO() {
		// 1. 오라클과 연결할 드라이버 객체 만들기
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;

		try { // 1. 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. DB 연결
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "12345";

			conn = DriverManager.getConnection(url, user, password);

			if (conn != null) {
				System.out.println("연결성공");
			} else {
				System.out.println("연결실패");
			}

			// 3. sql Query 문 작성
			// 로그인 > 테이블에 데이터가 있는지, 그 데이터와 일치하는지 확인
			// 아이디, 비밀번호가 일치하는 데이터의 모든 컬럼 가져오기

			String sql = "SELECT * FROM MVCTABLE";

			psmt = conn.prepareCall(sql);

			// ? 인자 채워주기 (데이터 바인딩)
			// psmt.setString(1, id);
			// psmt.setString(2, pw);

			// 4. sql 문 실행

			rs = psmt.executeQuery();// 리턴타입이 ResultSet
			// 실행을 위해서 executeQuery 를 사용하는데 리턴타입이 ResultSet
			// 조회된 데이터를 테이블형태로 표현하는 자료구조
			// cursor 형태로 컬럼명을 가르키고 있기에 한칸 내려줘야 데이터에 접근 가능
			// * cursor 가 가르키고 있는 데이터만 가져올 수 있음

			// rs.next();
			// 커서를 내렸을 때 값이 있으면 true 를 반환 그렇지않으면 false 반환

			if (rs.next()) {
				// name = rs.getString(1);
				// age = rs.getString(2);
				// phone = rs.getString(3);

				dto = new UserDTO(rs.getString(1), rs.getString(2), rs.getString(3));
				System.out.println(dto.getName() + "님 환영합니다");
			} else {
				System.out.println("로그인에 실패했습니다");
				System.out.println("ID 와 비밀번호를 확인해주세요");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally { // 5. DB 연결 종료(자원 반납)
			try {
				if (rs != null) {
					rs.close();
				}
				if (psmt != null) {
					psmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

 

 

ㅡ ArrayList 생성 후 db 값 저장 ㅡ

 값을 모두 꺼내주기 위해 if 문 대신 while 문으로 값 불러오고 ArrayList에 저장

			ArrayList<UserDTO> users = new ArrayList<UserDTO>();
			while (rs.next()) {
				// name = rs.getString(1);
				// age = rs.getString(2);
				// phone = rs.getString(3);

				dto = new UserDTO(rs.getString(1), rs.getString(2), rs.getString(3));
				users.add(dto);
				System.out.println(dto.getName() + "님 환영합니다");
			}

 

 

 

 

 

ㅡ Servlet 으로 변환 ㅡ

extends HttpServlet 으로 Servlet을 상속해주고 생성자 메서드를 service 메서드로 변환

 

extends HttpServlet
service

 

 

 

 

그냥 ArrayList<UserDTO> 타입을 리턴하는 메서드로 수정 

Servlet으로 변환하지 말고 ArrayList<UserDTO> 타입의 값을 리턴하는 메서드로 수정

 

// 그냥 ArrayList<UserDTO> 타입의 값을 리턴하는 메서드로 만들기
	public ArrayList<UserDTO> dao(){
		
		UserDTO dto;
		ArrayList<UserDTO> users = new ArrayList<UserDTO>();
		// 1. 오라클과 연결할 드라이버 객체 만들기
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;

		try { // 1. 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. DB 연결
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "12345";

			conn = DriverManager.getConnection(url, user, password);

			if (conn != null) {
				System.out.println("연결성공");
			} else {
				System.out.println("연결실패");
			}

			// 3. sql Query 문 작성
			// 로그인 > 테이블에 데이터가 있는지, 그 데이터와 일치하는지 확인
			// 아이디, 비밀번호가 일치하는 데이터의 모든 컬럼 가져오기

			String sql = "SELECT * FROM MVCTABLE";

			psmt = conn.prepareCall(sql);

			// ? 인자 채워주기 (데이터 바인딩)
			// psmt.setString(1, id);
			// psmt.setString(2, pw);

			// 4. sql 문 실행

			rs = psmt.executeQuery();// 리턴타입이 ResultSet
			// 실행을 위해서 executeQuery 를 사용하는데 리턴타입이 ResultSet
			// 조회된 데이터를 테이블형태로 표현하는 자료구조
			// cursor 형태로 컬럼명을 가르키고 있기에 한칸 내려줘야 데이터에 접근 가능
			// * cursor 가 가르키고 있는 데이터만 가져올 수 있음

			// rs.next();
			// 커서를 내렸을 때 값이 있으면 true 를 반환 그렇지않으면 false 반환

			
			while (rs.next()) {
				// name = rs.getString(1);
				// age = rs.getString(2);
				// phone = rs.getString(3);

				dto = new UserDTO(rs.getString(1), rs.getString(2), rs.getString(3));
				users.add(dto);
				System.out.println(dto.getName() + "님 환영합니다");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally { // 5. DB 연결 종료(자원 반납)
			try {
				if (rs != null) {rs.close();}
				if (psmt != null) {psmt.close();}
				if (conn != null) {conn.close();}
			} catch (Exception e) {e.printStackTrace();}
		}
		return users;
	}

 

 

 

 

 

dao 메서드에 name, phone 파라미터 추가  

dao 메서드가 name, phone 파라미터를 받도록 수정

String

 

sql 문에서 where, ?인자, setString 을 이용해 조건 추가해주기

where
rs.next 문장 if 문으로 수정

 

 

 

 

 

  그냥 ArrayList 형태가 아닌 UserDTO 타입으로 내보내기 

ArrayList가 아닌 UserDTO 타입의 값을 내보내는 dao 메서드로 수정

 

// 그냥 ArrayList 형태대신 UserDTO 형태로 리턴하도록 수정
	public UserDTO dao(String name, String phone){
		
		UserDTO dto=null;
		//ArrayList<UserDTO> users = new ArrayList<UserDTO>();
		// 1. 오라클과 연결할 드라이버 객체 만들기
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;

		try { // 1. 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. DB 연결
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "12345";

			conn = DriverManager.getConnection(url, user, password);

			if (conn != null) {
				System.out.println("연결성공");
			} else {
				System.out.println("연결실패");
			}

			// 3. sql Query 문 작성
			// 로그인 > 테이블에 데이터가 있는지, 그 데이터와 일치하는지 확인
			// 아이디, 비밀번호가 일치하는 데이터의 모든 컬럼 가져오기

			String sql = "SELECT * FROM MVCTABLE WHERE name=? AND phone=?";

			psmt = conn.prepareCall(sql);

			// ? 인자 채워주기 (데이터 바인딩)
			psmt.setString(1, name);
			psmt.setString(2, phone);

			// 4. sql 문 실행

			rs = psmt.executeQuery();// 리턴타입이 ResultSet
			// 실행을 위해서 executeQuery 를 사용하는데 리턴타입이 ResultSet
			// 조회된 데이터를 테이블형태로 표현하는 자료구조
			// cursor 형태로 컬럼명을 가르키고 있기에 한칸 내려줘야 데이터에 접근 가능
			// * cursor 가 가르키고 있는 데이터만 가져올 수 있음

			// rs.next();
			// 커서를 내렸을 때 값이 있으면 true 를 반환 그렇지않으면 false 반환

			if (rs.next()) {
				dto = new UserDTO(rs.getString(1), rs.getString(2), rs.getString(3));
				//users.add(dto);
				System.out.println(dto.getName() + "님 환영합니다");
			}else {
				dto=null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally { // 5. DB 연결 종료(자원 반납)
			try {
				if (rs != null) {rs.close();}
				if (psmt != null) {psmt.close();}
				if (conn != null) {conn.close();}
			} catch (Exception e) {e.printStackTrace();}
		}
		return dto;
	}

 

 

 

 

 

 

ㅡ> model2 에서는 jsp 와 model 을 따로 만들어서 model 내에 DAO, DTO를 따로 생성 후

그 중간에 Servlet 파일을 생성해 DAO와 DTO 를 호출하고 로그인체크

 

Servlet 생성

 

 controller 패키지를 새로 생성하고 Servlet 파일 생성

 

 

 

 

 

  UserCheck Servlet 페이지 service 메서드 작성 

dao메서드 객체를 호출하고 UserDTO 타입의 dto 변수에 담아주기

 

service

 

식별자로 getParameter 해준 변수 값을 dao 메서드에 넣고

dao의 리턴값을 UserDTO 타입의 dto 변수에 담아주기

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		String phone = request.getParameter("phone");
		// 식별자로 받아준 값을 DAO 에 담아주기
		
		UserDTO dto = new UserDAO().dao(name,phone);
	
		if(dto == null) {
			// 로그인 실패 페이지로 이동
			response.sendRedirect("LoginFail.jsp");
		}else {
			// 로그인 성공 페이지로 이동
			// 사용자 정보를 session 에 담아주기
			HttpSession session = request.getSession();
			session.setAttribute("user", dto);
			response.sendRedirect("LoginSuccess.jsp");
		}
	}

 

ㅡ> if 문을 이용해 dto 가 null인지 아닌지 확인하고 로그인 실패/성공 jsp 페이지로 Redirect

 

 

 

 

 

 DTO 에 toString 메서드 추가해주기

DTO 타입의 객체를 불러올 수 있도록 to

 

	@Override
	public String toString() {
		return "UserDTO [name=" + name + ", age=" + age + ", phone=" + phone + "]";
	}

 

 

 

 

 DTO 에 toString 메서드 추가해주기 

dao메서드 객체를 호출하고 UserDTO 타입의 dto 변수에 담아주기

 

// Ex02Model2.jsp
<body>
	<form action="UserCheck">
		이름 : <input type="text" name="name"><br>
		번호 : <input type="text" name="phone"><br>
		<input type="submit">
	</form>
</body>

 

// LoginSuccess.jsp
<body>
	${user }
	로그인 성공
	<a href="Ex02Model2.jsp">처음으로 이동</a>
</body>

 

// LoginFail.jsp
<body>
	로그인 실패
	<a href="Ex02Model2.jsp">처음으로 이동</a>
</body>

 

 

 

 

 

 

 

 

 

 

 

 

ㅡ  Maven ㅡ

Build의 자동관리 도구 maven

 

 

Build 란?

 ㅡ> project에서 사용된 여러 소스코드 등을 실행가능한 독립적 소프트웨어 산출물로 바꿔주는 과정

프로젝트가 완성되면 코드 파일을 WAR, JAR 등 실행가능한 압축파일로 만드는 과정

 

war, jar

 

 

 

 

maven 은  pom.xml 설정파일을 이용해 라이브러리를 자동 다운로드

표준화된 포멧으로 협업이 유리하고 다양한 plug in으로 작업 자동화 

 

" Graddle 이 뜨는 추세니까 따로 찾아보길 추천 "

 

 

 

 

 

maven 템플릿

 

project 명

 

maven 프로젝트

 

Dynamic web project와 비교하면 target 폴더와 pom.xml 파일이 생김 

 

 

 

 

 

 

 

 

 ㅡ Maven 회원관리 시스템 실습 ㅡ

 

 

 

 

 

기본 틀 jsp 파일 작성 

dao메서드 객체를 호출하고 UserDTO 타입의 dto 변수에 담아주기

 

jsp 파일

 

// main.jsp
<body>
	<h1>안녕하세요</h1>
	<a href="login.jsp"><button>로그인</button></a>
	<a href="join.jsp"><button>회원가입</button></a>
</body>

 

// join.jsp
<body>
	<form action="main.jsp">
		<input type="text" placeholder="아이디를 입력하세요" name="id"><br>
		<input type="text" placeholder="비밀번호를 입력하세요" name="pw"><br>
		<input type="text" placeholder="닉네임일 입력하세요" name="nick"><br>
		<input type="submit" value="JOIN">	
	</form>
</body>

 

// login.jsp
<body>
	<form action="main.jsp">
		<input type="text" placeholder="아이디를 입력하세요" name="id"><br>
		<input type="text" placeholder="비밀번호를 입력하세요" name="pw"><br>
		<input type="submit" value="LOGIN">	
	</form>
</body>

 

 

 

 

 

 

 

 

Database 에 사용자의 정보 저장 후 확인 ( MyBatis 이용 ) 

 기본틀에서 jdbc 코드와 mvc 패턴을 사용해 DB 연결 후 사용자 정보 저장, 확인

 

 

 

 

*ㅡ Maven 에서의 url mapping ㅡ*

web.xml의 welcome file list 에서 수정

 

web.xml
welcome file list

 

index.jsp를 main.jsp로 수정

 

url mapping 전
url mapping 후

 

 

 

 

 

*ㅡ Maven 에서의 url mapping ㅡ*

Maven에서는 프로젝트 내의 web.xml 을 사용해서 url-mapping

 

 

web.xml

 

ㅡ> Maven 에서 Servlet 파일을 생성하면 annotation이 없고 web.xml 에 url mapping 값 존재

 

 

 

 

 

DB에 Table 생성 

sql 문으로 db에 table 생성해주기

 

create table MEMBER (name varchar2(30), age varchar2(10), nick varchar2(35));

SELECT * FROM MEMBER;

insert into MEMBER values('박소희',22,'dokima');

 

 

 

 

 

model 패키지 영역에 DTO 생성  

생성자, getter setter toString 메서드 작성

 

public class DTO {

	String id;
	String pw;
	String nick;
	
	public DTO(String id, String pw, String nick) {
		
		this.id = id;
		this.pw = pw;
		this.nick = nick;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getNick() {
		return nick;
	}
	public void setNick(String nick) {
		this.nick = nick;
	}
	
	@Override
	public String toString() {
		return "DTO [id=" + id + ", pw=" + pw + ", nick=" + nick + "]";
	}

}

 

java 파일 구조

 

 

 

 

 

Maven DB 연동하기  

pom.xml 설정파일에 dependency 복붙

 

https://mvnrepository.com/

 

pom.xml

 

libraries

 

라이브러리에 ojdbc8 추가 확인

 

 

 

 

MyBatis 를 이용해 DB 연동하기  

pom.xml 설정파일에 dependency 복붙

 

1. 기존 DAO 클래스 방식 ◁ 사용

2. Mapper interface 방식

3. annotation 방식

 

pom.xml

 

eclipse 내에서 설치방법

 

 

 

 

model 영역에 MyBatis xml 파일 생성  

pom.xml 설정파일에 dependency 복붙

 

https://mybatis.org/mybatis-3/getting-started.html

 

mybatis – MyBatis 3 | Getting started

It's very important to understand the various scopes and lifecycles classes we've discussed so far. Using them incorrectly can cause severe concurrency problems. Dependency Injection frameworks can create thread safe, transactional SqlSessions and mappers

mybatis.org

 

xml 코드 복붙

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/smhrd/model/MemberMapper.xml"/>
  </mappers>
</configuration>

 

window preferences

 

preferences에서 Download external resources like referenced 어쩌구 체크

 

 

 

 

 model 영역에 db.properties file 생성  

driver, url, username, password 작성(띄어쓰기 x)

 

db.properties

 

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=hr
password=12345

 

 

 

 

 

mybatis-config.xml 파일 수정 

mapper 태그의 resource를 수정하고 db.properties와 연결을 위해 properties 태그 작성

 

mapper resource
properties

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- db.properties와 연결 -->
	<properties resource="com/smhrd/model/db.properties"></properties>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/smhrd/model/MemberMapper.xml"/>
  </mappers>
</configuration>

 

 

 

 

 

 model 영역에 MemberMapper.xml 파일 생성  

Exploring Mapped SQL Statements 내용 복붙

 

MemberMapper.xml

 

// 초기 복붙 상태
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

 

 

▽  select 문장 수정 및 insert 문 추가

<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectOne" parameterType="DTO" resultType="DTO">
  <!-- resultType : 문장이 실행됐을때 리턴할 타입 (DTO 타입으로 지정)-->
  <!-- parameterType :  id, pw 등 값의 리턴타입 -->
    select id, nick from member where id = #{id} and pw = #{pw}
  </select>
  
  <!-- insert 문장 추가 -->
  <!-- executeUpdate의 리턴타입은 int 타입의 row -->
  <insert id="insert" parameterType="DTO">
  	<!-- 쿼리문 작성 -->
  	insert into memeber values(#{id}, #{pw}, #{nick})
  </insert>
</mapper>

 

 resultType과 parameterType 을 DTO로 지정

 

 

 

 

 

 model 영역에 db 와 직접적으로 연결할 java 클래스 생성 ㅡ

SqlSessionManager 클래스 생성

 

class 생성

파일 구조

 

 

 

 

 

 model 영역에 db 와 직접적으로 연결할 java 클래스 생성 ㅡ

SqlSessionManager 클래스 생성 후 static 영역에 Sqlsession 복붙

 

static {
		String resource = "org/mybatis/builder/mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(inputStream);
	}

 

 

 

 

어려우니 집중바람

mybatis-config.xml 경로를 지정 및 SqlSessionFactory 생성

mybatis-config.xml 파일 경로를 resource 변수에 저장 후

Resources.getResourceAsReader 메서드로 물자열 경로 파일을 읽기

 

builder객체의 build 매서드로 reader 후 리턴값을 factory 변수에 저장

 

	static {
		// 설정정보를 가지고 오기위한 mybatis-config.xml파일의 경로 지정
		String resource = "org/mybatis/builder/mybatis-config.xml";

		Reader reader;
		try {
			// 문자열 경로로 파일 읽기(reader)
			reader = Resources.getResourceAsReader(resource);

			// builder 객체의 build 메서드
			// 읽은 정보를 토대로 DB관련 정보를 가진 SqlSessionfactory 생성
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			factory = builder.build(reader);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

 

 dao 에 SqlSessionManager 불러오기 위해

ㅡ> 불러올 수 있는 getSqlSession 메서드 먼저 생성

* factory를 리턴함

 

// 
	public static SqlSessionFactory factory;
	static {
		// 설정정보를 가지고 오기위한 mybatis-config.xml파일의 경로 지정
		String resource = "org/mybatis/builder/mybatis-config.xml";

		Reader reader;
		try {
			// 문자열 경로로 파일 읽기(reader)
			reader = Resources.getResourceAsReader(resource);

			// builder 객체의 build 메서드
			// 읽은 정보를 토대로 DB관련 정보를 가진 SqlSessionfactory 생성
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			factory = builder.build(reader);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	// SqlSessionFactory 를 dao에 불러올 수 있는 메서드 생성
	public static SqlSessionFactory getSqlSession() {
		return factory;
	}

 

 SqlSessionFactory 타입의 factory 변수를 public static (?)

 

 

 

 

mapper 에서 쓸 경로 지정 ( 별명 지정 )  

mybatis-config.xml 에서 typeAliases 태그 추가 

 

typeAliases
mapper에서 사용할 별명 지정

 

com.smhrd.model.DTO 의 별칭을 DTO 로 설정

<typeAliases><!-- mapper에서 사용할 별명 지정 -->
		<typeAlias type="com.smhrd.model.DTO" alias="DTO"/>
	</typeAliases>

 

 

 

 

 


java 파일 구조

 

webapp 구조

 

이제 본격적으로 model 영역에 DAO 생성하기 ㅡ

 

 

 

 

MemberDAO 에 join 메서드 작성 ㅡ

회원가입 시 불러와야하는 mapper 값은 insert

 

자동 커밋을 위해 sqlSessionFactory의 openSession 메서드 불러오기

수행 결과 저장용 session.insert 메서드 변수 생성

id, pw, nick 을 하나로 묶은 DTO 타입의 member 변수를 파라미터로 받아줌

 

	// SqlSessionFactory 생성 : DB 관련 기능을 직접 사용할 수 있는 SqlSession 생성
	SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
	SqlSession session;
	
	// executeUpdate의 리턴타입 int
	// 불러와야하는 mapper 값은 insert
	public int join(DTO member) {
		
		// openSession() : 오토커밋 옵션을 가짐 true 면 자동으로 커밋함
		session = sqlSessionFactory.openSession(true);
		
		// 수행 결과 저장용 변수 생성
		int row =0;
		row = session.insert("insert", member);
		
		return row;
	}

 

 

 

 

 

join 메서드 시험해보기 ㅡ

join.jsp 에서 JoinService 로 form 제출

 

<body>
	<form action="JoinService" method="post">
		<input type="text" placeholder="아이디를 입력하세요" name="id"><br>
		<input type="text" placeholder="비밀번호를 입력하세요" name="pw"><br>
		<input type="text" placeholder="닉네임일 입력하세요" name="nick"><br>
		<input type="submit" value="JOIN">	
	</form>
</body>

 

 

 

 

 

JoinService  코드 작성 ㅡ

 

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String nick = request.getParameter("nick");
		
		// DTO 받아주기
		DTO member = new DTO(id, pw, nick);
		MemberDAO dao = new MemberDAO();
		int row = dao.join(member);
		
		if(row>0) {
			// 성공
			response.sendRedirect("login.jsp");
		}else {
			// 실패
			response.sendRedirect("join.jsp");
		}
	}

 

 

 

 

 

login 메서드 시험해보기 ㅡ

login.jsp 에서 LoginService로 form 제출

 

 

 

ㅡ dao 에 select 메서드 작성 ㅡ

dto타입의 member 파라미터로 받아주기

null 값 return

 

ㅡ> 파라미터와 리턴값 지정 완료

 

 

 

 

 

 

 LoginService  코드 작성 ㅡ

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		// 객체 DTO에 담기
		DTO member = new DTO(id, pw, null);
		// DB와 연결 후 
		MemberDAO dao = new MemberDAO();
		DTO loginMember = dao.login(member);
		
		if(loginMember!=null) {
			// 로그인 성공(환영합니다 페이지)
			// 세션 객체 생성
			HttpSession session = request.getSession();
			session.setAttribute("loginMember", loginMember);
			response.sendRedirect("main.jsp");
		}else {
			// 로그인 실패
			response.sendRedirect("main.jsp");
		}
		
	}

 

 

 

 

 

 

ㅡ dao 마저 완성 ㅡ

 

public DTO login(DTO member) {
		
		session = sqlSessionFactory.openSession(true);
		DTO loginMember = session.selectOne("selectOne", member);
		return loginMember;
	}

 

 

 

(수정중)




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 



 

 

 

 

 

 

BYE