회원 가입 프로젝트 #1

정의정·2023년 6월 11일
0

Spring

목록 보기
5/12
post-thumbnail
post-custom-banner

💡 회원 가입 프로젝트 #1

지금까지 배운 것들을 이용해 회원 가입 및 암호 변경 기능을 가진 프로그램을 구현할 것이다.

📌 순서

  1. 메이븐 프로젝트 생성 및 이클립스 임포트하기
  2. 회원 데이터 관련 클래스 작성하기
  3. 회원 가입 처리 관련 클래스 작성하기
  4. 암호 변경 관련 클래스 작성하기

🌟 메이븐 프로젝트 생성 및 이클립스 임포트하기

1. 폴더

폴더 생성✔️

sp-chap02 프로젝트 폴더를 생성하고 하위 폴더 src/main/java를 차례로 생성한다.

2. pom.xml

pom.xml✏️

프로젝트 폴더에 아래와 같은 pom.xml 파일을 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<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 
		http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>spring</groupId>
	<artifactId>sp-chap02</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<source>11</source>
					<target>11</target>
					<encoding>utf-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

지난 Greeter 프로젝트와 다른 점은 <artifactId> 값이 sp-chap02이라는 것이다.

3. Maven 프로젝트 생성 및 import

Maven 프로젝트 생성✔️

프로젝트 폴더에서 다음 명령어를 실행하면 메이븐 프로젝트가 생성된다.

mvn compile

Maven 프로젝트 import✔️

만든 메이븐 프로젝트를 임포트하자.

위 과정에서 막히는 부분이 있다면 지난 프로젝트 시작하기 포스트를 참고하자.


🌟 회원 데이터 관련 클래스 작성하기

<회원 데이터 관련 클래스>
1. Member
2. WrongIdPasswordException
3. MemberDao

1. Member

Member.java✏️

src/main/java 폴더에 spring 패키지안에 Member.java 클래스를 생성하고 아래와 같이 작성한다.

package spring;

import java.time.LocalDateTime;

public class Member {
	
	private Long id;
	private String email;
	private String password;
	private String name;
	private LocalDateTime registerDateTime;
	
	public Member(String email, String password, String name, LocalDateTime registerDateTime) {
		this.email = email;
		this.password = password;
		this.name = name;
		this.registerDateTime = registerDateTime;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getEmail() {
		return email;
	}

	public String getPassword() {
		return password;
	}

	public String getName() {
		return name;
	}

	public LocalDateTime getRegisterDateTime() {
		return registerDateTime;
	}
	
	public void changePassword(String oldPassword, String newPassword) {
		if(!password.equals(oldPassword)) throw new WrongIdPasswordException();
		this.password = newPassword;
	}
}

회원 데이터를 표현하기 위해 사용할 Member 클래스다.

changePassword() 메서드는 비밀번호 변경 기능을 구현했다. 매개변수로 받은 기존 비밀번호 oldPasswordpassword 필드값과 일치하지 않을 경우 예외 처리로 넘기고 값이 일치하는 경우엔 password 필드값을 매개변수로 받은 newPassword로 변경한다.

📌 tip

getter/setter 메서드는 이클립스의 source > Generate Getters and Setters...에서 빠르게 추가할 수 있다. 이미 getter/setter 메서드에 익숙하다면, 시간 단축을 위해 유용하게 사용하면 좋을 것 같다.

2. WrongPasswordException

WrongPasswordException.java✏️

앞서 만든 Member 클래스의 비밀번호 변경 기능 중 예외 처리에서 사용한 WrongPasswordException 익셉션 타입 클래스를 작성해보자.

package spring;

public class WrongIdPasswordException extends RuntimeException {
	
}

3. MemberDao

MemberDao.java✏️

단계상 아직 DB연동을 다루지 않으므로, 자바의 Map을 이용해 구현한다.
아래와 같이 MemberDao 클래스를 작성한다.

package spring;

import java.util.HashMap;
import java.util.Map;

public class MemberDao {

	private static long nextId = 0;

	private Map<String, Member> map = new HashMap<>();

	public Member selectByEmail(String email) {
		return map.get(email);
	}

	public void insert(Member member) {
		member.setId(++nextId);
		map.put(member.getEmail(), member);
	}

