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
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 32일차 (23/11/3) - VSCode (html) (0) | 2023.11.04 |
---|---|
수업일지 31일차 (23/11/2) - Jdbc (1) | 2023.11.02 |
수업일지 29일차 (23/10/31) - Jdbc (1) | 2023.10.31 |
수업일지 28일차 (23/10/30) - MySQL (1) | 2023.10.30 |
수업일지 27일차 (23/10/27) - MySQL (1) | 2023.10.27 |