지금까지 배운 것들을 이용해 회원 가입 및 암호 변경 기능을 가진 프로그램을 구현할 것이다.
📌 순서
- 메이븐 프로젝트 생성 및 이클립스 임포트하기
- 회원 데이터 관련 클래스 작성하기
- 회원 가입 처리 관련 클래스 작성하기
- 암호 변경 관련 클래스 작성하기
폴더 생성✔️
sp-chap02 프로젝트 폴더를 생성하고 하위 폴더 src/main/java를 차례로 생성한다.
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이라는 것이다.
Maven 프로젝트 생성✔️
프로젝트 폴더에서 다음 명령어를 실행하면 메이븐 프로젝트가 생성된다.
mvn compileMaven 프로젝트 import✔️
만든 메이븐 프로젝트를 임포트하자.
위 과정에서 막히는 부분이 있다면 지난 프로젝트 시작하기 포스트를 참고하자.
<회원 데이터 관련 클래스>
1. Member
2. WrongIdPasswordException
3. MemberDao
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() 메서드는 비밀번호 변경 기능을 구현했다. 매개변수로 받은 기존 비밀번호
oldPassword가password필드값과 일치하지 않을 경우 예외 처리로 넘기고 값이 일치하는 경우엔password필드값을 매개변수로 받은newPassword로 변경한다.📌 tip
getter/setter 메서드는 이클립스의
source>Generate Getters and Setters...에서 빠르게 추가할 수 있다. 이미 getter/setter 메서드에 익숙하다면, 시간 단축을 위해 유용하게 사용하면 좋을 것 같다.
WrongPasswordException.java✏️
앞서 만든 Member 클래스의 비밀번호 변경 기능 중 예외 처리에서 사용한 WrongPasswordException 익셉션 타입 클래스를 작성해보자.
package spring; public class WrongIdPasswordException extends RuntimeException { }
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
DuplicateMemberException.java✏️
회원 가입 중 이메일 중복 예외 처리를 위한 익셉션 타입, DuplicateMemberException 클래스를 작성한다.
package spring; public class DuplicateMemberException extends RuntimeException { public DuplicateMemberException(String message) { super(message); } }
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() 메서드는 비밀번호와 비밀번호 확인이 일치하는지 확인한다.
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. MemberNotFoundExceptionChangePasswordService.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 데이터를 찾기 위해
MemberNotFoundException을 발생시킨다. Member가 존재하면 member.changePassword() 메서드를 이용해 암호를 변경한다.MemberNotFoundException.java✏️
changePasswordService의 changePassword() 메서드에서 받은 email에 일치하는 Member가 존재하지 않을 시 사용될 익셉션 타입 클래스를 작성한다.
package spring; public class MemberNotFoundException extends RuntimeException { }
이제 실제 객체를 생성하는 코드를 작성해야 한다. main 메서드에서 의존 대상을 생성하고 주입할 수도 있다.
하지만 객체를 생성하고 의존 객체를 주입해주는 클래스를 따로 작성할 것이다.
의존 객체를 주입한다는 것은 서로 다른 두 객체를 조립한다고 생각할 수 있다.
그래서 이 클래스를 객체 조립기(Assembler)라고 표현한다.
다음 포스트에서는 객체 조립기(Assembler)와 메인 클래스를 작성하여 프로그램을 실행할 수 있도록 하겠다.
- 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 | 최범균님 저