카테고리 없음

57일차 공부 회원가입 웹

이즈라핀 2020. 6. 26. 12:42

어제에 이어서

 

 

 

** 회원가입

1)

 

Dao에 메소드 생성(삽입)

 

	public int register(User user) {
	       int result = -1;
	       connect();
	       try {
	           pstmt = con.prepareStatement(" insert into User(email, password, nickname, image) values(?, ?, ?, ?); ");
	           pstmt.setString(1, user.getEmail());
	           pstmt.setString(2, user.getPassword());
	           pstmt.setString(3, user.getNickname());
	           pstmt.setString(4, user.getImage());
	           result = pstmt.executeUpdate();
	      }catch(Exception e) {
	           System.out.println("DAO:" + e.getMessage());
	           e.printStackTrace();
	      }
	      return result;
	}

 

 

index.jsp 파일에 <% %> 코드 작성하고 출력하면 1이 나와야 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유저 관리</title>
</head>
<body>

<%
	dao.UserDao userDao = dao.UserDao.sharedInstance();
	domain.User user = new domain.User();
	user.setEmail("sblee5212@gmail.com");
	user.setPassword("qwe123");
	user.setNickname("모신악사");
	user.setImage("");
	
	System.out.println(userDao.register(user));	
%>


	<!-- 바로 user/main으로 포워딩 하도록 해주는 코드
	전자 정보 프레임워크가 만들어주는 프로젝트에서 index.jsp에 보면 이런 코드가 존재한다. -->
	<jsp:forward page="user/main"></jsp:forward>
</body>
</html>

 

 

 

2. UserService 인터페이스에 회원가입 처리를 위한 메소드를 선언

 

package service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//User 에 대한 처리를 하기 위한 메소드 선언을 위한 인터페이스
//메뉴판과 유사한 역할을 수행합니다.
public interface UserService {
	public void emailCheck(HttpServletRequest request, HttpServletResponse response);
	public void nicknameCheck(HttpServletRequest request, HttpServletResponse response);
	public void register(HttpServletRequest request, HttpServletResponse response);
}

 

 

3. UserServiceImpl 클래스에 회원가입 처리를 위한 메소드를 선언

에러구문에서 Add Unimplement Method 실행

 

	@Override
	public void register(HttpServletRequest request, HttpServletResponse response) {	
		try {
			//파라미터 읽기
			request.setCharacterEncoding("utf-8");
			String email = request.getParameter("email");
			String password = request.getParameter("password");
			String nickname = request.getParameter("nickname");
			//파일은 Part로 읽어냅니다.
			Part part = request.getPart("image");
			//파일명 가져오기
			//content-disposition 이라는 헤더의 값 이용
			String contentDisposition = part.getHeader("content-disposition");
			//form-data;image;"파일명" 의 형태의 문자열에서
			//파일명만 가져오기
			
			//;으로 분리
			String [] splitStr = contentDisposition.split(";");
			//첫번째 " 와 마지막 "의 위치를 찾음
			int first = splitStr[2].indexOf("\"");
			int last = splitStr[2].lastIndexOf("\"");
			//위치를 가지고 부분 문자열을 가져오기
			String uploadFileName = splitStr[2].substring(first+1, last);
			
			String image = null;
			//위의 파일명에 내용이 없으면 파일을 선택하지 않은 것입니다.
			if(uploadFileName != null && uploadFileName.length() !=0) {
				//확장자 추출하기
				String [] imsi = uploadFileName.split("\\.");
				String ext = imsi[imsi.length - 1];
				
				//새로운 파일명 만들기
				image = UUID.randomUUID() + "." + ext;
				//파일 업로드
				File f = new File("c:\\hybrid\\upload\\" + image);
				part.write(image);
			}
			//DAO 파라미터 만들기
			User user = new User();
			user.setEmail(email);
			user.setPassword(password);
			user.setNickname(nickname);
			user.setImage(image);
			
			//Dao 메소드 호출
			int result = userDao.register(user);
			
			//결과를 저장
			JSONObject object = new JSONObject();
			if(result >0) {
				object.put("result", true);
			}else {
				object.put("result", false);
			}
			request.setAttribute("result", object);
			
		}catch(Exception e) {
			System.out.println("service:" + e.getMessage());
			e.printStackTrace();
		}		
	}

 

 

