오늘의 노래 추천
- 아티스트
- SuperM
- 앨범
- Super One - The 1st Album
- 발매일
- 1970.01.01
- 아티스트
- SuperM
- 앨범
- Super One - The 1st Album
- 발매일
- 1970.01.01
DAY 8
ㅡ MVC 회원관리 시스템 실습 ㅡ
Maven Project, JDBC
로그인 성공 시 개인정보 수정, 회원 탈퇴, 로그아웃 기능 추가
ㅡ delete.jsp 파일 생성 ㅡ
탈퇴를 진행할건지 확인문을 출력하고 pw를 입력받음
<body>
<%
MemberDTO user = (MemberDTO) session.getAttribute("user");
%>
<%=user.getNick()%> If you REALLY want to leave, Enter your password
<form action="delete" method="post">
<input readonly value="<%=user.getId()%>" type="text" name="id"><br>
<input type="password" name="pw"><br>
<button>LEAVE FOREVER</button>
</form>
</body>
ㅡ MemberDAO 에서 delete메서드 생성 ㅡ
dto 를 파라미터로 받고 delete from 쿼리문을 작성해 회원정보 삭제
// 4. 회원 탈퇴
public int delete(MemberDTO dto) {
try {
getConn(); // DB 연결
// MEMBER2 테이블에서 user id, pw가 일치하는 사용자의 정보를 delete
String sql = "delete from member2 where id=? and pw=?";
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, dto.getId());
psmt.setString(2, dto.getPw());
// 4. sql문 실행
cnt = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 자원 반납
close();
}
// SQL문 실행결과 리턴
return cnt;
}
ㅡ DeleteController 클래스 생성 ㅡ
리턴값이 int 인 delete메서드의 리턴값에 따라 탈퇴 실패 성공 여부 판단
ㅡ> delete 성공 시 세션 삭제 (invalidate)
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 파라미터 로딩
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
MemberDTO dto = new MemberDTO();
dto.setId(id);
dto.setPw(pw);
// 2. 기능 실행
MemberDAO dao = new MemberDAO();
int cnt = dao.delete(dto);
// 3. 페이지 이동(수정 결과에 따라 main 페이지 변경)
if (cnt > 0) { // delete 성공
System.out.println("탈퇴 성공");
// delete 성공할 경우 session 정보를 reset
HttpSession session = request.getSession();
session.invalidate();
response.sendRedirect("main.jsp");
} else { // delete 실패
System.out.println("탈퇴 실패");
response.sendRedirect("update.jsp");
}
}
ㅡ MVC 패턴 회원관리 시스템 실습 ( myBatis 활용 ) ㅡ
Maven Project, mybatis
ㅡ Maven 프로젝트 생성 ㅡ
pom.xml 에 dependencies 태그 추가해주기

ㅡ 파일 불러오기 ㅡ
assets, images, views 파일을 각각 webapp, WEB-INF 폴더에 import

href, src = 요청해서 파일을 가져오는 방식
프로젝트 명까지의 경로는 자동으로 url추가됨
ㅡ> http://localhost8081/(프로젝트명)/ 이라는 자동추가되는 경로는 webapp 폴더를 지칭
* webapp을 기준으로 파일 경로를 작성
ㅡ 404 WEB-INF 에러 ㅡ
web-inf 폴더의 파일은 서버에서 차단

view jsp 파일에서 요청을 받을 수 없게 되었기 때문에
ㅡ> 모든 요청은 Controller 가 받게됨
( 요청을 Controller로 받고 Controller를 통해서 jsp 파일로 이동 )
ㅡ GoMainController 클래스 생성 ㅡ
views 폴더의 jsp 파일로 페이지를 이동하는 코드 작성
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 파라미터 수집
// 2. 기능 실행
// 3. 페이지 이동
String url = "WEB-INF/views/main.jsp";
// redirect : Controller --> Controller 다시 요청하는 경우
// forward : Controller --> jsp 이동하는 경우
RequestDispatcher rd = request.getRequestDispatcher(url);
// Controller가 갖고있는 request, response를 forward로 넘겨줘야함
rd.forward(request, response);
}
Redirect 는 클라이언트의 요청을 받아 Controller가 url을 응답으로 주고
클라이언트는 받은 응답으로 Controller로 다시 요청을 하기 때문에
ㅡ> Controller에서 jsp 파일로 이동하는 경우 forward 를 사용해야함
ㅡ 프로젝트 실행 ㅡ
run on server 선택 후 url mapping값을 입력해 연결


