Eggs Sunny Side Up
본문 바로가기
Web/JSP_Servlet

MVC_회원가입 시스템

by guswn100059 2023. 4. 24.

실행버튼


maven)

 

https://mvnrepository.com/

ojdbc6

오류가 나면, 아래 화면처럼

파일탐색기에서 해당 주소를 입력했을 때 아래 화면같이 뜨지 않으면 폴더 삭제 후, 이클립스 재실행.

계속 오류가 나면, 아래 화면에서 프로젝트 업데이트 후 대기.

maven ribraries가 생성되어야 정상.

 

mybatis

pom.xml)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>kr.smhrd</groupId>
  <artifactId>MessageSystem1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
	<dependency>
	    <groupId>com.oracle.database.jdbc</groupId>
	    <artifactId>ojdbc6</artifactId>
	    <version>11.2.0.4</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.5.9</version>
	</dependency>


  </dependencies>
  
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>17</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
</project>


View의 jsp 파일(샘플)을 webapp에 복사붙여넣기)

jsp파일들은 보안을 유지하기 위해 WEB-INF 폴더에 view 폴더를 생성 후 복사붙여넣기)

join_success.jsp와 main.jsp의 인코딩 변경)

 

ctrl+F

 

main.jsp에서 form태그의 action과 input태그들의 name 설정해주기


Controller_gomain

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/goMain")
public class GoMainController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 데이터 수집(여기선 사용X)
		
		// 2. 기능 구현(여기선 사용X)
		
		// 3. View 선택 => View로 이동
		// Redirect ?? => 다시 요청 : Controller => Controller
		// Forward => WEB-INF 파일을 접근 가능 : Controller => JSP
		
		// http://localhost:8081/MessageSystem/ => webapp
		
		String nextView = "WEB-INF/views/main.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(nextView);
		rd.forward(request, response);
		
	}

}

 

Controller_gosuccess

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/goSuccess")
public class GoSuccessController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String newtView = "WEB-INF/views/join_success.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(newtView);
		rd.forward(request, response);
	}

}

 

db.properties

# 1. DB connection profile
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=service
password=12345

 

entity(DTO)_sql

-- 회원 정보 테이블 만들기
create table Member
(
	email varchar2(100),
	pw varchar2(100) not null,
	tel varchar2(100),
	address varchar2(100),
	
	constraint member_email_pk primary key(email)


);

 

entity(oracle과 연결)_member

package kr.smhrd.entity;

public class Member {
	// 계층간(WEB <--> DB, Back <--> Front)
	// 데이터 전달을 위한 객체
	// DTO, VO
	
	// 1. Table에 있는 컬럼을 반드시 포함
	// DB의 데이터 타입과 맞아야함
	// 컬럼의 이름 == 변수 이름(MyBatis)
	private String email;
	private String pw;
	private String tel;
	private String address;
	
	// 2. 기본생성자를 반드시 포함
	public Member() {
		
	}

	// 3. Getter / Setter 반드시 있어야 함
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
	
}

 

DAO_memberDAO

package kr.smhrd.dao;

public class MemberDAO {
	
	// 1. DB와 연결
	private SqlSessionFactory factory

}

 

MyBatis와 연결

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

config.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>

	<properties resource="kr/smhrd/dao/db.properties"></properties>
	<!-- 위 properties는 db.properties와 연결되어 있다. -->

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <!-- 
      
      	(전)JDBC => 매번 실행할때마다 Connection 생성
      	
      	(후)Connection Pool -> Connection 미리 여러 개 만들어서 필요할 때 빌려만 주자.
      	Connection Pool을 만들기 위해 필요한 4가지 정보를 입력해라.
      
       -->
      
      <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>
  
  
  <!-- 우리 sql문은 어디에 있는가? -->
  <mappers>
    <mapper resource="kr/smhrd/dao/MemberMapper.xml"/>
  </mappers>
</configuration>

 

MemberMapper.xml

<?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="kr.smhrd.dao.MemberDAO">

<!-- namespace : 짝궁(DAO)가 누구??? -->

</mapper>

 

JoinController

package kr.smhrd.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/join")
public class JoinController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 데이터 수집
		
		request.setCharacterEncoding("UTF-8");
		
		String email = request.getParameter("email");
		String pw = request.getParameter("pw");
		String tel = request.getParameter("tel");
		String address = request.getParameter("address");
		
		// 2. 기능 구현 : DB에 회원정보를 저장(DAO)
		
		
		
		// 3. View 선택
		String url = "";
		
	}

}

 

SqlSessionManager