	public void update(Member member) {
		map.put(member.getEmail(), member);
	}

}

🌟 회원 가입 처리 관련 클래스 작성하기

<회원 가입 처리 관련 클래스>
1. DuplicateMemberException
2. RegisterRequest
3. MemberRegisterService

1. DuplicateMemberException

DuplicateMemberException.java✏️

회원 가입 중 이메일 중복 예외 처리를 위한 익셉션 타입, DuplicateMemberException 클래스를 작성한다.

package spring;

public class DuplicateMemberException extends RuntimeException {
	
	public DuplicateMemberException(String message) {
		super(message);
	}
}

2. RegisterRequest

RegisterRequest.java✏️

RegisterRequest 클래스는 회원 가입을 처리할 때 필요한 데이터를 담고 있다. 코드는 다음과 같다.

package spring;

public class RegisterRequest {

	private String email;
	private String password;
	private String confirmPassword;
	private String name;

	public String getEmail() {
		return email;
	}

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

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getConfirmPassword() {
		return confirmPassword;
	}

	public void setConfirmPassword(String confirmPassword) {
		this.confirmPassword = confirmPassword;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public boolean isPasswordEqualToConfirmPassword() {
		return password.equals(confirmPassword);
	}
}

isPasswordEqualToConfirmPassword() 메서드는 비밀번호와 비밀번호 확인이 일치하는지 확인한다.

3. MemberRegisterService

MemberRegisterService.java✏️

회원 가입 서비스 클래스인 MemberRegisterService를 작성한다. 지난 포스트에서 다룬 의존 주입을 떠올리며, 생성자를 통해 MemberRegisterService가 의존하고 있는 MemberDao 객체를 주입받은 점을 주목하자.

package spring;

import java.time.LocalDateTime;

public class MemberRegisterService {

	private MemberDao memberDao;

	public MemberRegisterService(MemberDao memberDao) {
		this.memberDao = memberDao;
	}

	public Long regist(RegisterRequest req) {
		Member member = memberDao.selectByEmail(req.getEmail());
		if (member != null) {
			throw new DuplicateMemberException("dup email " + req.getEmail());
		}
		Member newMember = new Member(req.getEmail(), req.getPassword(), req.getName(), LocalDateTime.now());
		memberDao.insert(newMember);
		return newMember.getId();
	}
}

regist() 메서드는 앞서 작성했던 memberDao.selectByEmail() 메서드를 통해 동일한 이메일을 갖는 회원 데이터가 있는지 확인하고 존재하면 DuplicateMemberException을 발생시킨다.
같은 이메일을 가진 회원이 없을 경우에만 Member 객체를 생성하여 memberDao.insert() 메서드를 이용해 저장한다.

🌟 암호 변경 관련 클래스 작성하기

<암호 변경 관련 클래스>
1. ChangePasswordService
2. MemberNotFoundException

ChangePasswordService.java✏️

암호 변경 기능을 제공하는 ChangePasswordService 클래스를 작성한다.

package spring;
>
public class ChangePasswordService {
>
	private MemberDao memberDao;
>
	public void changePassword(String email, String oldPwd, String newPwd) {
		Member member = memberDao.selectByEmail(email);
		if (member == null)
			throw new MemberNotFoundException();
>
		member.changePassword(oldPwd, newPwd);
>
		memberDao.update(member);
	}
>
	public void setMemberDao(MemberDao memberDao) {
		this.memberDao = memberDao;
	}
}

암호를 변경할 Member 데이터를 찾기 위해 email을 활용한다. 만약 email에 해당 하는 Member가 존재하지 않을 시 MemberNotFoundException을 발생시킨다. Member가 존재하면 member.changePassword() 메서드를 이용해 암호를 변경한다.

MemberNotFoundException.java✏️

changePasswordService의 changePassword() 메서드에서 받은 email에 일치하는 Member가 존재하지 않을 시 사용될 익셉션 타입 클래스를 작성한다.

package spring;

public class MemberNotFoundException extends RuntimeException {

}

🎀 줄이며...

이제 실제 객체를 생성하는 코드를 작성해야 한다. main 메서드에서 의존 대상을 생성하고 주입할 수도 있다.

하지만 객체를 생성하고 의존 객체를 주입해주는 클래스를 따로 작성할 것이다.

의존 객체를 주입한다는 것은 서로 다른 두 객체를 조립한다고 생각할 수 있다.

그래서 이 클래스를 객체 조립기(Assembler)라고 표현한다.

다음 포스트에서는 객체 조립기(Assembler)와 메인 클래스를 작성하여 프로그램을 실행할 수 있도록 하겠다.

📖 교재 및 출처

  • 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 | 최범균님 저
profile
배움 기록
post-custom-banner

0개의 댓글