728x90

 

수업내용 정리 (Java)

 

1. 수업일지 29일차 1-3 문제 변형

로그인할때 틀리면 계속 입력을 받아서 로그인에 성공하면 멈추도록 하기(boolean으로 반환받기)
위와 동일하지만 boolean이 아니라 Member 변수로 반환받기로 변형

 1-1) 메인 ㄱ 

더보기
import java.util.Scanner;
import been.Member;
import service.MemberService;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 회원서비스 비지니스로직(업무코드)
		MemberService mSer = new MemberService();
		while(true) {
			System.out.print(" 아이디 입력> ");
			String id = sc.next();
			System.out.print(" 비밀번호 입력> ");
			String pw = sc.next();
			Member member = mSer.login(id, pw);
			if(member != null) {
				System.out.println(" > "+id+"님의 회원정보");
				member.showInfo();
				break;
			}else {
				System.out.println(" > id 또는 pw가 틀렸습니다.\n");
			}
		}
		System.out.println(" > 프로그램 종료");
	}
}
  • member가 null일 경우를 대비하여 if문을 입력하였다.

 

 1-2) Member 클래스 ㄱ 

더보기
public class Member {
	private String id;
	private String pw;
	private String name;
	private int age;
	private String birth;
	
	public Member(String id, String pw, String name, int age, String birth) {
		this.id=id;
		this.pw=pw;
		this.name=name;
		this.age=age;
		this.birth=birth;
	}

	public void showInfo() {
		System.out.println(" ‖ 아이디\t: "+id);
		System.out.println(" ‖  이름\t: "+name+"님");
		System.out.println(" ‖  나이\t: "+age+"살");
		System.out.println(" ‖  생일\t: "+birth);
	}
	@Override
	public String toString() {
		String str=(" ‖ 아이디\t: "+id+"\n ‖  이름\t: "+name+"님"
				+ "\n ‖  나이\t: "+age+"살"+"\n ‖  생일\t: "+birth);
		return str;
	}
}
  • 모든 동작은 서비스 클래스에서 할 것이기 때문에 생성자와 출력 메소드만 만들었다.
  • showInfo랑 toString 둘 다 동일하게 회원 정보를 출력하는 것이다.

 

 1-3) 서비스(동작) ㄱ 

더보기
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import common.JdbcUtil;
import been.Member;

// 회원관리 서비스
public class MemberService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	public Member login(String id, String pw) {
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id=? and pw=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				System.out.println(" > "+id+"님 로그인 성공");
				Member m = new Member(id, pw, rs.getString("name"),
						rs.getInt("age"), rs.getString("birth"));
				return m;
			}
		} catch (SQLException e) {
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
		return null;
	}
}
  • 입력받은 매개변수를 db에서 찾고, db에 있다면 해당 정보를 가져와서 Member 변수 m에 저장하고 m을 return한다.
  • id, pw 값도 db 값과 동일하니 Member m에 입력할 때 매개변수 값으로 해도 되지만 db 값이 진짜 값이니 id, pw 또한 db에서 가져오는 것도 나쁘지 않다. (나는 코드가 길어지니 줄였다.)
  • 정보 찾기와 입력이 끝났다면 finally를 통해 db를 닫아준다.

 

 

2. 수업일지 29일차 1-3 문제 변형2

로그인할때 틀리면 계속 입력을 받아서 로그인에 성공하면 멈추도록 하기(Member 객체로 반환받기)
위와 동일하지만 Member가 아니라 ArrayList<Member>로 반환받기
admin(관리자) 계정일 경우에는 모든 멤버 정보를 출력하고,
admin(관리자) 계정이 아닐 경우에는 본인의 정보만 출력
  • Member 클래스는 위의 1-2와 동일하게 사용한다.

 2-1) 메인 ㄱ 