ㅡ DB 테이블을 모아둘 entity 패키지 생성 ㅡ
entity 패키지에 sql 파일 생성 후 member 테이블 생성해주기
* constraint 로 primary key 를 email로 지정
create table member(
email varchar2(100),
pw varchar2(100) not null,
tel varchar2(100),
address varchar2(200),
constraint member_email_pk primary key (email)
);
ㅡ lombok 다운로드 ㅡ
lombok 다운로드 후 jar 파일에서 specify location
https://projectlombok.org/download
Download
projectlombok.org

https://mvnrepository.com/search?q=lombok
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
</dependencies>

repository에서 lombok dependency 복붙
ㅡ Member DTO 클래스 생성 ( lombok ) ㅡ
DTO는 DB테이블과 동일한 이름으로 생성하는게 트랜드


getter setter를 받아주는 대신 Member위에 annotation으로 lombok.data 임포트 ( lombok )
ㅡ> getter와 setter를 자동으로 생성 ( 필드 변수명이 바뀌어도 적용 )

생성자 또한 lombok으로 import 가능함

필드 위에 NonNull anntation을 작성하고 RequiredArgsConstructor 사용가능
@RequiredArgsConstructor // 필요한(NonNull) 필드만 초기화하는 생성자 자동 생성
@AllArgsConstructor // 모든 필드 초기화 생성자 자동 생성
@NoArgsConstructor // 기본생성자 자동 생성
@Data // getter/setter를 자동으로 생성
public class Member {
@NonNull
private String email;
@NonNull
private String pw;
private String tel;
private String address;
}
ㅡ MyBatipse 설치 ㅡ



파일 구조 설정
ㅡ main.jsp 에서 회원가입 태그 수정 ㅡ
회원가입 form 태그에 action을 추가하고 각 input에 name 추가

ㅡ JoinController 클래스 생성 ㅡ
join 으로 url mapping
파라미터를 불러와 join 메서드 기능 실행 후 view 선택해 페이지 이동
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. parameter 수집
request.setCharacterEncoding("utf-8");
String email = request.getParameter("email");
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
Member member = new Member();
member.setEmail(email);
member.setPw(pw);
member.setTel(tel);
member.setAddress(address);
// 2. 기능 실행
// 3. view 선택
}
ㅡ MemberDAO 클래스, MemberMapper.xml 파일 생성 ㅡ
com.smhrd.dao 를 패키지이름으로 MemberDAO 클래스 생성


// 프레임워크 : 개발 효율을 위해 미리만들어둔 규칙 or 코드
// MyBatis
// JDBC --> 프레임워크
// ** Class 파일과 xml 파일을 같이 사용
// Class : 실행될 메서드 정의(dao)
// xml : sql문 정의
ㅇㅇㅇㅇ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smhrd.dao.MemberDAO">
<!-- namespace 속성이 dao를 가르킬 수 있도록 수정 -->
<!-- ctrl+shift+/ ==> 주석기호 단축키 -->
</mapper>
ㅡ pom.xml에 dependency 코드 붙여넣기 ㅡ
ojdbc8, myBatis
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
ㅡ db.properties 파일 생성 ㅡ
com.smhrd.database 패키지에 db.properties 파일 생성
# 값을 저장할 때 사용(space bar 금지)
properties_name=hello
# db연결에 필요한 정보 4가지 저장
username=hr
password=12345
url=jdbc:oracle:thin:@localhost:1521:xe
driver=oracle.jdbc.driver.OracleDriver
ㅡ config.xml 파일 생성 ㅡ
mybatis 에서 building sqlSessionFactory from XML 코드 붙여넣기
https://mybatis.org/mybatis-3/getting-started.html
<?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>
<properties resource="com/smhrd/database/db.properties"></properties>
<!-- property 데이터 값을 적은 파일 경로를 resource에 작성 -->
<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/dao/MemberMapper.xml"/>
</mappers>
</configuration>
property 데이터 값을 적은 파일 경로를 properties 태그 생성 후 resource 속성에 작성
mapper 태그 내 resource 속성을 현재 mapper 경로에 알맞게 수정