4. UserController 클래스에 register 요청을 POST 방식으로 전송했을 때 처리할 코드를 doGet 메소드에 추가

 

 

		else if(command.equals("/user/register") && method.equals("GET")) {
			RequestDispatcher dispatcher = request.getRequestDispatcher("../member/register.jsp");
			dispatcher.forward(request, response);
		}
		else if(command.equals("/user/register") && method.equals("POST")) {
			RequestDispatcher dispatcher = request.getRequestDispatcher("../member/registerresult.jsp");
			dispatcher.forward(request, response);
		}

 

 

5. registerresult.jsp 파일을 만들고 출력하는 코드를 작성

 

<%@ page language="java" contentType="text/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
${result}

 

 

6. register.js 파일에서 회원가입 버튼을 누르면 회원 가입 요청을 하고 그 결과를 가지고 다른 작업을 수행할 수 있도록

하는 코드를 작성

 

 

	//회원가입 버튼을 누르면
	registerbtn.addEventListener('click', function(event){
		//폼의 데이터를 전송할 때는 유효성 검사를 해주어야 한다.
		//필수 항목 검사, 형식에 맞는지 , 값의 제한이 잇는경우 그 값인지 등
		if(email.value.trim().length < 1){
			emailmsg.innerHTML = "이메일은 필수 항목";
			emailmsg.style.color = "red";
			return;
		}
		//형식 검사 - 정규식을 이용
		var emailRegExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
		if(emailRegExp.test(email.value) == false){
			emailmsg.innerHTML = "이메일 형식에 맞지 않습니다";
			emailmsg.style.color = "red";
			return;
		}
		if(emailcheck == false){
			emailmsg.innerHTML = "이미 가입된 이메일 입니다.";
			emailmsg.style.color = "red";
			return;
		}
		if(nicknamecheck == false){
			emailmsg.innerHTML = "사용중인 닉네임 입니다.";
			emailmsg.style.color = "red";
			return;
		}
		
		//ajax 요청
		var request = new XMLHttpRequest();
		request.open('POST', 'register', true);
		//폼의 데이터 생성
		var formData = new FormData(registerform);
		request.send(formData);
		//데이터를 전송하고 결과를 받아왔을 때
		request.addEventListener('load', function(event){
			//alert(event.target.responseText);
			//JSON 파싱 - 결과를 사용하기 위해서
			var data = JSON.parse(event.target.responseText);
			if(data.result=true){
				//메인으로 이동
				location.href ="../";
			}
		});		
	});	

 

 

 

7. UserController 상단에 파일이 업로드

@MultipartConfig(location="c:\\hybrid\\upload")   이 경로에 폴더를 직접 만들어 두어야 된다.

 

 

 

 

 

** 비밀번호 암호화

1. 암호화를 위한 라이브러리(jBCrypt)를 WEB-INF/lib 디렉토리에 복사

 

2. UserServiceImpl 클래스에서 password 저장하는 부분을 변경

			//DAO 파라미터 만들기
			User user = new User();
			user.setEmail(email);
			//user.setPassword(password);
			//암호화해서 저장
			user.setPassword(BCrypt.hashpw(password, BCrypt.gensalt()));
			user.setNickname(nickname);
			user.setImage(image);

 

 

** 데이터 베이스 초기화

=> 회원가입 처리를 위해서 샘플 데이터를 입력한 상태라서 이전에 입력된 회원정보는 삭제를 해야 한다.

=> 이행이나 배포 작업을 할 때도 동일한 작업을 수행한다.

 

1. 테이블의 데이터를 삭제하는 방법

=> 테이블 자체를 삭제하고 테이블을 다시 생성

=> truncate table 테이블이름; 으로 테이블의 모든 데이터를 삭제 - 데이터가 정말로 삭제된다.

=> delete from 테이블이름; 으로 테이블의 모든 데이터를 삭제 - 데이터가 삭제된 것처럼 보이지만 살제로는 데이터가 삭제되었다는 표시만 한다.

 

 

 

** 로그인 처리

로그인 요청 -> 아이디와 비밀번호를 입력할 수 있는 화면으로 이동 -> 아이디와 비밀번호를 입력하고 서버에 로그인 요청 -> 아이디와 비밀번호를 가지고 로그인 처리

 

