본문 바로가기

국비지원

[JAVA]JDBC 활용 및 연습 - 회원 가입 및 탈퇴 - 1

반응형

메인메소드 실행 흐름 

JDBC의 사용이 익숙해지기 위해 콘솔입력을 받아 회원가입 및 회원탈퇴를 할 수 있는 프로그램을 만드는 과정이다.

 
// 간단한 콘솔 입력

// 1. 회원가입

// 2. 회원탈퇴
public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		UserInfoService service = new UserinfoServiceImpl(new UserinfoRepo());

		// 인터페이스를 필드로 선언
		// 분리한 이유 : 각 각의 인터페이스가 해야할 일이 다르다고 생각해서, 해당 클래스에 과중한 책임을 덜 주게끔 만들기 위해

		System.out.println("1. 회원가입 / 2. 회원탈퇴");
		int input = scan.nextInt();
		scan.nextLine();

		if (input == 1) {
			System.out.println("이메일, 이름, 성 입력");
			String email = scan.nextLine();
			String firstname = scan.nextLine();
			String lastname = scan.nextLine();

			try {
				int result = service.userin(email, firstname, lastname);
				System.out.println(result);
				if (result > 0) {
					System.out.println("회원가입 성공");
				}
			} catch (InputNotValidException e) {
				System.out.println(e.getMessage());
			}

//			System.out.println("입력값 확인 : " + email + ", " + firstname + ", " + lastname);
		} else if (input == 2) {
			System.out.println("아이디 번호 입력");
			int id = scan.nextInt();

			System.out.println("입력값 확인 : " + id);
		}
	}
}

 

 

(class) Userinfo

DB에서 사용 중인 데이터를 자바에서도 똑같이 활용하기 위해 Table의 컬럼값들과 똑 같은 필드를 갖는 Userinfo라는 클래스를 만들었다. 간단하게 getter, setter, tostring, constructor만 만들어두었다.

package ddaa;
public class Userinfo {
	private int id;
	private String email;
	private String fistname;
	private String lastname;

	public Userinfo(int id, String email, String fistname, String lastname) {
		super();
		this.id = id;
		this.email = email;
		this.fistname = fistname;
		this.lastname = lastname;
	}

	public int getId() {
		return id;
	}

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

	public String getEmail() {
		return email;
	}

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

	public String getFistname() {
		return fistname;
	}

	public void setFistname(String fistname) {
		this.fistname = fistname;
	}

	public String getLastname() {
		return lastname;
	}

	public void setLastname(String lastname) {
		this.lastname = lastname;
	}

	@Override
	public String toString() {
		return "Userinfo [id=" + id + ", email=" + email + ", fistname=" + fistname + ", lastname=" + lastname + "]";
	}

}

 

 

 


 

(interface) UserInfoService

UserinfoService 인터페이스는 userin(회원가입), userout(회원탈퇴) 이라는 동작을 수행할 수 있다.

[TIP]

인터페이스에는 상수를 필드로 만들 수 있다.

public interface UserInfoService {
	int INPUT_NOT_VALID = -1;
	int EMAIL_DUPLICATED = -2;

	int userin(String email, String firstname, String lastname);
	int userout(int id);
}

 

 

(interface) UserinfoRepository

UserinfoRepository 인터페이스는 DB입출력의 기능만 구현하였다.

countByEmail은 email값이 중복되었을 때 int값을 반환해주는 메소드,

selectByEmail은 email값이 중복되었을 때 Userinfo를 반환해주는 메소드,

insert는 입력받은 email, firstname, lastname을 DB로 출력해주는 메소드이다.

public interface UserinfoRepository {
	// DB입출력의 기능만 구현
	int countByEmail(String email);
	Userinfo selectByEmail(String email);
	int insert(String email, String firstname, String lastname); // pk반환
}

 

(class) UserinfoServiceImpl (interface) UserInfoService

UserInfoService를 구현한 클래스인 UserinfoServiceImpl 객체는 UserinfoRepository라는 도구가 있어야 일을 할 수 있다.

그래서 생성자에 UserinfoRepository를 꼭 생성해주어야 정상적으로 동작할 수 있는 객체가 만들어진다.

