공부의 기록/자바 풀 스택 : 수업내용정리

자바 풀 스택 12/30 오후 기록 027-2

파티피플지선 2024. 12. 30. 18:20

<14:30 5교시>

window > preference > java > editor > templates > new 로 syso 컨트롤 스페이스 하면 자동으로 문구 작성되는 기능처럼 탬플릿을 만들 수 있다.

package test.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import test.dto.MemberDto;
import test.util.DBConnector;

/*
 *  회원 정보를  insert, update, delete, select 할수 있는 기능을 가진 객체를 생성할 클래스 설계하기
 *  
 *  - 이런 기능을 가진 객체를 Data Access Object 라고 한다  DAO
 */
public class MemberDao {
	//매개 변수에 전달된 MemberDto 객체에 담긴 회원 한명의 정보를 DB 에 저장하는 메소드
	public boolean insert(MemberDto dto) {
		Connection conn=null;
		PreparedStatement pstmt=null;
		int rowCount=0;		
		try {
			conn=new DBConnector().getConn();
			//실행할 sql 문
			String sql="""
				INSERT INTO member
				(num, name, addr)
				VALUES(member_seq.NEXTVAL, ?, ?)	
			""";
			pstmt=conn.prepareStatement(sql);
			// ? 에 값 바인딩
			pstmt.setString(1, dto.getName());
			pstmt.setString(2, dto.getAddr());
			//sql 문 실행
			rowCount=pstmt.executeUpdate();
		}catch(SQLException se) {
			se.printStackTrace();
		}finally {
			try {
				if(pstmt!=null)pstmt.close();
				if(conn!=null)conn.close();
			}catch(Exception e) {}
		}
		if(rowCount > 0) {
			return true;
		}else {
			return false;
		}
	}
	//매개변수에 전달된 번호에 해당하는 회원 한명의 정보를 삭제하는 메소드
	public boolean delete(int num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DBConnector().getConn();
			//실행할 sql 문
			String sql = """
				DELETE FROM member
				WHERE num=?
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값 바인딩
			pstmt.setInt(1, num);
			//sql 문 실행
			rowCount = pstmt.executeUpdate();
		} catch (SQLException se) {
			se.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
	}
	//매개 변수에 전달된 MemberDto 객체에 담긴 회원 한명의 정보를 수정하는 메소드
	public boolean update(MemberDto dto) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int rowCount = 0;
		try {
			conn = new DBConnector().getConn();
			//실행할 sql 문
			String sql = """
				UPDATE member
				SET name=?, addr=?
				WHERE num=?
			""";
			pstmt = conn.prepareStatement(sql);
			// ? 에 값 바인딩
			pstmt.setString(1, dto.getName());
			pstmt.setString(2, dto.getAddr());
			pstmt.setInt(3, dto.getNum());
			//sql 문 실행
			rowCount = pstmt.executeUpdate();
		} catch (SQLException se) {
			se.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		if (rowCount > 0) {
			return true;
		} else {
			return false;
		}
	}
	//전체 회원 목록을 리턴하는 메소드
	public List<MemberDto> getList(){
		
		List<MemberDto> list=new ArrayList<>();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = new DBConnector().getConn();
			String sql = """
				SELECT num, name, addr
				FROM member 
				ORDER BY num ASC	
			""";
			pstmt = conn.prepareStatement(sql);
			//? 에 값 바인딩 할게 있으면 여기서 한다.

			//select 문 실행하고 결과를 ResultSet 객체로 리턴받기
			rs = pstmt.executeQuery();
			//반복문 돌면서 
			while (rs.next()) {
				//MemberDto 객체를 생성해서 
				MemberDto dto=new MemberDto();
				//ResultSet 에 담긴 정보를 추출해서 MemberDto 객체에 담은 다음 
				dto.setNum(rs.getInt("num"));
				dto.setName(rs.getString("name"));
				dto.setAddr(rs.getString("addr"));
				//MemberDto 객체를 ArrayList 객체에 누적 시킨다.
				list.add(dto);
			}
		} catch (SQLException se) {
			se.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
		//회원정보가 누적된 ArrayList 객체를 리턴해준다.
		//select 된 row 가 없으면 list.size() 는 0 이다. 
		return list;
	}
	//매개변수에 전달된 번호에 해당하는 회원 한명의 정보를 리턴하는 메소드
	public MemberDto getData(int num) {
		
		MemberDto dto=null;
		
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try {
			conn=new DBConnector().getConn();
			String sql="""
				SELECT name, addr
				FROM member
				WHERE num=?	
			""";
			pstmt=conn.prepareStatement(sql);
			//? 에 값 바인딩 할게 있으면 여기서 한다.
			pstmt.setInt(1, num);
			//select 문 실행하고 결과를 ResultSet 객체로 리턴받기
			rs=pstmt.executeQuery();
			//만일 select 된 row 가 있다면
			if(rs.next()) {
				dto=new MemberDto();
				dto.setNum(num);
				dto.setName(rs.getString("name"));
				dto.setAddr(rs.getString("addr"));
			}
		}catch(SQLException se) {
			se.printStackTrace();
		}finally {
			try {
				if(rs!=null)rs.close();
				if(pstmt!=null)pstmt.close();
				if(conn!=null)conn.close();
			}catch(Exception e) {}
		}
		// select 된 정보가 없으면 dto 는 null 이다 
		return dto;
	}
}

 

만든 DAO 가지고 쉽게 쉽게 하기!

package test.main;

import java.util.Scanner;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass14 {
	public static void main(String[] args) {
		//이름과 주소를 Scanner 객체로 입력 받아서 DB에 저장하는 프로그래밍 하기
		Scanner scan = new Scanner(System.in);
		System.out.println("이름 입력: ");
		String name=scan.nextLine();
		System.out.println("주소 입력: ");
		String addr=scan.nextLine();
		
		//입력한 이름과 주소를 MemberDto 객체에 담기
		MemberDto dto=new MemberDto();
		dto.setName(name);
		dto.setAddr(addr);
		
		MemberDao dao = new MemberDao();
		boolean isSuccess=dao.insert(dto);
		if(isSuccess) {
			System.out.printf("%s 님의 정보가 저장되었습니다", name);
		}else {
			System.out.println("회원 정보 저장 실패");
		}
				
	}
}

 

 

<15:30 6교시>

package test.main;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass15 {
	public static void main(String[] args) {
		/*
		 * MemberDao 객체를 이용해서 1번 회원의 이름을 "김구라", 주소를 "노량진"으로 수정하기
		 * 단) 성공 여부를 콘솔창에 출력하기
		 */
		//int num=1; //내가쓴 줄인데 안 써도 됨
		//String name= "김구라";//내가쓴 줄인데 안 써도 됨
		//String addr= "노량진";//내가쓴 줄인데 안 써도 됨
		
		MemberDto dto=new MemberDto();
		dto.setName("김구라");
		dto.setAddr("노량진");
		dto.setNum(1);
		
		MemberDao dao=new MemberDao();
		boolean isSuccess = dao.update(dto);
		if(isSuccess) {
			System.out.println("정보가 수정되었습니다.");
		}else {
			System.out.println("정보를 수정할 수 없습니다.");
		}
	}
}

 

 

삭제하기

이번에도 또 MemberDto 만들어서 dto.setNum(1); 부터 할 뻔 했다.

package test.main;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass16 {
	public static void main(String[] args) {
	/*
	 *MemberDao 객체를 이용해서 1번 회원의 정보를 삭제하기
	 *단, 성공 여부를 콘솔창에 출력하세요 
	 */
	
		
		MemberDao dao=new MemberDao(); //대신에 var dao라고 선언할 수도 있다(타입 추론이 가능해서)
		boolean isSuccess = dao.delete(1);//대신에 var isSuccess라고 선언할 수도 있다(타입 추론이 가능해서)
		if(isSuccess) {
			System.out.println("회원정보를 삭제했습니다");
		}else {
			System.out.println("회원정보를 삭제할 수 없습니다.");
		}
	
	}
}

 

혼자 해본 코드 : else에서 에러가 나서 처리가 되지 않음

package test.main;

import java.util.Scanner;
import java.util.function.ToIntBiFunction;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass17 {
	public static void main(String[] args) {
		/*
		 * Scanner 객체를 이용해서 불러올 회원의 번호를 입력받은 다음
		 * 입력한 번호에 해당하는 회원의 정보를 MemberDao 객체를 이용해서 얻어온 다음
		 * 
		 * 해당 회원이 존재하면 해당회원의 정보를 콘솔에 출력하고
		 * 
		 * 존재하지 않으면 "X번 회원이 존재하지 않습니다."를 콘솔창에 출력하는 프로그래밍을 해보세요
		 */
		Scanner scan = new Scanner(System.in);
		System.out.println("번호 입력: ");
		int num=scan.nextInt();
		
	
		MemberDao dao= new MemberDao();
		MemberDto dto= dao.getData(num);
		
		if(dto!=null) {
			System.out.printf("번호 : %d, 이름 : %s, 주소 : %s", dto.getNum(), dto.getName(), dto.getAddr());
		}else {
			System.out.printf("%d 번 회원이 존재하지 않습니다", dto.getNum());
		}
		
		
	
	}
}

 

 

선생님이랑 한거

회원이 존재하지 않습니다 옆에 dto.getNum()이 아니라 num으로 했어야 함

 

 

MemberDao 객체를 이용해서 회원 목록을 얻고 전체 목록을 반복문 돌면서 출력하기

for문 for(데이터 타입 tmp: 리스트의지역변수){    }형태로 출력하는거 복습하면서 다시 주의 깊게 보기 자꾸 이걸 잊어먹음(복습을 안했으니까 당연하지 임ㅁ 읍읍)

package test.main;

import java.util.List;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MainClass18 {
	public static void main(String[] args) {
		/*
		 * MemberDao 객체를 이용해서 회원 목록을 얻어온 다음
		 * 전체 목록을 반복문 돌면서 이쁘게 출력해보세요.
		 */		
		List<MemberDto> list = new MemberDao().getList();
		for(MemberDto tmp: list) {
			System.out.printf("번호:%d, 이름: %s, 주소: %s", tmp.getNum(), tmp.getName(), tmp.getAddr());
			System.out.println();
		}
	}
}

 

 

 

 

<16:30~~ 7교시, 8교시>

7교시, 8교시 동안 아래 세 가지 하기, 단 복사 붙여넣기 최소화 하기

1. id, title, content를 담을 수 있는 PostDto 클래스를 test.dto 패키지에 만들어보기

일단 Dto는 혼자 만들 수 있는 느낌...인데 맞게 했겠지?

package test.dto;

public class PostDto {

	private int id;
	private String title;
	private String content;
	
	public PostDto() {}

	public PostDto(int id, String title, String content) {
		super();
		this.id = id;
		this.title = title;
		this.content = content;
	}

	public int getId() {
		return id;
	}

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

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	};
	
	
}


2. PostDto를 활용한 PostDao클래스를 test.dao 패키지에 만들기
    insert, update, delete, getData, getList 메소드가 있어야 함

package test.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import test.dto.MemberDto;
import test.dto.PostDto;
import test.util.DBConnector;

public class PostDao {
	public boolean insert(PostDto dto) {
		Connection conn =null;
		PreparedStatement pstmt=null;
		int rowcount = 0;
		try {
			conn= new DBConnector().getConn();
			String sql="""
					insert into posts
					(id, title, content)
					values(posts_seq.nextval, ?, ?) 
					""";
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getContent());
			rowcount=pstmt.executeUpdate();
		}catch(SQLException se){
			se.printStackTrace();
		}finally {
			try {
				if(pstmt!=null)pstmt.close();
				if(conn!=null)conn.close();
			}catch(Exception e) {}
		}
		if(rowcount>0) {
			return true;
		}else {
			return false;
		}
	}
	
	public boolean delete(int id) {
		Connection conn =null;
		PreparedStatement pstmt=null;
		int rowcount=0;
		try {
			conn = new DBConnector().getConn();
			String sql="""
						delete from posts
						where id=?
					""";
			pstmt=conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			rowcount=pstmt.executeUpdate();
		}catch(SQLException se) {
			se.printStackTrace();
		}finally {
			try {
				if(pstmt!=null) pstmt.close();
				if(conn!=null)conn.close();
			}catch(Exception e) {
			}
		}
		if(rowcount>0) {
			return true;
		}else {
			return false;
		}
	}
	
	public boolean update(PostDto dto) {
		Connection conn=null;
		PreparedStatement pstmt=null;
		int rowcount=0;
		try {
			conn= new DBConnector().getConn();
			String sql="""
					update posts
					set title=?, content=?
					where id=?
					""";
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getContent());
			pstmt.setInt(3, dto.getId());
			rowcount=pstmt.executeUpdate();
		}catch(SQLException se) {
			se.printStackTrace();
		}finally {
			try {
				if(pstmt!=null) pstmt.close();
				if(conn!=null)conn.close();
			}catch(Exception e){
				
			}
		}
		if(rowcount>0) {
			return true;
		}else {
			return false;
		}
	}
	
	public PostDto getData(int id) {
		PostDto dto=null;
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try {
			conn= new DBConnector().getConn();
			String sql="""
					select title, content
					from posts
					where id=?
					""";
			pstmt=conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			rs=pstmt.executeQuery();
			if(rs.next()) {
				dto=new PostDto();
				dto.setId(id);
				dto.setTitle("title");
				dto.setContent("content");
			}
		}catch(SQLException se) {
			se.printStackTrace();
		}finally {
			try {
				if(rs!=null)rs.close();
				if(pstmt!=null)pstmt.close();
				if(conn!=null)conn.close();
			}catch(Exception e) {}
		}
		return dto;
	}
	
	public List<PostDto> getList(){
		List<PostDto> list=new ArrayList<>();
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try {
			conn = new DBConnector().getConn();
			String sql="""
						select id, title, content
						from posts
						order by id asc
					""";
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			
			while(rs.next()) {
				PostDto dto=new PostDto();
				dto.setId(rs.getInt("id"));
				dto.setTitle(rs.getString("title"));
				dto.setContent(rs.getString("content"));
				list.add(dto);
			}
		}catch(SQLException se) {
			se.printStackTrace();
		}finally {
			try {
				if (rs!=null) rs.close();
				if(pstmt!=null) pstmt.close();
				if (conn!=null) conn.close();
			}catch(Exception e) {}
		}
		return list;
	}
}

 

 

 

기...기운 빠져...ㅇ<-<

 

 

3. MainClass14~MainClass18에서 했던 유사 작업 코드 작성하기
    Quizmain01~QuizMain05라는 클래스 이름으로 순서대로 만들면 됨

으악 못했다 내일 일찍 와서 하는거 시도해보기 ㅠㅠㅠㅠㅠ