=> DAO에서는 아이디를 가지고 일치하는 데이터를 찾아노는 작업만 수행

=> Service에서는 아이디를 가지고 찾아온 데이터와 입력한 비밀번호를 비교해서 로그인 여부를 판단

 

1. main.jsp 파일에 로그인 요청을 위한 링크를 생성 - Web Application이 아닌 고셍서는 버튼이나 이미지 등을 배치

<a href="${pageContext.request.contextPath}/user/log">로그인</a><br/>

 

2. 로그인 페이지 이동 처리를 UserController 클래스의 doGet 메소드에 작성

=> Web Application이 아닌 곳에서는 이벤트 핸들러를 이용해서 작성

 

		else if(command.equals("/user/login") && method.equals("GET")) {
			//System.out.println("요청 도달");			
			RequestDispatcher dispatcher = request.getRequestDispatcher("../member/login.jsp");
			dispatcher.forward(request, response);
		}

 

 

3. member 디렉토리에 login.jsp 파일을 만들고 화면 디자인

=> Web Application 이 아닌 곳에서는 Activity 나 Controller 또는 View 등에 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
<script src="${pageContext.request.contextPath}/member/js/login.js"></script>
<script src="${pageContext.request.contextPath}/member/css/login.css"></script>
</head>
<body>
	<!-- action : 처리할 서버의 URL
	method : 전송방식(get, post)
	enctype : file이 존재하는 경우만 multipart/form-data
	최근에는 조회를제외하고는 action을 설정하지 않고 method는 post로 설정해서 get과 post로 구분 -->
	<form method="post" id="loginform">
		아이디:<input type="text" id="id" name="id" /> <br/>
		비밀번호:<input type="password" id="password" name="password" /> <br/>
		<!-- 하나의 서버로 여러 디바이스의 요청을처리하는 REST API 서버를 이용하는 경우에는 submit 대신에
		button을 만들어서 버튼을 누르면 ajax로 요청을 처리
		bootstrap 같은 자바스크립트 라이브러리를 이용하게 되면 button을 만들면 자동으로 submit을 만드는 경우가 있다.
		그런 경우에는 보튼을 form 외부에 생성-->
		<input type="button" value="로그인" id="loginbtn"/>
		<input type="button" value="메인" id="mainbtn"/>
	</form>
</body>
</html>

 

4. UserDao 클래스에 로그인처리를 위한 메소드를 선언

=> User 정보를 가진 테이블의 DTO나 Map을 리턴하도록 하고 파라미터는 아이디

=> 아이디를 가지고 User 정보를 리턴하도록 만들어야 한다.

 

	//로그인 처리를 위한 메소드
	public User login(String email) {
		//없는 아이디인 경우는 null을 리턴
		User user = null;
		connect();
		try {
			//SQL 만들기
			//user 테이블에서 email을 가지고 데이터 찾아오기
			pstmt = con.prepareStatement("select * from user where email=?");
			pstmt.setString(1, email);
			//데이터 읽어서 저장
			if(rs.next()) {
				user= new User();
				user.setEmail(rs.getString("email"));
				user.setPassword(rs.getString("password"));
				user.setNickname(rs.getString("nickname"));
				user.setImage(rs.getString("image"));
			}			
		}catch(Exception e) {
			System.out.println("DAD:" + e.getMessage());
			e.printStackTrace();
		}
        close();
		return user;
	}

 

5. Service 인터페이스에 로그인 처리를 위한 메소드를 작성

 

package service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//User 에 대한 처리를 하기 위한 메소드 선언을 위한 인터페이스
//메뉴판과 유사한 역할을 수행합니다.
public interface UserService {	
	//이메일 중복 체크를 위한 메소드
	public void emailCheck(HttpServletRequest request, HttpServletResponse response);
	//닉네임 중복 체크를 위한 메소드
	public void nicknameCheck(HttpServletRequest request, HttpServletResponse response);
	//회원가입을 위한 메소드
	public void register(HttpServletRequest request, HttpServletResponse response);
	//로그인을 위한 메소드
	public void login(HttpServletRequest request, HttpServletResponse response);
}

 

