팀프로젝트/Spring

Spring 팀플) 20240219 스프링전환

일일일코_장민기 2024. 3. 21. 10:26
728x90

원래는 이러면 만들어져야 되는데 뒤지기 안 만들어진다. 그래서 강사님이 주신 탬플릿을 import해서 주로 사용
pom.xml 수정
pom.xml 마저 수정
라이브러리 변경

		
<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 수정

 

<?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

 

컨트롤러 라인업. jdbc.properties와 MemberMapper 외에는 전체적으로 바뀌었다.
dto의 alias 설정

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

 

jsp 목록

 

jsp는 큰 차이 없다... 일단 모든 기능이 다 돌아가진 않았지만 출력은 잘 된다.