ㅡ FactoryManager 파일 생성 ㅡ
com.smhrd.database 패키지에 FactoryManager 파일 생성
ㅡ> SqlSessionFactory 객체 생성 ( driver connection )
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
private static SqlSessionFactory sqlSessionFactory;
static { // static 변수, 메서드 로드가 끝나면 바로 실행(서버 시작하자마자)
try {
String resource = "com/smhrd/database/config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public static void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
FactoryManager.sqlSessionFactory = sqlSessionFactory;
}
ㅡ main 파일 구조 ㅡ
mybatis

ㅡ MemberDAO에 SqlSessionFactory 객체 받아오기 ㅡ
FactoryManager 클래스의 SqlSessionFactory 불러오기
ㅡ> static으로 선언했기 때문에 별도의 객체생성없이 불러오기 가능

먼저 xml 에 SQL 문을 정의 후 DAO 영역에 메서드 작성
ㅡ MemberMapper.xml 파일 작성 ㅡ
실행하고자하는 sql문 키워드가 태그 이름이 됨
<!-- 실행하고자하는 sql문 키워드가 태그 이름 -->
<!-- #{변수명} : 해당 자리에 변수값을 출력하겠다 -->
<!-- id 속성 : DAO 메서드와 SQL 쿼리를 연결하기 위한 식별자-->
<!-- parameterType 속성 : 여러변수를 넣을 때, 어떤 DTO로 묶어서 넣어줄지 명시
#{}로 선언해둔 변수명을 모두 포함하고 있어야함 -->
<insert id="join" parameterType="com.smhrd.entity.Member">
insert into member
values(
#{email},
#{pw},
#{tel},
#{address}
)
</insert>
dao 에서 기능을 실행시킬 때 MemberMapper 에 있는 쿼리문을 불러오는데
그때 id 속성을 이용해 불러옴
Mapper 파일에 여러 변수를 넣을 때는 묶어줘야하는데
어떤 DTO로 묶어줄지 parameterType 속성에 명시해줌
ㅡ MemberDAO 에서 join 메서드 작성 ㅡ
SqlSession 을 불러와 메서드 작성
private SqlSessionFactory factory = FactoryManager.getSqlSessionFactory();
// 1) 회원가입
public int join(Member member) {
// (1) SqlSession 불러오기
// openSession(boolean) : auto commit을 사용할지
SqlSession session = factory.openSession(true);
// (2) SQL 쿼리 실행하기
// 메서드의 이름 == SQL문 키워드
// insert("", obj) : id, parameterType
// DML(insert, delete, update)의 경우 무조건 int 리턴
int cnt = session.insert("join", member);
// (3) SqlSession 반납
session.close();
// (4) 실행결과 리턴
return cnt;
}
ㅡ JoinController에서 작성한 메서드 실행 ㅡ
SqlSession 을 불러와 메서드 작성
// 2. 기능 실행
MemberDAO dao = new MemberDAO();
int cnt = dao.join(member);
if(cnt>0) {
System.out.println("회원가입 성공");
}else {
System.out.println("회원가입 성공");
}
// 3. view 선택
// GoMainController 클래스가 있기 때문에 Redirect로 이동
String url = "main";
response.sendRedirect(url);


(수정중)

BYE