6. ServiceImpl 클래스에 로그인 처리를 위한 메소드를 구현

 

	@Override
	public void login(HttpServletRequest request, HttpServletResponse response) {
		//1. 파라미터 읽기
		try {
			request.setCharacterEncoding("uft-8");
		}catch(Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		
		//2. 필요한 처리 - 없다
		
		//3. DAO 메소드를 호출해야 하면 DAO 메소드의 매개변수를 생성 - 필요없다.
		
		//4. DAO 메소드를 호출해서 결과를 저장
		User user = userDao.login(email);
		//5. 결과를 가지고 핑요한 처리를 수행
		if(user != null) {
			//비밀번호 확인
			if(BCrypt.checkpw(password,  user.getPassword())) {
				//비밀번호가 일치하는 경우 - 비밀번호는 삭제
				user.setPassword(null);
			}else {
				//비밀번호가 클린경우 user == null
				user = null;
			}
		}
		
		JSONObject object = new JSONObject();
		if(user != null) {
			object.put("email", user.getEmail());
			object.put("nickname", user.getNickname());
			object.put("image", user.getImage());
		}else {
			object = null;
		}
		
		//6. 요청 처리 결과를 저장
		request.getSession().setAttribute("result", object);
	}
}

 

7. UserController 클래스의 doGet 메소드에 login 요청이 POST로 온 경우 처리를 위한 코드를 작성

 

		else if(command.equals("/user/login") && method.equals("POST")) {
			//로그인처리를 위한 서비스 메소드 호출
			//작업을 처리하는 경우에는 서비스의 메소드를 호출하는 것이고 단순 페이지 이동은 서비스의 메소드를 호출하지 않음
			//정보수정의 경우는 상세데이터를 가져오고 수정
			userService.login(request, response);
			RequestDispatcher dispatcher = request.getRequestDispatcher("../member/loginresult.jsp");
			dispatcher.forward(request, response);
		}

 

 

8. member 디렉토리에 loginresult.jsp 파일을 생성해서 결과를 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
${result}

 

9.  login.jsp 파일에 요청을 하고 결과를 처리하는 부분을 작성

