Front-end

JSP & Servlet DAY 8 ( Maven Project 에서 MVC 패턴을 활용한 회원관리 시스템 실습2 ( MyBatis 활용 ) )

도키마 2024. 8. 2. 16:57



 

 

 

 

오늘의 노래 추천 

 

 
Wish You Were Here
아티스트
SuperM
앨범
Super One - The 1st Album
발매일
1970.01.01

 

 
Big Chance
아티스트
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 태그 추가해주기

 

dependencies

 

 

 

 

ㅡ 파일 불러오기 ㅡ

assets, images, views 파일을 각각 webapp, WEB-INF 폴더에 import

 

파일 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값을 입력해 연결

 

Run As

 

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

eclipse 경로 선택

 

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>

 

lombok 설치

 

repository에서 lombok dependency 복붙

 

 

 

 

 

ㅡ Member DTO 클래스 생성 ( lombok ) ㅡ

DTO는 DB테이블과 동일한 이름으로 생성하는게 트랜드

 

annotation

 

data - lombok import

 

getter setter를 받아주는 대신 Member위에 annotation으로 lombok.data 임포트 ( lombok )

 

ㅡ> getter와 setter를 자동으로 생성 ( 필드 변수명이 바뀌어도 적용 )

 

생성자, getter/setter lombok

 

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

 

NonNull

 

필드 위에 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 설치 ㅡ

Eclipse Marketplace

 

myBatipse install

 

정상적 설치 완료

 

 

 

 

 


 

 

 

 

파일 구조 설정

 

 

 


ㅡ main.jsp 에서 회원가입 태그 수정 ㅡ

회원가입 form 태그에 action을 추가하고 각 input에 name 추가

 

main.jsp

 

 

 

 

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

 

<!-- 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 경로에 알맞게 수정

 

properties
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);

 

 

 

 

 

 

 

 

 

 

콘솔창
member table

 

 

 

 

(수정중)

 




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 



 

 

 

 

 

BYE