-
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