package kr.smhrd.dao;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionManager {

	// Connection Pool 생성하고 관리 => 우리 프로젝트(서버)가 실행되자마자
	// 초기화 블럭 --> 특정 시점에 자동으로 코드 실행
	// 				(생성자가 사용이 됐을 때 자동으로 실행)
	// new SqlSessionManager();
	
	
	
	// static : 우리 프로젝트가 실행되자마자 메모리에 할당
	// static 초기화 블럭 => static 변수들이 할당되자마자(=프로젝트가 시작)
	private static SqlSessionFactory sqlSessionFactory;
	
	static {
		
		try {
			// ctrl+shift+o => 자동완성
			String resource = "kr/smhrd/dao/mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			
			// Connection Pool
			sqlSessionFactory = 
					new SqlSessionFactoryBuilder().build(inputStream);
			
		} catch (Exception e) {
			e.printStackTrace(); // console창에 빨간글씨로 에러 출력
		}
		
	}

	// private(잠금선언)로 선언했기에 꺼내쓸 수 있는 getters로 메소드 선언
	public static SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}
	
	
}

 

MemberDAO

package kr.smhrd.dao;

import org.apache.ibatis.session.SqlSessionFactory;

public class MemberDAO {
	
	// 1. DB와 연결
	private SqlSessionFactory factory =
			SqlSessionManager.getSqlSessionFactory();

}

 

MemberMapper.xml

<?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="kr.smhrd.dao.MemberDAO">
<!-- namespace : 짝궁(DAO)가 누구??? -->
	
	<!-- 회원가입 -->
	<!-- 
		#{변수명} : 변수에 데이터 타입에 자동맞춤
			ex) values(#{email})
				=> values('email@eamil.com')
		
		${변수명} : 단순히 집어넣는 타입
			ex) values(#{email})
				=> values(email@email.com)
				=> ERROR!
		
		parameterType : 데이터들을 어디에 담아서 줄거냐
						SQL문에 바인드변수가 2개 이상인 경우 필수
	 -->
	 
	<insert id="join" parameterType="kr.smhrd.entity.Member">
		insert into MEMBER
		values(#{email},
			   #{pw},
			   #{tel},
			   #{address}
		)
	</insert>


</mapper>

 

MemberDAO

package kr.smhrd.dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import kr.smhrd.entity.Member;

public class MemberDAO {
	// DAO : SQL문을 실행하고, 실행 결과를 리턴
	
	// 1. DB와 연결
	private SqlSessionFactory factory =
			SqlSessionManager.getSqlSessionFactory();
	
	// Mybatis : java(DAO) <=mapping=> sql(xml)
	
	
	// 2. 회원정보를 Member 테이블에 저장하는 기능
	public int join(Member dto) {
		// 1단계) SqlSession 빌려오기
		// true --> auto commit
		SqlSession session = factory.openSession(true);
		
		// 2단계) sql문 실행
		// insert, delete, update : 키워드랑 같은 메소드
		// select : selectOne (한 개만 가져올 때)
		//		  : selectList (여러 개 가져올 때)
		// insert("id", 넣어줄 데이터)
		// parameterType == 메소드의 매개변수
		// insert, delete, update는 resultType이 int로만 고정
		int row = session.insert("join", dto);
		
		// 3단계) 빌려온 SqlSession 반환
		session.close();
		
		// 4단계) SQL문 실행한 결과를 리턴
		// resultType == return type
		return row;
	}

}

 

JoinController

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.smhrd.dao.MemberDAO;
import kr.smhrd.entity.Member;

@WebServlet("/join")
public class JoinController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 데이터 수집
		
		request.setCharacterEncoding("UTF-8");
		
		String email = request.getParameter("email");
		String pw = request.getParameter("pw");
		String tel = request.getParameter("tel");
		String address = request.getParameter("address");
		
		// 데이터가 2개 이상이라면, DTO로 묶어놓기
		Member dto = new Member();
		dto.setEmail(email);
		dto.setPw(pw);
		dto.setTel(tel);
		dto.setAddress(address);
		
		// 2. 기능 구현 : DB에 회원정보를 저장(DAO)
		// 2-1) DAO를 생성
		MemberDAO dao = new MemberDAO();
		int row = dao.join(dto);
		
		
		// 3. View 선택
		String nextView = "";
		
		if(row>0) {
			// 성공 => 회원가입 성공 페이지
			nextView = "goSuccess";
		}else {
			// 실패 => 메인페이지
			nextView = "goMain";
		}
		
		// 페이지 이동
		// forward vs redirect
		// c->v			c->c
		// 기능의 중복 실행을 방지하기 위해서 url을 초기화하려고 redirect를 사용하는 것
		response.sendRedirect(nextView);
		
	}

}

'Web > JSP_Servlet' 카테고리의 다른 글

MVC_개인정보수정  (0) 2023.04.26
MVC_로그인/로그아웃 시스템  (0) 2023.04.25
Session  (1) 2023.04.19
객체실습_html에서 값 입력 후 jsp에서 출력  (1) 2023.04.19
쿠키  (0) 2023.04.18

댓글