더보기
import java.util.ArrayList;
import java.util.Scanner;
import been.Member;
import service.MemberService;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 회원서비스 비지니스로직(업무코드)
		MemberService mSer = new MemberService();
		
		while(true) {
			System.out.print(" 아이디 입력> ");
			String id = sc.next();
			System.out.print(" 비밀번호 입력> ");
			String pw = sc.next();
			ArrayList<Member> mList = mSer.login(id, pw);
			if(mList != null) {
				if(mList.size() == 1) {
					System.out.println(" > "+id+"님의 회원정보");
					System.out.println(" >----------+");
					System.out.println(mList.get(0));
					System.out.println(" >----------+");
				}else {
					System.out.println(" > 회원 정보 출력");
					mSer.showMemberList();
				}
				break;
			}else {
				System.out.println(" > id 또는 pw가 틀렸습니다.\n");
			}
		}
		System.out.println(" > 프로그램 종료");
	}
}
  • 위의 1-1과 비슷하지만 Member가 아닌 ArrayList로 변경했다.
  • 그리고 관리자 계정과 아닌 계정을 구분하여 정보를 출력해야 하기 때문에 if문을 사용했다.
  • 첫번째로 mList가 null인지 아닌지 구분하여 로그인이 되었는지 아닌지 확인한다.
  • 두번째로 mList가 null이 아닐 경우, mList의 길이가 1인지 그 이상인지 확인하여 로그인한 계정이 관리자 계정인지 아닌지 구분한다. 관리자 계정이 아닐 경우에는 로그인한 계정의 회원 정보를 출력하고, 관리자 계정인 경우에는 관리자 계정을 제외한 Member 회원 정보를 전부 출력한다.

 

 2-2) 서비스(동작) ㄱ 

더보기
// 전체 코드 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import common.JdbcUtil;
import been.Member;

// 회원관리 서비스
public class MemberService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	public ArrayList<Member> login(String id, String pw) {
		ArrayList<Member> mList = null;
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id=? and pw=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				mList = new ArrayList<Member>();
				if(id.equals("ADMIN") || id.equals("admin")) {
					System.out.println(" > 관리자 로그인 성공");
					sql = "select*from member where id!=?";
					pstmt=con.prepareStatement(sql);
					pstmt.setString(1, id);
					rs = pstmt.executeQuery();
					while(rs.next()) {
						Member m = new Member(rs.getString("id"),
							rs.getString("pw"), rs.getString("name"),
							rs.getInt("age"), rs.getString("birth"));
						mList.add(m);
					}
				}else {
					System.out.println(" > "+id+"님 로그인 성공");
					Member m = new Member(id, pw, rs.getString("name"),
							rs.getInt("age"), rs.getString("birth"));
					mList.add(m);
				}
			}
		} catch (SQLException e) {
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
		return mList;
	}

	public void showMemberList() {
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id!=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, "admin");
			rs = pstmt.executeQuery();
			System.out.println(" >------------------------+");
			System.out.println("ID\tNAME\tBIRTH");
			while(rs.next()) {
				System.out.println(" >--------------+");
				System.out.println(rs.getString("ID")+"\t"+rs.getString("NAME")+
				"\t"+rs.getString("BIRTH"));
			}
			System.out.println(" >------------------------+");
		} catch (SQLException e) {
			System.out.println(" > 정보 불러오기 실패");
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
	}
}

 

// login 메소드
public ArrayList<Member> login(String id, String pw) {
	ArrayList<Member> mList = null;
	con=JdbcUtil.getConnection();
	String sql = "select*from member where id=? and pw=?";
	try {
		pstmt=con.prepareStatement(sql);
		pstmt.setString(1, id);
		pstmt.setString(2, pw);
		rs = pstmt.executeQuery();
		if(rs.next()) {
			mList = new ArrayList<Member>();
			if(id.equals("ADMIN") || id.equals("admin")) {
				System.out.println(" > 관리자 로그인 성공");
				sql = "select*from member where id!=?";
				pstmt=con.prepareStatement(sql);
				pstmt.setString(1, id);
				rs = pstmt.executeQuery();
				while(rs.next()) {
					Member m = new Member(rs.getString("id"),
						rs.getString("pw"), rs.getString("name"),
						rs.getInt("age"), rs.getString("birth"));
					mList.add(m);
				}
			}else {
				System.out.println(" > "+id+"님 로그인 성공");
				Member m = new Member(id, pw, rs.getString("name"),
						rs.getInt("age"), rs.getString("birth"));
				mList.add(m);
			}
		}
	} catch (SQLException e) {
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
	return mList;
}
  • retrun을 한 번만 하기 위해 메소드를 시작할 때 ArrayList<Member> mList를 생성해 null값을 넣어둔다. (null 값을 넣으면 새로 값을 집어넣지 않는 이상 mList를 반환해도 null 값을 반환한 것이 된다.)
  • 매개변수로 받아온 id와 pw가 db에서 확인이 되었다면 id가 admin(관리자)인지 확인하고 맞을 경우, 다시 db에 검색을 해서 id가 admin인 계정을 제외한 계정을 검색해서 m에 저장 후 mList에 저장한다.
  • id가 admin(관리자)가 아닌 경우, 검색된 계정을 m에 저장 후 mList에 저장한다.
  • 마지막에 mList를 반환한다.

 

// showMemberList 메소드
public void showMemberList() {
	con=JdbcUtil.getConnection();
	String sql = "select*from member where id!=?";
	try {
		pstmt=con.prepareStatement(sql);
		pstmt.setString(1, "admin");
		rs = pstmt.executeQuery();
		System.out.println(" >------------------------+");
		System.out.println("ID\tNAME\tBIRTH");
		while(rs.next()) {
			System.out.println(" >--------------+");
			System.out.println(rs.getString("ID")+"\t"+rs.getString("NAME")+
			"\t"+rs.getString("BIRTH"));
		}
		System.out.println(" >------------------------+");
	} catch (SQLException e) {
		System.out.println(" > 정보 불러오기 실패");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
  • admin(관리자)만 제외하고 출력했다.

 

 

3. Transaction (TX)

 3-1) MySQL ㄱ 

더보기
-- 주문 결제 TX
create table PURCHASE(
PC_NO int auto_increment primary key,				-- 주문번호
PC_MID varchar(10) not null,					-- 주문자 ID
PC_PID varchar(10) not null					-- 상품 ID
);

create table PAY(
	PY_NO int auto_increment primary key,			-- 결제번호
	PY_COST int not null,					-- 결제금액
	PY_PCNO int not null references PURCHASE(PC_NO)		-- 주문번호
);

 

 3-2) TxMain ㄱ 

더보기
import service.ShoppingService;

public class TxMain {
	// 쇼핑 서비스
	public static void main(String[] args) {
		ShoppingService ss = new ShoppingService();
		
		boolean flag = ss.order();
		if(flag) {
			System.out.println(" > 주문 완료");
		}else {
			System.out.println(" > 주문 실패");
		}
	}
}

 

 3-3) JdbcUtil (자주 쓰는 메소드 클래스) ㄱ 

