팀프로젝트/Spring
Spring 팀플) 20240219 스프링전환
일일일코_장민기
2024. 3. 21. 10:26
728x90
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.jslsolucoes/ojdbc6 -->
<dependency>
<groupId>com.jslsolucoes</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
mvc 패턴 사용 및 프로젝트 작성을 위한 디펜던시 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<annotation-driven />
<default-servlet-handler/>
<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/css/**" location="/WEB-INF/views/css/" />
<view-controller path="/" view-name="loginMain"/>
<!-- 로그인/회원가입 파트 -->
<view-controller path="/Login" view-name="member/Login/loginMain"/>
<view-controller path="/FindInfo" view-name="member/Find_Info/searchMemberData"/>
<view-controller path="/FindAllPW" view-name="member/Find_Info/childFindAllPW"/>
<view-controller path="/IdDupilicate" view-name="member/Register/childCheckIDDupilicate"/>
<!-- 특정 요청 처리 한정으로 인터셉터 처리 -->
<!-- <beans:bean id="loginCheckInterceptor" class="com.interceptor.LoginCheckInterceptor"></beans:bean>
<interceptors>
<interceptor>
<mapping path="/loginCheck/**"/>app/LoginCheck가 붙는 모든 주소에 인터셉터 사용
<beans:ref bean="loginCheckInterceptor"/>
</interceptor>
</interceptors> -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.*" />
</beans:beans>
servlet-context
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!-- 1. placeholder -->
<context:property-placeholder location="classpath:com/config/jdbc.properties"/>
<!-- 외부 프로퍼티 파일에서 값들을 읽어오기 위한 설정 -->
<!-- 2. jdbc연결 -->
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<!-- 데이터베이스와의 연결을 관리하는 DataSource를 설정 -->
<!-- <property> 태그를 통해 외부 프로퍼티 파일에서 읽어온 값들을 사용 -->
<property name="driverClassName" value="${oracle.driver}"/>
<property name="url" value="${oracle.url}"/>
<property name="username" value="${oracle.username}"/>
<property name="password" value="${oracle.password}"/>
</bean>
<!-- 3. transaction -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 트랜잭션 관리를 위한 설정 -->
<property name="dataSource" ref="myDataSource"> <!-- ref에 2번의 id -->
<!-- <property>를 사용하여 데이터 소스를 지정 -->
</property>
</bean>
<!-- 4. annotation 기반 트랜잭션 -->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- <tx:annotation-driven>을 통해 애노테이션 기반의 트랜잭션을 활성화 -->
<!-- 5. SQLSessionFactoryBean -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- MyBatis의 SqlSessionFactory를 설정 -->
<property name="dataSource" ref="myDataSource"> <!-- ref에 2번의 id -->
</property>
<property name="mapperLocations">
<list>
<value>classpath:com/config/MemberMapper.xml</value>
</list>
</property>
<property name="typeAliases">
<list>
<value>com.dto.MemberDTO</value>
</list>
</property>
</bean>
<!-- 6. SQLSessionTemplate : SQLSession 기능 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!-- SQL 쿼리를 실행하기 위해 활용 -->
<constructor-arg name="sqlSessionFactory" ref="sessionFactory"> <!-- ref에 4번의 id -->
</constructor-arg>
</bean>
</beans>
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- post 한글 처리 -->
<filter>
<filter-name>filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
web.xml
package com.controller.member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.service.member.LoginService;
import com.service.member.RegisterService;
@Controller
public class AjaxController {
@Autowired
LoginService lServ;
@Autowired
RegisterService rServ;
//***************************************************************************************************************
//***************************************************로 그 인*******************************************************
//***************************************************************************************************************
//메인에서 로그인 여부 확인 에이젝스
@RequestMapping(value = "AjaxCheckIDPW", method = RequestMethod.POST)
public String AjaxCheckIDPW(String userId, String userPw) {
boolean canLogin = lServ.loginPossible(userId, userPw);
String mesg = "loginSuccess";
if (!canLogin) {
mesg = "loginFail";
}
return mesg;
}
//전체 비밀번호 찾기에서 질문에 따른 대답 확인 에이젝스
@RequestMapping(value = "AjaxMatchQnA", method = RequestMethod.POST)
public String AjaxMatchQnA(String confirmUserInfo, String userAnswer, String userId) {
boolean can_All_PW = false;
String mesg = "correct_Answer";
//디버그 코드*****************************
System.out.println(confirmUserInfo);
System.out.println(userAnswer);
System.out.println(userId);
//*************************************
// 선택된 질문에 따라 사용되는 Method 변경**************************
if (confirmUserInfo.equals("nickname")) {
can_All_PW = lServ.findPWbyNickname(userAnswer, userId);
} else if (confirmUserInfo.equals("userPhoneNum")) {
can_All_PW = lServ.findPWbyPhoneNum(userAnswer, userId);
} else if (confirmUserInfo.equals("userEmail")) {
can_All_PW = lServ.findPWbyEmail(userAnswer, userId);
}
// 선택된 질문에 따라 사용되는 Method 변경**************************
//디버그 코드*****************************
System.out.println(can_All_PW);
//*************************************
//사용자 ID와 질문과 답변이 일치하지 않을 경우, ajax출력
if (can_All_PW == false){
mesg = "wrong_Answer";
}
//사용자 ID와 질문과 답변이 일치할 경우, ajax출력
return mesg;
}
//***************************************************************************************************************
//***************************************************회원 가입*******************************************************
//***************************************************************************************************************
//회원가입 자식창에서 아이디 중복 에이젝스
@RequestMapping(value = "AjaxIDDuplicate", method = RequestMethod.POST)
public String AjaxIDDuplicate(String userId) {
boolean isDuplicate = rServ.isUserIdDuplicate(userId);
String mesg = "notDuplicate";
if (isDuplicate) {
mesg = "duplicate";
}
return mesg;
}
//회원가입 자식창에서 닉네임 중복 에이젝스
@RequestMapping(value = "AjaxNicknameDuplicate", method = RequestMethod.POST)
public String AjaxNicknameDuplicate(String nickname) {
boolean isDuplicate = rServ.isUserNicknameDuplicate(nickname);
String mesg = "notDuplicate";
if (isDuplicate) {
mesg = "duplicate";
}
return mesg;
}
//회원가입 자식창에서 이메일 중복 에이젝스
@RequestMapping(value = "AjaxEmailDuplicate", method = RequestMethod.POST)
public String AjaxEmailDuplicate(String userEmailId, String userEmailDomain) {
boolean isDuplicate = rServ.isUserEmailDuplicate(userEmailId, userEmailDomain);
String mesg = "notDuplicate";
if (isDuplicate) {
mesg = "duplicate";
}
return mesg;
}
//회원가입 자식창에서 핸드폰 번호 중복 에이젝스
@RequestMapping(value = "AjaxPhoneNumDuplicate", method = RequestMethod.POST)
public String AjaxPhoneNumDuplicate(String userPhoneNum1, String userPhoneNum2, String userPhoneNum3) {
boolean isDuplicate = rServ.isUserPNDuplicate(userPhoneNum1, userPhoneNum2, userPhoneNum3);
String mesg = "notDuplicate";
if (isDuplicate) {
mesg = "duplicate";
}
return mesg;
}
}
AjaxController
package com.controller.member;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.dto.MemberDTO;
import com.service.member.LoginService;
@Controller
public class LoginController {
@Autowired
LoginService serv;
//로그인
@RequestMapping(value = "/Mypage", method = RequestMethod.POST)
public String LoginToMypage(String userId, String userPw, HttpSession session) {
MemberDTO dto = serv.login(userId, userPw);
if (dto != null) {
session.setAttribute("loginUser", dto);
return "main";
} else {
return "member/Find_Info/cantFindUserdata";
}
}
//로그아웃
@RequestMapping(value = "/Logout", method = RequestMethod.POST)
public String Logout(HttpSession session) {
MemberDTO dto = (MemberDTO) session.getAttribute("loginUser");
if (dto != null) {
session.removeAttribute("loginUser");
return "main";
} else {
return "member/Find_Info/cantFindUserdata";
}
}
//어아다 첮가
@RequestMapping(value = "/SearchID", method = RequestMethod.POST)
public String SearchID(HttpServletRequest request, String userName, String ssn1, String ssn2, HttpSession session) {
MemberDTO dto = serv.findUserId(userName, ssn1, ssn2);
if (dto != null) {
request.setAttribute("found_userId", dto);
return "member/Find_Info/viewID";
} else {
return "member/Find_Info/cantFindUserdata";
}
}
//비밀번호 찾기
@RequestMapping(value = "/SearchPartPW", method = RequestMethod.POST)
public String SearchPartPW(HttpServletRequest request, HttpServletResponse response, String userId, String userName, String ssn1, String ssn2, HttpSession session) {
MemberDTO dto = serv.findUserPW(userId, userName, ssn1, ssn2);
if (dto != null) {
Cookie userIdCookie = new Cookie("findPW_userid",userId);
userIdCookie.setMaxAge(30*60);
response.addCookie(userIdCookie);
request.setAttribute("foundUserPW", dto);
return "member/Find_Info/viewPartPW";
} else {
return "member/Find_Info/cantFindUserdata";
}
}
//전체 비밀번호 출력용
@RequestMapping(value = "/SearchAllPW", method = RequestMethod.POST)
public String SearchAllPW(HttpServletRequest request, String userId, HttpSession session) {
MemberDTO dto = serv.selectMemberData(userId);
if (dto != null) {
request.setAttribute("foundUserInfo", dto);
//디버그 코드************************************************************************
return "member/Find_Info/viewAllPW";
//디버그 코드******
// RequestDispatcher dis = request.getRequestDispatcher("SendEmailServlet");
// dis.forward(request, response);
} else {
return "member/Find_Info/cantFindUserdata";
}
}
}
로그인 컨트롤러
기타 생략
package com.service.member;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dao.member.LoginDAO;
import com.dto.MemberDTO;
@Service
public class LoginService {
@Autowired
LoginDAO dao;
//디버그용 - 회원 정보 찾기
public List<MemberDTO> selectAll() {
List<MemberDTO> list = dao.selectAll();
return list;
}
//아이디 찾기
public MemberDTO findUserId(String userName, String ssn1, String ssn2) {
HashMap<String, String> dataForFindUserId = new HashMap<String, String>();
dataForFindUserId.put("userName", userName);
dataForFindUserId.put("ssn1", ssn1);
dataForFindUserId.put("ssn2", ssn2);
MemberDTO dto = dao.findUserId(dataForFindUserId);
return dto;
}
//비밀번호 찾기
public MemberDTO findUserPW(String userId, String userName, String ssn1, String ssn2) {
Map<String, String> dataForFindUserPW = new HashMap<String, String>();
dataForFindUserPW.put("userId", userId);
dataForFindUserPW.put("userName", userName);
dataForFindUserPW.put("ssn1", ssn1);
dataForFindUserPW.put("ssn2", ssn2);
MemberDTO dto = dao.findUserPW(dataForFindUserPW);
return dto;
}
//로그인
public MemberDTO login(String userId, String userPw) {
Map<String, String> idPW = new HashMap<String, String>();
idPW.put("userId", userId);
idPW.put("userPw", userPw);
MemberDTO dto = dao.login(idPW);
return dto;
}
//로그인 에이젝스
public boolean loginPossible(String userId, String userPw) {
Map<String, String> dataForLogin = new HashMap<String, String>();
dataForLogin.put("userId", userId);
dataForLogin.put("userPw", userPw);
return dao.loginPossible(dataForLogin);
}
//전체 비밀번호 - 닉네임으로 찾기
public boolean findPWbyNickname(String userAnswer, String userid) {
HashMap<String, String> nicknameMap = new HashMap<String, String>();
nicknameMap.put("nickname", userAnswer);
nicknameMap.put("userid", userid);
return dao.findPWbyNickname(nicknameMap);
}
//전체 비밀번호 - 이메일로 찾기
public boolean findPWbyEmail(String userAnswer, String userid) {
String[] emailParts = userAnswer.split("@");
HashMap<String, String> emailMap = new HashMap<String, String>();
emailMap.put("userEmailId", emailParts[0]);
emailMap.put("userEmailDomain", emailParts[1]);
emailMap.put("userid", userid);
return dao.findPWbyEmail(emailMap);
}
//전체 비밀번호 - 핸드폰 번호로 찾기
public boolean findPWbyPhoneNum(String userAnswer, String userid) {
Map<String, String> phoneNumMap = new HashMap<String, String>();
phoneNumMap.put("userPhoneNum1", userAnswer.substring(0, 3));
phoneNumMap.put("userPhoneNum2", userAnswer.substring(3, 7));
phoneNumMap.put("userPhoneNum3", userAnswer.substring(7));
phoneNumMap.put("userid", userid);
return dao.findPWbyPhoneNum(phoneNumMap);
}
//전체 비밀번호 출력용
public MemberDTO selectMemberData(String userId) {
MemberDTO dto = dao.selectMemberData(userId);
return dto;
}
}
로그인 서비스
package com.dao.member;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.dto.MemberDTO;
@Repository
public class LoginDAO {
@Autowired
SqlSessionTemplate session;
//디버그용 - 회원 정보 찾기
public List<MemberDTO> selectAll() {
List<MemberDTO> list = session.selectList("selectAll");
System.out.println("dao "+ list);
return list;
}
//아이디 찾기
public MemberDTO findUserId(Map<String, String> dataForFindUserId) {
MemberDTO dto = session.selectOne("com.config.MemberMapper.findUserId", dataForFindUserId);
return dto;
}
//비밀번호 찾기
public MemberDTO findUserPW(Map<String, String> dataForFindUserPW) {
MemberDTO dto = session.selectOne("com.config.MemberMapper.findUserPW", dataForFindUserPW);
return dto;
}
//로그인
public MemberDTO login(Map<String, String> idPW) {
MemberDTO dto = session.selectOne("com.config.MemberMapper.login", idPW);
return dto;
}
//로그인 에이젝스
public boolean loginPossible(Map<String, String> dataForLogin) {
int num = session.selectOne("com.config.MemberMapper.loginPossible", dataForLogin);
return num > 0;
}
//전체 비밀번호 - 닉네임으로 찾기
public boolean findPWbyNickname(HashMap<String, String> nicknameMap) {
int num = session.selectOne("com.config.MemberMapper.findPWbyNickname", nicknameMap);
return num > 0;
}
//전체 비밀번호 - 이메일로 찾기
public boolean findPWbyEmail(HashMap<String, String> emailMap) {
int num = session.selectOne("com.config.MemberMapper.findPWbyEmail", emailMap);
return num > 0;
}
//전체 비밀번호 - 핸드폰 번호로 찾기
public boolean findPWbyPhoneNum(Map<String, String> phoneNumMap) {
int num = session.selectOne("com.config.MemberMapper.findPWbyPhoneNum", phoneNumMap);
return num > 0;
}
//전체 비밀번호 출력용
public MemberDTO selectMemberData(String userId) {
MemberDTO dto = session.selectOne("com.config.MemberMapper.selectMemberData", userId);
return dto;
}
}
로그인 DAO