팀프로젝트 1일차
로그인 구현
1. DB 테이블 설계 ( Mysql 사용 )
member 테이블 ( CRUD )
CREATE TABLE `member` (
`mno` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`phone` varchar(20) DEFAULT NULL,
`hiredate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`job` varchar(50) DEFAULT NULL,
`deptno` int DEFAULT NULL,
PRIMARY KEY (`mno`)
) ENGINE=InnoDB AUTO_INCREMENT=1019 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
dept ( 부서정보 저장용 )
CREATE TABLE `department` (
`deptno` int NOT NULL,
`dname` varchar(255) NOT NULL,
`loc` varchar(255) NOT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
2. STS 4 ( 스프링부트 프로젝트 ) 설정
build.gradle
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '2.7.15'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.study'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '11'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'javax.servlet:jstl'
implementation "org.apache.tomcat.embed:tomcat-embed-jasper"
implementation "org.springframework.boot:spring-boot-starter-jdbc"
implementation('org.slf4j:jcl-over-slf4j')
implementation('ch.qos.logback:logback-classic')
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
tasks.named('test') {
useJUnitPlatform()
}
application.properties
server.port=9092
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/spring5fs?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/33team?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=33team
spring.datasource.password=33team
spring.messages.basename=message
spring.messages.encoding=UTF-8
3. DTO, DAO, 커맨드클래스, 서비스, 익셉션파일
DTO
package com.study.springboot.spring;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@Getter
@NoArgsConstructor
@Setter
public class Member {
private Long mno;
private String name;
private String password;
private String phone;
private LocalDateTime hiredate;
private String job;
private Integer deptno;
public Member(long mno,String name ,String password,
String phone, LocalDateTime hiredate, String job, int deptno) {
this.mno = mno;
this.name= name;
this.password = password;
this.phone = phone;
this.hiredate = LocalDateTime.now();
this.job = job;
this.deptno = deptno;
}
void setMno(Long mno) {
this.mno = mno;
}
public void changePassword(String oldPassword, String newPassword) {
if (!password.equals(oldPassword))
throw new WrongIdPasswordException();
this.password = newPassword;
}
public boolean matchPassword(String password) {
return this.password.equals(password);
}
}
DAO
package com.study.springboot.spring;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import lombok.RequiredArgsConstructor;
@Repository
public class MemberDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public Member selectByMno(Long Mno) {
List<Member> results = jdbcTemplate.query(
"select * from MEMBER where mno = ?",
new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
Member member = new Member(
rs.getLong("mno"),
rs.getString("NAME"),
rs.getString("PASSWORD"),
rs.getString("PHONE"),
rs.getTimestamp("hiredate").toLocalDateTime(),
rs.getString("job"), rs.getInt("deptno"));
member.setMno(rs.getLong("mno"));
return member;
}
}, Mno);
return results.isEmpty() ? null : results.get(0);
}
}
커맨드 클래스
package com.study.springboot.spring;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MemberInfo {
private Long mno;
private String name;
private String phone;
private String job;
private Integer deptno;
}
서비스
package com.study.springboot.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MemberService {
@Autowired
private MemberDao memberDao;
public MemberInfo authenticate(Long mno, String password) {
Member member = memberDao.selectByMno(mno);
if (member == null) {
throw new WrongIdPasswordException();
}
if (!member.matchPassword(password)) {
throw new WrongIdPasswordException();
}
return new MemberInfo(member.getMno(),
member.getName(), member.getPhone(), member.getJob(), member.getDeptno());
}
}
익셉션
package com.study.springboot.spring;
public class WrongIdPasswordException extends RuntimeException {
}
메세지 파일
member.register=회원가입
term=약관
term.agree=약관동의
next.btn=다음단계
member.info=회원정보
mno=사번e
name=이름
password=비밀번호
password.confirm=비밀번호 확인
register.btn=가입 완료
register.done=<strong>{0}님 ({1})</strong>, 회원 가입을 완료했습니다.
go.main=메인으로 이동
required=필수항목입니다.
bad.mno=사번이 올바르지 않습니다.
duplicate.mno=중복된 사번 입니다.
nomatch.confirmPassword=비밀번호와 확인이 일치하지 않습니다.
login.title=로그인
login.btn=로그인하기
idPasswordNotMatching=아이디와 비밀번호가 일치하지 않습니다.
login.done=로그인에 성공했습니다.
remembermno=사번 기억하기
change.pwd.title=비밀번호 변경
currentPassword=현재 비밀번호
newPassword=새 비밀번호
change.btn=변경하기
notMatching.currentPassword=비밀번호를 잘못 입력했습니다.
change.pwd.done=비밀번호를 변경했습니다.
4. 컨트롤러, 커맨드
로그인 컨트롤러
package com.study.springboot.controller;
import javax.servlet.http.Cookie;
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.validation.Errors;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.study.springboot.spring.MemberInfo;
import com.study.springboot.spring.MemberService;
import com.study.springboot.spring.WrongIdPasswordException;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequestMapping("/login")
@Slf4j
public class LoginController {
@Autowired
private MemberService authService;
@GetMapping
public String form(LoginCommand loginCommand) {
return "login/loginForm";
}
@PostMapping
public String submit(LoginCommand loginCommand, Errors errors, HttpSession session) {
new LoginCommandValidator().validate(loginCommand, errors);
if(errors.hasErrors()) {
return "login/loginForm";
}
try {
MemberInfo memberInfo = authService.authenticate(loginCommand.getMno(),
loginCommand.getPassword());
// 로그인 session 테스트
session.setAttribute("memberInfo", memberInfo);
session.setAttribute("test", memberInfo);
MemberInfo memberinfo = (MemberInfo) session.getAttribute("memberInfo");
log.info("-----login------->" + memberInfo);
return "login/loginSuccess";
} catch (WrongIdPasswordException e) {
errors.reject("idPasswordNotMatching");
return "login/loginForm";
}
}
}
로그아웃 컨트롤러
package com.study.springboot.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LogoutController {
@RequestMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/main";
}
}
커맨드 파일 ( jsp에서 입력받은거 처리 )
package com.study.springboot.controller;
public class LoginCommand {
private Long mno;
private String password;
private boolean rememberMno;
public Long getMno() {
return mno;
}
public void setMno(Long mno) {
this.mno = mno;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isRememberMno() {
return rememberMno;
}
public void setRememberMno(boolean rememberMno) {
this.rememberMno = rememberMno;
}
}
JSP ( 실행 )
loginForm.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="login.title" /></title>
</head>
<body>
<form:form modelAttribute="loginCommand">
<form:errors />
<p>
<label><spring:message code="mno" />:<br>
<form:input path="mno" />
<form:errors path="mno"/>
</label>
</p>
<p>
<label><spring:message code="password" />:<br>
<form:password path="password" />
<form:errors path="password"/>
</label>
</p>
<input type="submit" value="<spring:message code="login.btn" />">
</form:form>
</body>
</html>
loginSuccess.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="login.title" /></title>
</head>
<body>
<p>
<spring:message code="login.done" />
</p>
<p>
<a href="<c:url value='/main'/>">
[<spring:message code="go.main" />]
</a>
</p>
</body>
</html>
main.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>메인</title>
</head>
<body>
<c:if test="${empty memberInfo}">
<p>환영합니다.</p>
<p>
<a href="<c:url value="/join" />">[회원 가입하기]</a>
<a href="<c:url value="/login" />">[로그인]</a>
</p>
</c:if>
<c:if test="${! empty memberInfo}">
<p>${memberInfo.name}님, 환영합니다.</p>
<p>
<a href="<c:url value="/edit/changePassword" />">[비밀번호 변경]</a>
<a href="<c:url value="/logout" />">[로그아웃]</a>
</p>
</c:if>
</body>
</html>
'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글
2023-09-06 77일차 (0) | 2023.09.06 |
---|---|
2023-09-05 76일차 (0) | 2023.09.05 |
2023-09-01 74일차 (0) | 2023.09.01 |
2023-08-31 73일차 (0) | 2023.08.31 |
2023-08-30 72일차 (0) | 2023.08.30 |