팀프로젝트 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

+ Recent posts