더보기
  • 기본적으로 같지만 수동적으로 commit 하기 위해 getConnection 메소드에서 auto commit만 false로 바꿨다.
public static Connection getConnection() {
	try {
		Connection con = DriverManager.getConnection
        					("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
		con.setAutoCommit(false);	// auto commit 해제. 수동으로 commit 해야함
//		con.setAutoCommit(true); // < 기본 값
		return con;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return null;
}

 

 3-4) 서비스(동작) ㄱ 

더보기
// 전체 코드
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import common.JdbcUtil;

public class ShoppingService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	
	public boolean order() {
		con=JdbcUtil.getConnection();
		String sql="insert into purchase(pc_mid, pc_pid) values(?, ?)";
		try {
			pstmt = con.prepareStatement(sql);	// sql 파싱(컴파일)
			pstmt.setString(1, "B");
			pstmt.setString(2, "컴퓨터");
			int result = pstmt.executeUpdate();	// sql 실행
			if(result>0) {
				System.out.println(" > 상품 주문 성공");
				sql = "insert into pay(py_cost, py_pcno) values(2000000, 2)";
				pstmt = con.prepareStatement(sql);
				result = pstmt.executeUpdate();
				if(result>0) {
					System.out.println(" > 결제 성공");
//					con.commit();
					JdbcUtil.txCommit(con);
					return true;
				}else {
					System.out.println(" > 결제 실패");
//					con.rollback();
					JdbcUtil.txRollback(con);
				}
			}else {
				System.out.println(" > 상품 주문 실패, 결제TX 실패");
			}
		} catch (SQLException e) {
			System.out.println("order 예외");
			e.printStackTrace();
		}
		return false;
	}
}
  • int result에 pstmt.executeUpdate()를 담는다. (문장을 전달해서 값을 받아오는 것에 성공하면 1, 실패하면 0)
  • result 값이 1 이상이라면 다시 db에 문장을 전달하고 값을 받아와서 result에 받는다.
  • result 값이 두 번 모두 1 이상이라면 JdbcUtil 클래스에 만들어둔 txCommit 메소드를 사용하여 db에서 commit해준다. (con.commit: 자바에서 만들어둔 메소드)
  • result 값이 1 이상이었다가 두번째에서 아니게 됐다면 db에서 rollback해준다. (con.rollback: 자바에서 만들어둔 메소드)

 


 

전체 피드백

  • 주말에 수업일지 읽으면서 복습하는 것이 아니라 예제 비슷하게 내고 코드를 만들어보면서 코드(영어!)와 친해져야 할 것 같다.
  • 나는 db보다 자바가 더 잘맞는 것 같다. 자바로 돌아오니까 재밌다..

 


728x90