ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UML만들기-DesignModel&class관계,maven프로젝트
    JAVA 2021. 7. 25. 13:05

    UML : 관계 (객체지향을 잘 알 수 있다)

    1. 객체관계 (참조에 의한)
    행위 = 메서드
    1) 연관관계 (행위 외에도 필요시 지속 : 멤버변수로 하고 메서드에서 사용 )
    = Association : 서로(1:1평등관계, 서로를 멤버변수사용), Directed Associaion : 한방향(한쪽만 멤버변수요청사용)
    2) 종속적관계 ( 행위동안만 관계 : 메서드에서만 사용) = Dependency
    3) 상속관계 : 자바에서 하던 그 상속(부모클래스) = Generalization
    4) 구현관계 : 자바에서 하던 그 구현(인터페이스) = Interface Realization

    종속적관계의 예시)

    아래는 메서드 호출한 동안에만 객체가 생성되어 거기에 물건을 넣는다. 메서드가 끝나면,

    객체가 사라지기 때문에 그 객체의 메서드를 이용해서 일회성으로 사용할 경우가 아니면 어울리지 않는 관계다.

    아래가 그 예시로 카트를 메서드를 호출할 때 마다 하나씩 생성해 의미없는 메서드만 사용하고, 메서드가 끝나면 버려진다.

    public class 쇼핑 {
    	
    	void 카트에넣다(상품 관심상품) {
    		카트 내카트 = new 카트();
    		내카트.넣다(관심상품);
    	}
    	
    	public static void main(String[] args) {
    		
    		쇼핑 나의쇼핑 = new 쇼핑();
    		상품 상품1 = new 상품();
    		상품 상품2 = new 상품();
    		상품 상품3 = new 상품();
    
    		나의쇼핑.카트에넣다(상품1);
    		나의쇼핑.카트에넣다(상품2);
    		나의쇼핑.카트에넣다(상품3);
    	}
    }
    
    
    class 카트{
    	void 넣다(상품 관심상품) {}
    }
    
    class 상품{}

    연관관계 예시)

    아래처럼 메서드 동안 뿐 아니라 멤버변수로 놓고 필요할 때 메서드를 호출하여

    계속 그 객체로 값을 가지고 있으면 연관관계인 것이다.

    아래상황은 즉, 연관관계가 어울리는 상황이다.

    public class 쇼핑 {
    	
    	카트 내카트 = new 카트();
    	
    	void 카트에넣다(상품 관심상품) {
    		내카트.넣다(관심상품);
    	}
    	
    	public static void main(String[] args) {
    		
    		쇼핑 나의쇼핑 = new 쇼핑();
    		상품 상품1 = new 상품();
    		상품 상품2 = new 상품();
    		상품 상품3 = new 상품();
    
    		나의쇼핑.카트에넣다(상품1);
    		나의쇼핑.카트에넣다(상품2);
    		나의쇼핑.카트에넣다(상품3);
    	}
    }
    
    
    class 카트{
    	void 넣다(상품 관심상품) {}
    }
    
    class 상품{}

    이번에 사용하는 BoardDAO -> Board 는 종속관계다.

    BoardDAO는 Board를 따로 멤버변수로 두고 연관갖지 않고 메서드안에서만 사용하기 때문이다.

    이번에 사용하는 MemberDAO -> Member 는 종속관계다.

    MemberDAO Member를 따로 멤버변수로 두고 연관갖지 않고 메서드안에서만 사용하기 때문이다.

    이번에 사용하는 Board -> Member 는 연관관계로 하자.

    Board 를 작성한 Member 를 멤버변수로 두고 누가 작성했는지 writer 로 둔다면 이 Board 의 작성자로 알 수 있기 때문이다.

    이번에 사용하는 BoardDAO -> MemberDAO 는 연관관계로 하자.

    BoardDAO 가 게시물들을 가져올 때 특정 Member 가 필요할 수 있으니 그 Member를 가져오는 등의 일을 하는 MemberDAO를

    자주 쓸테니 멤버변수로 두고 사용하기 위해 연관관계로 지정한다.(종속이여도 상관없다)


    UML : Design Model ( 설계 단계 )

    1-1. 메서드 작성할 때 매개변수를 입력하고나서 다시 수정을 위해 더블클릭하면 모두 자동으로 in이 붙어 있다.
    매개변수로 들어가 값을 가지고 나올 얘는 앞에 in을 out으로 바꿔주자
    1-2. interface 를 만들 때 오른쪽마우스로 format - > StereotypeDisplay - > Label 로 바꾸고
    format - > Suppress Operation 을 해제 해야 메서드가 보인다.

    IMemberDAO(interface) <--Interface Realization-- MemberDAO
    IBoardDAO(interface) <--Interface Realization-- BoardDAO
    IMemberDAO(interface) <--Directed Associaion-- BoardDAO ('private IMemberDAO memberDAO' 로 멤버변수로 갖는다)
    1-3. 상단에 Tools 메뉴에서 Extension Manager : java 를 install
    재시작하면 Tools 메뉴에 java가 나온다.
    1-4. java 메뉴에서 Generate code 로 export 할 패키지 선택(현재만든건 com) 그리고
    eclipse 에서 자바가 들어가는 소스폴더선택하여 넣기

    UML 을 보며 board_member (Maven Project) 만들기

    지금 DAO를 먼저 만들어 메서드를 구현해버렸기 때문에 향후 관리를 위해 이 메서드들을

    인터페이스로 옮기고 이를 구현하는 방식으로 바꿔야 한다.

    만든 DAO에 들어가서 오른쪽마우스 source 밑에 refactor -> extract Interface 로 만들면 된다(거꾸로 만든 경우)


    >> RefInteger.java

    public class RefInteger {
    	public int value;
    }

    >> Board.java

    public class Board {
    
    	// 일반속성 = 원시속성
    	private int no;
    	private String title;
    	private String contents;
    	private Date wdate;
    	private long views;	
    	
    	// 참조속성
    	private Member writer;
    
        // getter, setter 너무 길어 생략 source로 완성해놓기
    	public int getNo() {
    		return no;
    	}
    
    	public void setNo(int no) {
    		this.no = no;
    	}
    
    }

    >> Member.java

    public class Member {
    
    	private int no;
    	private String name;
    	private String post;
    	private String address;
    	private String detailAddress;
    	private String tel;
    	private String email;
    	private String id;
    	private String password;
    	private Date rdate;
    	private String state;
    	private String size;
    
    	public int getNo() {
    		return no;
    	}
    
        //getter, setter 생략
    	public void setNo(int no) {
    		this.no = no;
    	}
    	public String getName() {
    		return name;
    	}
    }

    >> IBoardDAO.java

    public interface IBoardDAO {
    
    	void save(Board board);
    
    	List<Board> selectByPage(int page, int sizePerPage, RefInteger totalSize);
    
    	Board findByNo(int no, boolean addView);
    
    	void delete(int no);
    
    }

    >> IMemberDAO.java

    public interface IMemberDAO {
    
    	void save(Member member);
    
    	String isin(String id, String password);
    
    	boolean isin(String id);
    
    	void delete(int no);
    
    	Member findByNo(int no);
    
    }

    >> BoardDAO.java

    public class BoardDAO implements IBoardDAO {
    
    	//메서드에서 회원찾을 때 사용할 "메서드용클래스"를 멤버변수로 설정
    	private IMemberDAO memberDAO = new MemberDAO();
    	
    	//게시물 저장하기.
    	public void save(Board board) {
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    
    			Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,
    																	ConnectionInfo.DBPORT, ConnectionInfo.DBName),
    																	ConnectionInfo.UID, ConnectionInfo.PASSWORD);
    
    			Statement 명령전달자 = DB연결관리자.createStatement();
    
    			String 삽입SQL = "insert into board(title,contents) values('" + board.getTitle() + "','" + board.getContents() + "');";
    			명령전달자.executeUpdate(삽입SQL); // 명령전달자가 보낸다.
    
    			DB연결관리자.close();
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	// 페이지별로 게시물 목록 뽑기
    	public List<Board> selectByPage(int page/*페이지*/, int sizePerPage/*페이지당 게시물수*/, RefInteger totalSize/*총페이지수*/) {
    		
    		int 시작일련번호 = (page - 1) * sizePerPage; // zero-base: 시작을 0으로 본다.
    		ArrayList<Board> array게시물 = new ArrayList<Board>();
    
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    
    			Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,
    																	ConnectionInfo.DBPORT, ConnectionInfo.DBName),
    																	ConnectionInfo.UID, ConnectionInfo.PASSWORD);
    
    			Statement 명령전달자 = DB연결관리자.createStatement();
    
    			// 2-1. 총 게시물수 구하기
    			String 총개시물수SQL = "select count(*) as 갯수 from board";
    			ResultSet 수집된갯수표관리자 = 명령전달자.executeQuery(총개시물수SQL);
    			수집된갯수표관리자.next();
    			totalSize.value = 수집된갯수표관리자.getInt("갯수");
    			수집된갯수표관리자.close();
    
    			// 2-2. 페이지당 게시물들 가져오기
    			String 수집SQL = String.format("select no,title,wdate,views,writer from board order by wdate desc limit %d, %d", 시작일련번호,
    					sizePerPage);
    			ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
    
    			while (수집된표관리자.next()) {
    
    				int 게시물번호 = 수집된표관리자.getInt("no");
    				String 제목 = 수집된표관리자.getString("title");
    				java.sql.Date 작성일 = 수집된표관리자.getDate("wdate");
    				int 조회수 = 수집된표관리자.getInt("views");
    				int 작성회원번호 = 수집된표관리자.getInt("writer");
    				Member member = memberDAO.findByNo(작성회원번호);
    				
    				Board 게시물1 = new Board();
    
    				게시물1.setNo(게시물번호);
    				게시물1.setTitle(제목);
    				게시물1.setWdate(작성일);
    				게시물1.setViews(조회수);
    				게시물1.setWriter(member);
    
    				array게시물.add(게시물1);
    			}
    
    			수집된표관리자.close();
    			DB연결관리자.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return array게시물;
    	}
    
    	// 게시물의 번호로 게시물의 상세내역 보기(+ 조회수 증가여부)
    	public Board findByNo(int no, boolean addView) {
    		Board 찾은게시물 = null;
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    
    			Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,
    																ConnectionInfo.DBPORT, ConnectionInfo.DBName),
    																ConnectionInfo.UID, ConnectionInfo.PASSWORD);
    
    			Statement 명령전달자 = DB연결관리자.createStatement();
    
    			// 조회수증가
    			if(addView) {
    				명령전달자.executeUpdate(String.format("update board set views = views + 1 where no =  %d", no));
    			}
    			
    			// 선택한 게시물 가져오기
    			String 수집SQL = String.format("select * from board where no = %d",no);
    			ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
    
    			if(수집된표관리자.next()) {
    
    				String 제목 = 수집된표관리자.getString("title");
    				String 내용 = 수집된표관리자.getString("contents");
    				java.sql.Date 작성일 = 수집된표관리자.getDate("wdate");
    				int 조회수 = 수집된표관리자.getInt("views");
    				
    				// 게시물의 작성자번호를 통해 member을 찾아달라고 MemberDAO에게 부탁. (작성자번호는 게시판번호(no) 이 아님!!)
    				int 작성자번호 = 수집된표관리자.getInt("writer");				
    				Member member = memberDAO.findByNo(작성자번호);
    				
    				찾은게시물 = new Board();
    				찾은게시물.setNo(no);
    				찾은게시물.setTitle(제목);
    				찾은게시물.setContents(내용);
    				찾은게시물.setWdate(작성일);
    				찾은게시물.setViews(조회수);
    				찾은게시물.setWriter(member);
    				
    			}
    
    			수집된표관리자.close();
    			DB연결관리자.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		return 찾은게시물;
    	}
    	
    	// 게시물번호로 게시물 지우기
    	public void delete(int no) {
    
    	}
    
    }

    변한 것은 한글이였던 이름들과(DB테이블,열도 다 바꿔야함..) Board 에 새로 생긴 writer(작성자) 변수 설정이다.

    MemberDAO 를 통해 Member를 알아올 수 있으니 Board에 setWriter() 할 때 ,

    MemberDAO 로 Member를 생성한(찾은) 후 그 값을 set한다.

    >> MemberDAO.java

    public class MemberDAO implements IMemberDAO {
    
    	// 회원 저장하기
    	public void save(Member member) {
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    			Connection c = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true",ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName),ConnectionInfo.UID,ConnectionInfo.PASSWORD);
    			PreparedStatement pre = c.prepareStatement("insert into 회원(name,post,address,detailaddress,tel,email,id,password,state,size) values(?,?,?,?,?,?,?,?,?,?)");
    			pre.setString(1, member.getName());
    			pre.setString(2, member.getPost());
    			pre.setString(3, member.getAddress());
    			pre.setString(4, member.getDetailAddress());
    			pre.setString(6, member.getTel());
    			pre.setString(5, member.getEmail());
    			pre.setString(7, member.getId());
    			pre.setString(8, member.getPassword());
    			pre.setString(9, member.getState());
    			pre.setString(10, member.getSize());
    			
    			pre.executeUpdate();
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	// 존재하는 회원인지(로그인시 사용)
    	public String isin(String id, String password) {
    		
    		String name = null;
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    			Connection c = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true",ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName),ConnectionInfo.UID,ConnectionInfo.PASSWORD);
    			PreparedStatement pre = c.prepareStatement("select name from member where id = ? and password = ?");
    			pre.setString(1, id);
    			pre.setString(2, password);
    			ResultSet set = pre.executeQuery();
    			
    			if(set.next()) {
    				name = set.getString("name");
    			}
    				
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return name;
    	}
    
    	// 존재하는 아이디인지(회원가입시 아이디중복체크로 사용)
    	public boolean isin(String id) {
    		
    		boolean 사용여부 = false;
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    			Connection c = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true",ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName),ConnectionInfo.UID,ConnectionInfo.PASSWORD);
    			PreparedStatement pre = c.prepareStatement("select count(*) as 갯수 from member where id = ?");
    			pre.setString(1, id);
    			ResultSet set = pre.executeQuery();
    			set.next();
    			if(set.getInt("갯수") == 0) 사용여부 = true;
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		return 사용여부;
    	}
    
    	// 회원번호로 회원지우기 + 회원의 번호를 참조했던 게시물들 지우기
    	public void delete(int no) {
    
    	}
    
    	// 게시물의 작성자번호로(회원번호를 참조중) 회원찾기
    	public Member findByNo(int no) {
    		
    		Member member = null;
    		
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    
    			Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,
    									ConnectionInfo.DBPORT, ConnectionInfo.DBName),
    									ConnectionInfo.UID, ConnectionInfo.PASSWORD);
    
    			Statement 명령전달자 = DB연결관리자.createStatement();
    
    			
    			// 선택한 게시물 가져오기
    			String 수집SQL = String.format("select * from member where no = %d",no);
    			ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
    
    			if(수집된표관리자.next()) {
    
    				String name = 수집된표관리자.getString("name");
    				String post = 수집된표관리자.getString("post");
    				String address = 수집된표관리자.getString("address");
    				String detailaddress = 수집된표관리자.getString("detailaddress");
    				String tel = 수집된표관리자.getString("tel");
    				String email = 수집된표관리자.getString("email");
    				String id = 수집된표관리자.getString("id");
    				String password = 수집된표관리자.getString("password");
    				java.sql.Date rdate = 수집된표관리자.getDate("rdate");
    				String state = 수집된표관리자.getString("state");
    				String size = 수집된표관리자.getString("size");
    
    				member = new Member();
    				member.setName(name);
    				member.setPost(post);
    				member.setAddress(address);
    				member.setDetailAddress(detailaddress);
    				member.setTel(tel);
    				member.setEmail(email);
    				member.setId(id);
    				member.setPassword(password);
    				member.setRdate(rdate);
    				member.setState(state);
    				member.setSize(size);
    				
    			}
    
    			수집된표관리자.close();
    			DB연결관리자.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		return member;
    	}
    
    }

    'JAVA' 카테고리의 다른 글

    MVC모델이란  (0) 2021.07.25
    ConnectionPool,ViewResolver  (0) 2021.07.25
    게시물상세(model2.ver)  (0) 2021.07.25
    RequestDispatcher,forward(),게시물등록(model2.ver)  (0) 2021.07.25
    JSP내장객체정리, 로그인하기(jsp버전)  (0) 2021.07.25

    댓글

Designed by Tistory.