=> ajax로 처리할 때는 각 요소에 id를 설정하고 javascript에서 처리

 

		//loginbtn을 클릭할 때 email과 password를 서버로 보내서 로그인 처리
		loginbtn.addEventListener("click", function(event){
			
			//ajax 이용
			//1. ajax 객체 생성
			var request= new XMLHttpRequest();
			//2. ajax 요청 설정
			request.open('post', 'login', true);
			//3.ajax 파라미터 설정
			//GET 방식이면 open 의 URL 뒤에 붙이고 POST 방식이면 FormData 객체를 생성하고 send
			var formdata = new FormData(loginform);
			request.send(formdata);			
			//4.ajax 응답이 온 경우 처리할 콜백함수를 등록
			request.addEventListener('load', function(event){
				//로그인 실패한 경우
				if(event.target.responseText.trim().length ==0){
					alert("없는 이메일이거나 잘못된 비밀번호입니다.");
				}
				//로그인 성공한 경우
				else{
					location.href ="../";
				}
			});

 

 

10. main.jsp 수정 - 로그인 된 경우와 안된 경우 구분

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 관리</title>
</head>
<body>
	<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
	<!-- jsp 파일에서 서버에 요청하는 경우는 상대 경로를 이용하지 않는 것이 좋다. 절대 경로쓰기
	css나 js의 링크 그리고 이미지나 동영상 및 사운드의 링크도 동일한 방법으로 설정하자 -->
	<a href="${pageContext.request.contextPath}/user/register">회원가입</a><br/>
	<c:if test="${result == null}">
		<a href="${pageContext.request.contextPath}/user/login">로그인</a><br/>
	</c:if>
	<c:if test="${result != null}">
		<a href="${pageContext.request.contextPath}/user/logout">로그아웃</a><br/>
	</c:if>
</body>
</html>

 

11. 주의할 점

=> 웹 페이지에서 계속 사용해야 하는 정보는 request에 저장하면 안되고 session 에 저장해야 한다.

=> session에 저장하는 것은 로그인 정보(request에 로그인 정보를 저장하면 페이지가 바뀔 경우 로그인된 정보는 사라진다.)

 

12. 웹에서의 로그아웃 처리

=> session을 invalidate() 시키거나 로그인 정보를 저장하고 있는 항목을 삭제 두가지 방법

request.getSession().invalidate(); (세션 전체 삭제) 또는 request.getSession().removeAttribute("result"); (로그인정보만 삭제) 

 

** Domain

=> Domain : 일반 프로그래밍에서는 업무에 대한 지식

=> Domain : Web에서는 하나의 Application을 Domain이라고도 하는데 이 때의 도메인은 Domain Name Service 에 등록을 할 때 사용하는 하나의 URL의 개념이다.

 

** ajax

=> 도메인 내의 데이터를 비동기적으로 기져오는 기술

=> 도메인 외부의 데이터는 ajax를 이용해서 가져올 수 없다. 그럼 어떻게 가져와야 할까??

동일 출처 정책 이라고 한다.

same-origin policy 라고 하는데 보안 목적 때문에 외부에서 요청한 데이터를 제공하지 않는 것.

=> 여기에 대한 예외는 서버측에서 외부에도 데이터를 제공하겠다고 설정하면 데이터를 ajax를 이용해서 가져올 수 있다.

이러한 서비스를 jsonp 또는 CORS(Cross Origin Resource Sharing)이라고도 한다.

 

=> Open API 중에는 ajax 로는 가져올 수 없고 서버용 언어의 코드로는 가져올 수 있는 데이터들이 있다. 꼭 ajax를 써야한다면

ajax 에서 controller로 내부 요청을 전송한다.

controller는 그 내부 요청을 가지고 Service에서 데이터를 가져와서 결과페이지로 출력을 해준다.

이러한 방식을 proxy라고 한다.

proxy는 내부에서 요청한 외부 데이터를 대신 가져다 주는 기술

보안 목적 때문에 일부러 이렇게 구현하기도 한다.

아주 중요한 데이터를 다루는 곳에서는 외부에 무엇인가를 요청할 때 직접 가지 못하도록 하고 poxy server를 거치도록 해서 proxy server에서 위험한 곳은 요청을 거절해버린다.

 

1. 기상청에서 날씨 정보를 넘겨주는 API

http://www.kma.go.kr/weather/forecast/mid-term-xml.jsp?stnld=109 

 

 

2. main.jsp 에 외부에서 데이터를 가져오는 ajax를 작성 : 동일출처 정책에 의해서 막힌다.

<script>
	//ajax 요청 객체 생성
	var request = new XMLHttpRequest();
	//ajax 요청 생성
	request.open('get', 'http://www.kma.go.kr/weather/forecast/mid-term-xml.jsp?stnld=109', true);
	//요청 전송
	request.send('');
	//요청을 전송하고 응답이 오면 호출될 콜백 메소드 생성
	request.addEventListener('load', function(event){
		alert(event.target.responseXML);
	});
</script>

브라우저의 콘솔창에 블락됐다는 메시지가 나타난다.

 

 

3. Service 인터페이스에 Proxy 요청을 처리해줄 메소드를 1개 생성

맨아래줄

 

package service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//User 에 대한 처리를 하기 위한 메소드 선언을 위한 인터페이스
//메뉴판과 유사한 역할을 수행합니다.
public interface UserService {	
	//이메일 중복 체크를 위한 메소드
	public void emailCheck(HttpServletRequest request, HttpServletResponse response);
	//닉네임 중복 체크를 위한 메소드
	public void nicknameCheck(HttpServletRequest request, HttpServletResponse response);
	//회원가입을 위한 메소드
	public void register(HttpServletRequest request, HttpServletResponse response);
	//로그인을 위한 메소드
	public void login(HttpServletRequest request, HttpServletResponse response);
	//proxy 서비스를 위한 메소드
	public void proxy(HttpServletRequest request, HttpServletResponse response);
}

 

 

4. ServiceImpl 메소드에 Proxy 요청을 처리해줄 메소드를 구현

Add Unimplemented method 클릭 후 작성

 

	@Override
	public void proxy(HttpServletRequest request, HttpServletResponse response) {
		//Java Application에 구현할 때는 Thread 안에 구현
		//Android Application에 구현할 대는 Thread 안에 구현하고 화면에 표시할 때는 Handler를 이용하거나
		//Thread와 Hanlder의 조합인 AsyncTask를 이용
		
		try {
			//데이터를 가져올 URL을 생성
			URL url = new URL("http://www.kma.go.kr/weather/forecast/mid-term-xml.jsp?stnld=109");
			//연결 객체를 생성
			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			//옵션을 설정
			conn.setConnectTimeout(30000);
			conn.setUseCaches(false);
			//헤더 설정을 해야하는 경우에는
			//conn.setRequestProperty("헤더이름", "헤더값");
			
			//post전송이면
			//conn.setRequestMethod("POST");
			
			//데이터 읽어오기
			StringBuilder sb = new StringBuilder();
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			while(true) {
				String line = br.readLine();
				if(line == null) break;
				sb.append(line + "\n");					
			}
			
			br.close();
			conn.disconnect();
			request.setAttribute("result", sb.toString());
			
		}catch(Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}

 

 

5. UserController 클래스에 요청을 처리하는 코드를 추가

 

else if(command.equals("/user/proxy") && method.equals("GET")) {
	userService.proxy(request, response);
	RequestDispatcher dispatcher = request.getRequestDispatcher("../member/proxy.jsp");
	dispatcher.forward(request, response);
}

 

 

6. member 디렉토리에 proxy.jsp 파일을 만들고 결과를 출력 - html을 xml로 꼭 바꾸자.

<%@ page language="java" contentType="text/xml; charset=UTF-8"
    pageEncoding="UTF-8"%>
${result}

 

7. main.jsp 파일의 ajax 요청 경로 수정

 

<script>
	//ajax 요청 객체 생성
	var request = new XMLHttpRequest();
	//ajax 요청 생성
	request.open('get', 'user/proxy', true);
	//요청 전송
	request.send('');
	//요청을 전송하고 응답이 오면 호출될 콜백 메소드 생성
	request.addEventListener('load', function(event){
		alert(event.target.responseText);
	});
</script>

 

데이터가 받아와 졌다.

 

8. 실제 서비스라면 ServiceImpl 클래스에서 데이터를 parsing해서 출력하고자 하는 결과를 만들어서 제공

 

 

 

 

 

** 회원가입 요청 디버깅

1. 자바스크립트 코드에 에러가 있는지 확인

 

 

2. UserController 클래스에서 요청을 제대로 처리하는지 확인

=> 콘솔에 출력

 

 

3. UserServiceImpl 클래스에서 요청을 제대로 처리하는지 확인

 

 

** 데이터 암호화

=> 최근에는 개인 정보를 함부로 노출하면 안된다.

데이터를 저장할 때 바로 알아볼 수 없도록 저장하는 것을 권장

암호화를 해서 복호화가 가능하도록 저장할 수있고 암호화를 해서 복호화는 안되고 비교만 할 수 있도록 하는 방법도 있다.

비밀번호는 뒤의 방법을 선택하고 일반 데이터는 앞의 방법을 선택

 

jBCrypt : 복호화가 불가능하도록해주는 라이브러리

Bcrypt.hashpw(문자열, BCrypt.gensalt()); 메소드를 호출하면 암호화된 문자열을 리턴

BCrypt.checkpw(원본문자열, 암호화된 문자열) : 2개가 일치하면 true 일치하지 않으면 false를 리턴

 

 

 

** 데이터 삽입

=> 삽입 요청 -> Controller -> ServiceImpl -> DAO -> Repository -> DAO -> Service -> Controller -> View

=> 웹에서는 요청을 ajax로 한다.

 

** 파일 업로드

=> 요청을 처리하는 Servlet 클래스 상단에 아래 어노테이션을 추가

@MultipartConfig(location="파일을 업로드할 디렉토리 경로를 절대경로로 작성")

 

=> 요청을 처리하는 서비스 클래스에 작성

파라미터를 읽을 때 getParameter 대신에 getPart("파라미터 이름") 을 이용해서 Part 객체를 생성한다.

 

Part 객체의 getHeader("content-disposition")을 호출해서 업로드된 파일명을 찾아야 한다.

메소드를 호출하면 form-data;파라미터이름;파일명 의 형태이다.

 

File 객체를 만들고 Part 객체의 write 메소드를 이용해서 업로드를 수행

 

파일을 하나의 디렉토리에 전부 업로드 할려면 파일이름을 유일무이하게 만들어야 한다.

UUID 클래스의 randomUUID 메소드를 호출해서 랜덤한 파일명을 만든다.