(생성자에서 repo를 생성하지 않는다면 UserinfoRepository에서 정의한 메소드를 사용할 수 없다.)

메인메소드에서 사용자에게 입력값을 받는 메소드는 userin메소드로 흐름은 다음과 같다.

verifyString메소드는 문자열 값이 테이블 행에 추가 될 때 이상없이 잘 들어갈 수 있는지 확인해주는 메소드다.

문자열과 DB에서 설정된 문자열 가변길이 제한값을 파라미터에서 건네받아 검증단계를 거친 후 이상이 없다면 email중복 검증으로 넘어가고, 이상이 있다면 예외를 발생시켜 사용자에게 어떠한 문제가 생겼는지 알려주게 된다.

 

(class) UserinfoRepo (interface) UserinfoRepository

이메일 검증단계는 건네받은 이메일을 sql 명령문을 통해 집계함수값을 ResultSet에 반환받도록 설계하였다.

중복된 이메일이라면 정수 1을 반환할 것이고, 그렇지 않다면 0을 반환하게 된다.

UserinfoServiceImpl 객체에서 성공적으로 검증단계를 거쳤다면 UserinfoRepository를 통해 DB로 접근할 수 있다.

건네받은 컬럼 값들은 검증을 거친 값들이기에 DB에 INSERT 해주면 된다.

그리고 insert메소드는 pk값을 리턴할 수 있도록 lastInsertID라는 메소드에서 마지막으로 INSERT된 pk값을 알 수 있다.

하지만 LAST_INSERT_ID 함수는 세션변수(?) 의 특성때문에 서버의 접속이 끊기면 0으로 초기화되는 특성을 갖고있기에, insert메소드에서 DB로 접속이 되고 접속이 끊기기전에 lastInserID값을 얻을 수 있도록 생각해보아야한다..! 

이부분은 2편에서 계속 진행하도록 하겠다.

다양한 형태로 올바른 값 타인에게 알려주는 방법

우리는 userin메소드 검증단계에서 검증에 이상이 있을 경우 어떠한 형태로 타인에게 올바른 값이 무엇인지를 알려주어야한다. 여러방법이 있었고 처음에는 입력값이 유효하지않다면 -1, 중복된 이메일이라면 -2를 반환하게 하였는데 이러면 타인이 코드를 볼 때 -1과 -2가 무엇을 의미하는지 알 수 없다. 

 

나만의 예외 만들어보기

 

그래서 우리는 예외를 발생시켜 메세지를 전달하는 방법과 인터페이스의 상수로 -1과 -2에 이름을 붙여주는 방법을 생각해보았다. 첫번째로 예외 발생으로 메세지 전달하는 방법이다.

 

우선 언체크드 예외로 만들기위해 RuntimeException을 상속받는 InputNotValidException 예외 클래스를 만들었다.

검증단계에서 이상이 생길 때 throw로 예외를 발생시키고 메세지를 입력하였다.

// 언체크 예외로 예외 클래스 만들어보기
public class InputNotValidException extends RuntimeException {
	public InputNotValidException(String message) {
		super(message);
	}

}

예외를 내가 발생시킬 수 있다.

대신 예외가 발생할 수 있는 동작을  trycatch로 감싸줘야 한다. 그러면 catch에서 e 객체에서 메세지를 받아 볼 수 있다.

정수값에 이름 붙여주기

인터페이스에는 상수를 선언할 수 있다.

-1은 입력값이 유효하지않다는 의미

-2는 이메일이 중복되었다는 의미이다.

이렇게 정수에 이름을 붙여줘 정수값이 무엇을 의미하는지 알 수 있게 된다.

public interface UserInfoService {
	int INPUT_NOT_VALID = -1;
	int EMAIL_DUPLICATED = -2;

	int userin(String email, String firstname, String lastname);
	int userout(int id);
}

어떠한 메소드에서 -1 혹은 -2를 반환했을 때 우리는 이렇게 처리할 수 있다.

result 가 -2 (EMAIL_DUPLICATED)일 때 결과에 알맞은 메세지를 출력할 수 있게된다.

아마 -2가 들어있다면 유추정도만 가능할뿐 어떤 의미가 담긴 정수인지 알기 힘들 것이다.

반응형