[Spring 재수강] - Maven Project로 Member 관리 시스템 만들기 (1)

2020. 9. 15. 20:13개발공부/Spring

#Spring #Maven #관리시스템

1. Member 클래스 생성

코로나로 인해 대형 학원이 휴강에 들어가며 끊겼던 수업을 3주 뒤인 지금 비대면 강의로 듣고 있습니다. 바뀐 강사님은 선실습-후이론 방식의 수업을 하시는데 지난 강의와 달리 새로워 좋습니다. 첫 번째 실습 프로젝트인 Member 관리 시스템(회원 관리 시스템)입니다.

먼저 필요한 정보와 생성자를 만들어 줄 Java 클래스 name : Member를 만들어 줍니다. 필요한 정보는 id, email, password, name, date(Date 클래스 API) 입니다. private  변수 선언을 해줍니다. 그리고 생성자(constructor)를 만들어 주는데 빈(empty) 것 하나와 필드 변수가 내재되어 있는 것 두 개를 만들어줍니다. 입문 강좌라 Spring을 활용하지 않고 구현하는 방법도 실습하기 때문입니다. DB를 getter, setter를 활용해 관리할 거라면 기본 생성자는 필수로 만들어 줘야 합니다. Primary Key(기본키) 역할을 해줍니다.

몰랐던 개념을 구현해봤는데요, @Override 아노테이션을 활용한 toString 메서드입니다. Member 객체를 호출했을 때 주소값 대신 객체에 담긴 정보를 출력해줍니다. 

package spring;

import java.util.Date;

//Spring 본격 시작
public class Member {
	private Long id;
	private String email;
	private String password;
	private String name;
	private Date registerDate;
	 
	//기본키 역할을 해줄 생성자 생성
	public Member() {
		
	}
	
	
	
	public Member(String email, String password, String name, Date registerDate) {
		super();
		this.email = email;
		this.password = password;
		this.name = name;
		this.registerDate = registerDate;
	}


	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	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 getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getRegisterDate() {
		return registerDate;
	}
	public void setRegisterDate(Date registerDate) {
		this.registerDate = registerDate;
	}

	//객체 설명을 반환 용도
	@Override
	public String toString() {
		return "Member [id=" + id + ", email=" + email + ", password=" + password + ", name=" + name + ", registerDate="
				+ registerDate + "]";
	}
	

 

2. DAO 클래스 생성

DB 연동없이 실습을 진행하기 때문에 DB에 접근하여 데이터 처리 기능을 하는 DAO 클래스를 생성했습니다. DB는 Map 형식의 map 변수를 지정해 대체하였습니다. key값엔 email, value값은 Member 객체가 들어갑니다. DB에 접근해 명령를 처리하는 메서드를 만들어 주었는데요, 오늘 만든 것들은 총 5가지 입니다. 

 1) 회원 등록_ 2) 회원 조회_ 3) 비밀번호 변경_ 4) 탈퇴_ 5) 전체 회원 조회

 1) 회원 등록

회원 등록 insert 메서드는 nextId++ 연산자를 통해 회원 ID를 자동생성 합니다. OracleDB에서 시퀀스를 create해 id를 자동 증가시키는 것과 유사한 기능입니다. insert 메서드의 매개 변수엔 Member 객체(필드 변수가 내재된 생성자)를 받아서 회원정보를 Map 형태로 저장하는데요. put  메서드를 이용해서 PK*(primary key)에 email을 담고 value에 Member객체를 저장해줬습니다. 

 2) 회원 조회

 회원조회 메서드는 PK를 매개변수로 받아 기준으로 잡았습니다. 반환할 땐 Member 객체로 된 인스턴스를 생성해 return 했습니다. selectByEmail 메서드를 호출할 때 @Override 아노테이션을 활용한 toString 메서드를 Member 클래스에 설정해줬기 때문에 외계어 같은 주소값이 아닌 데이터가 출력됩니다. 

 3) 비밀번호 변경

 3~5번은 과제라서 피드백을 거치기 전 코드입니다. 작동에 성공했지만 수정 가능성이 있습니다. 비밀번호 변경 메서드의 매개변수 설정에 있어 처음 접근은 insert된 Member 객체를 받는다 였습니다. 하지만 사용자 입장에서 고려할 때 email, password, nwPassword만 입력받는 게 맞다고 생각했습니다. 현실에서 email, password과 name까지 입력해 새로운 비밀번호로 변경하는 경우는 없기 때문입니다. 

그러나 Member 객체로 된 인스턴스는 생성해줘야 합니다. MySQL을 사용하지 않고 Java Map으로 DB를 대신하기 때문에 한 가지 데이터를 바꾸려면 객체 자체를 불러와 전체 데이터가 딸려옵니다. 인스턴스 change는 사용자가 입력한 email과 password가 일치하는 회원 정보를 불러오고(getPassword) 그 중 password만 쇽 바꿔줍니다(setPassword).

 4) 회원 탈퇴

 회원 탈퇴 기능인 delete 메서드의 사용자 데이터 접근방식은 3) 비밀번호 변경과 완전히 동일합니다. 다른 점은 Map 클래스 메서드 remove를 사용해 사용자의 모든 정보를 Map 안에서 삭제해준다는 것이죠. 탈퇴 로직이 가장 단순한 것 같습니다. 

 5) 전체 회원 조회

 등록되어 있는 모든 회원 정보를 출력하는 selectAll 메서드입니다. 회원은 2명 이상일 가능성이 높기 때문에 List<Member> 제네릭을  Member 객체로 반환 타입을 설정했습니다. Map 내 value를 출력하려면 Map의 keySet 메서드를 활용합니다. keySet은 모든 key값들을 Set 형태로 저장하고 있습니다. 그러면 다 끝났습니다. 반복문으로 key값을 호출해 Map의 get 메서드에 넣고 돌리면 value값들이 반환됩니다. value값은 생성해준 List<Member> 변수에 add 해줍니다. 끝

//DB 역할 클래스
public class MemberDao {
	private static long nextId = 0;
	private Map<String, Member> map = new HashMap<>();
	
	//1) 회원 등록
	public void insert(Member member) {
		nextId++;
		member.setId(nextId);
		//primary key가 email
		map.put(member.getEmail(), member);
	}
	//2) 회원 조회
	public Member selectByEmail(String email) {
		//어떤 형식으로 return 되는거지? Member객체 형식이 뭔가? (Member클래스 toString 활용)
		Member result = map.get(email);
		return result;
	}
	//3) 비밀번호 변경
	public String update(String email, String password, String nwPassword) {
		Member change = map.get(email);
		if(change.getPassword().contentEquals(password)) {
			change.setPassword(nwPassword);
		} else {
			return "비밀번호 오류";
		}
		
		return "비밀번호 업데이트 완료";
	}

	//4) 회원탈퇴
	public String delete(String email, String password) {
		Member erase = map.get(email);
		if(erase.getPassword().contentEquals(password)) {
			map.remove(email);
		} else {
			return "비밀번호 오류";
		}
		return "회원탈퇴 완료";
	}
	
	//5) 전체 회원 조회
	public List<Member> selectAll() {
		List<Member> allMember = new ArrayList<>();
		for (String key: map.keySet()) {
			allMember.add(map.get(key));
		};
		
		return allMember;
	}
}