오늘의 노래 추천 🧚♀️
- 아티스트
- EXO
- 앨범
- The 1st Album 'XOXO' Repackage
- 발매일
- 1970.01.01
요즘 피터팬만 들으면 심장이 너무 아파요
DAY 6
ㅡ MVC pattern ㅡ
디자인 패턴 중 하나인 mvc 패턴

ㅡ JDBC, MVC pattern model 1,2실습 ㅡ
model1 ㅡ> 로직과 view 를 모두 jsp 에 작성
model2 ㅡ> 로직과 view 파일을 분리 작성
ㅡ DB 연결 및 파일 생성 (jdbc) ㅡ







ㅡ 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



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 메서드로 변환


ㅡ 그냥 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 파라미터를 받도록 수정

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


ㅡ 그냥 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 를 호출하고 로그인체크

controller 패키지를 새로 생성하고 Servlet 파일 생성
ㅡ UserCheck Servlet 페이지 service 메서드 작성 ㅡ
dao메서드 객체를 호출하고 UserDTO 타입의 dto 변수에 담아주기

식별자로 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 등 실행가능한 압축파일로 만드는 과정

maven 은 pom.xml 설정파일을 이용해 라이브러리를 자동 다운로드함
표준화된 포멧으로 협업이 유리하고 다양한 plug in으로 작업 자동화
" Graddle 이 뜨는 추세니까 따로 찾아보길 추천 "



Dynamic web project와 비교하면 target 폴더와 pom.xml 파일이 생김
ㅡ Maven 회원관리 시스템 실습 ㅡ
ㅡ 기본 틀 jsp 파일 작성 ㅡ
dao메서드 객체를 호출하고 UserDTO 타입의 dto 변수에 담아주기

// 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 에서 수정


index.jsp를 main.jsp로 수정


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


ㅡ> 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 + "]";
}
}

ㅡ Maven DB 연동하기 ㅡ
pom.xml 설정파일에 dependency 복붙


라이브러리에 ojdbc8 추가 확인
ㅡ MyBatis 를 이용해 DB 연동하기 ㅡ
pom.xml 설정파일에 dependency 복붙
1. 기존 DAO 클래스 방식 ◁ 사용
2. Mapper interface 방식
3. annotation 방식


ㅡ 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>

preferences에서 Download external resources like referenced 어쩌구 체크
ㅡ model 영역에 db.properties file 생성 ㅡ
driver, url, username, password 작성(띄어쓰기 x)

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=hr
password=12345
ㅡ mybatis-config.xml 파일 수정 ㅡ
mapper 태그의 resource를 수정하고 db.properties와 연결을 위해 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 내용 복붙

// 초기 복붙 상태
<?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 클래스 생성


ㅡ 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 태그 추가


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


ㅡ 이제 본격적으로 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