JAVA/HIGH JAVA

[JAVA] javaDoc 문서 / MVC 패턴

아잠만_ 2024. 5. 20. 09:36

javaDoc

  • 문서화할 수 있는 주석
  • 단축키 Alt + Shift + F
/** javaDoc문서
*/

javaDoc 문서 Export

NEXT 맨 끝자락에서 인코딩 작업해주기

-charset UTF-8 -encoding UTF-8

package kr.or.ddit.basic;

// javaDoc 문서 만들기 예제 ==> 프로그램과 메뉴얼을 같이 만드는 방법

/**
 * 이 영역이 JavaDoc문서의 내용이 들어가는 영역입니다. <br>
 * 이 부분은 HTML태그를 사용할 수 있습니다. <br><br>
 * @author PC-13
 * @version 1.0
 *
 * <p>
 * 파일명 : JavaDocTest.java<br>
 * 설   명 : JavaDoc문서 작성을 위한 연습용 interface<br><br>
 * 
 * 변경 내역 <br>
 * --------------------------------------------<br>
 * 변경 일자 : 2024-05-20 <br>
 * 작 성 자 : 오리<br>
 * 변경 내용 : 최초 생성<br>
 * --------------------------------------------<br>
 * </p>
 */
public interface JavaDocTest {
	
	/**
	 * 메서드명 : methodTest<br>
	 * 설     명 : 반환값이 없는 메서드<br>
	 * @param a 첫 번째 매개변수(정수형)
	 * @param b 두 번째 매개변수(정수형)
	 */
	public void methodTest(int a, int b);
	
	/**
	 * 메서드명 : methodAdd<br>
	 * 설     명 : 반환값이 있는 메서드<br>
	 * @param x 첫 번째 매개변수(정수형)
	 * @param y 두 번째 매개변수(정수형)
	 * @return 처리된 결과를 정수형으로 반환한다.
	 */
	public int methodAdd(int x, int y);
	
	/**
	 * 메서드명 : methodInput<br>
	 * 설     명 : 매개변수가 없는 메서드<br>
	 * @return 정수형으로 반환한다.
	 */
	public int methodInput();
}

javaDoc문서 생성 결과값

MVC( Model, View, Controller) 패턴

  • MVC 패턴의 비즈니스 처리를 하는 클래스들
  • Model : 데이터를 처리하는 것/ 처리하는 과정을 가지고있는 객체
  • View : 화면에 보여주는 것(모델이 하나인데 view가 여러 개를 가질 수 있음)
  • Controller : 컴퓨터와 사용자 사이의 중개자역할
  • 유지보수하기가 쉬움
  • 기존에 만들었던 것을 재사용하기 용이하다
  • 큰 프로젝트에 주로 사용되며, 주로 웹프로젝트 시 많이 적용이 된다

  • Controller이 View역할도 수행하는 모델
  • DAO (Data Access Object)
       >  SQL문을 DB서버로 보내서 결과를 얻어오는 역할을 수행하는 클래스
  • VO(Value Object), DTO(Data Transfer Object)
       > 데이터를 저장하는 역할만 하는 클래스
  • Service
       > 일을 수행하는 중간 관리자와 같은 역할을 수행하는 클래스
          서비스는 일이 있으면 그 일에 필요한 DAO를 호출해서
          일을 처리한 후 처리 결과를 Controller에게 전달한다
  • Controller
       > 비즈니스 로직이 시작되는 곳으로 사용자의 요청이 오면
          그 요청에 맞는 Service에게 일을 시키고, Service가 보내온 처리 결과를
          화면 등에 반영시키는 역할을 수행한다

  • 현재 많이 사용하고 있는 모델
  • controller와 view를 분리하는 모델

회원관리 - MVC패턴 적용 예제 (1 모델)

  • 생성 순서
        VO(DTO역할) > DAO > Service > Controller 
  • 실행할 데이터는 매개변수로 전달
         Controller > Service > DAO 
  • 출력 결과는 반환값(return)으로 전달
         DAO > Service > Controller

MemberVO.java

  • DB테이블에 있는 컬럼을 기준으로 데이터를 객체화할 클래스
  • DB테이블의 '컬럼명'이 이 클래스의 '멤버변수'가 된다.
  • DB테이블의 컬럼과 클래스의 멤버변수를 매핑하는 역할을 수행한다.
package kr.or.ddit.member.vo;

public class MemberVO {
	private String mem_id;
	private String mem_pass;
	private String mem_name;
	private String mem_tel;
	private String mem_addr;

	// VO클래스에서 별도의 생성자를 만들 때에는
	// 기본 생성자도 반드시 같이 만들어 준다.
	public MemberVO() {
		
	}
	
	public MemberVO(String mem_id, String mem_pass, String mem_name, String mem_tel, String mem_addr) {
		this.mem_id = mem_id;
		this.mem_pass = mem_pass;
		this.mem_name = mem_name;
		this.mem_tel = mem_tel;
		this.mem_addr = mem_addr;
	}
	
	public String getMem_id() {
		return mem_id;
	}

	public void setMem_id(String mem_id) {
		this.mem_id = mem_id;
	}

	public String getMem_pass() {
		return mem_pass;
	}

	public void setMem_pass(String mem_pass) {
		this.mem_pass = mem_pass;
	}

	public String getMem_name() {
		return mem_name;
	}

	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}

	public String getMem_tel() {
		return mem_tel;
	}

	public void setMem_tel(String mem_tel) {
		this.mem_tel = mem_tel;
	}

	public String getMem_addr() {
		return mem_addr;
	}

	public void setMem_addr(String mem_addr) {
		this.mem_addr = mem_addr;
	}

	@Override
	public String toString() {
		return "MemberVO [mem_id=" + mem_id + ", mem_pass=" + mem_pass + ", mem_name=" + mem_name + ", mem_tel="
				+ mem_tel + ", mem_addr=" + mem_addr + "]";
	}

}

IMemberDao.java (interface)

  • 실제 DB와 연결해서 SQL문을 수행하여 결과를 작성해서
    Service에게 전달하는 DAO의 interface (표준 역할을 수행함)
  • 매개변수와 return값을 잘 고려하도록 함
  • 메서드 하나가 DB와 관련된 작업 1개를 수행하도록 작성한다.
package kr.or.ddit.member.dao;

import java.util.List;

import kr.or.ddit.member.vo.MemberVO;

public interface IMemberDao {
	/**
	 * MemberVO객체에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param memVo DB에 insert할 자료가 저장된 MemberVO 객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int insertMember(MemberVO memVo);
	
	/**
	 * 회원ID를 매개변수로 받아서 해당 회원 정보를 삭제하는 메서드
	 * @param mem_id 삭제할 회원ID
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int deleteMember(String mem_id);
	
	/**
	 * 매개변수로 받은 MemberVO객체를 이용하여 해당 회원 정보를 수정하는 메서드
	 * @param memVo update할 회원 정보가 저장된  MemberVO객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int updateMember(MemberVO memVo);
	
	/**
	 * DB의 전체 회원 정보를 가져와 List에 담아서 반환하는 메서드
	 * @return 전체 회원정보 각각을 MemberVO에 담고 있는 List객체
	 */
	public List<MemberVO> getAllMember();
	
	/**
	 * 회원ID를 매개변수로 받아서 해당 회원ID의 개수를 반환하는 메서드
	 * @param mem_id 검색할 회원ID
	 * @return 검색된 회원ID의 갯수
	 */
	public int getMemIdCount(String mem_id);
	
	/**
	 * 회원ID를 매개변수로 받아서 해당 회원의 정보를 반환하는 메서드
	 * @param mem_id 검색할 회원ID
	 * @return 검색된 회원ID 정보
	 */
	public MemberVO getMemInfo(String mem_id);
}

MemberDaoImpl.java

package kr.or.ddit.member.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 kr.or.ddit.member.vo.MemberVO;
import kr.or.ddit.util.DBUtil;

public class MemberDaoImpl implements IMemberDao{

	@Override
	public int insertMember(MemberVO memVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int cnt = 0; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil.getConnection();
			String sql = "insert into mymember"
					+ "(mem_id, mem_pass, mem_name, mem_tel, mem_addr) " 
					+ " values(?, ?, ?, ?, ?) ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memVo.getMem_id());
			pstmt.setString(2, memVo.getMem_pass());
			pstmt.setString(3, memVo.getMem_name());
			pstmt.setString(4, memVo.getMem_tel());
			pstmt.setString(5, memVo.getMem_addr());		
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if(pstmt!=null) try{pstmt.close();} catch(SQLException e) {}
			if(conn!=null) try{conn.close();} catch(SQLException e) {}
		}
		return cnt;
	}

	@Override
	public int deleteMember(String mem_id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int cnt = 0; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil.getConnection();
			String sql = "delete from mymember where mem_id=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, mem_id);
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if(pstmt!=null) try{pstmt.close();} catch(SQLException e) {}
			if(conn!=null) try{conn.close();} catch(SQLException e) {}
		}
		return cnt;
	} 

	@Override
	public int updateMember(MemberVO memVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int cnt = 0; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil.getConnection();
			String sql = "update mymember set mem_pass=?, mem_name=?, mem_tel=?, mem_addr=? where mem_id=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memVo.getMem_pass());
			pstmt.setString(2, memVo.getMem_name());
			pstmt.setString(3, memVo.getMem_tel());
			pstmt.setString(4, memVo.getMem_addr());
			pstmt.setString(5, memVo.getMem_id());
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if(pstmt!=null) try{pstmt.close();} catch(SQLException e) {}
			if(conn!=null) try{conn.close();} catch(SQLException e) {}
		}
		return cnt;
	}

	@Override
	public List<MemberVO> getAllMember() {
		List<MemberVO> list = new ArrayList<MemberVO>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DBUtil.getConnection();
			String sql = "select * from mymember";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				MemberVO memVo = new MemberVO();
				memVo.setMem_id(rs.getString("mem_id"));
				memVo.setMem_pass(rs.getString("mem_pass"));
				memVo.setMem_name(rs.getString("mem_name"));
				memVo.setMem_tel(rs.getString("mem_tel"));
				memVo.setMem_addr(rs.getString("mem_addr"));
				list.add(memVo);
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if(rs!=null) try{rs.close();} catch(SQLException e) {}
			if(pstmt!=null) try{pstmt.close();} catch(SQLException e) {}
			if(conn!=null) try{conn.close();} catch(SQLException e) {}
		}
		return list;
	}

	@Override
	public int getMemIdCount(String mem_id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		int count = 0;
		
		try {
			conn = DBUtil.getConnection();
			String sql = "select count(*) count from mymember where mem_id=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, mem_id);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				count = rs.getInt("count");
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if(rs!=null) try{rs.close();} catch(SQLException e) {}
			if(pstmt!=null) try{pstmt.close();} catch(SQLException e) {}
			if(conn!=null) try{conn.close();} catch(SQLException e) {}
		}
		
		return count;
	}

	@Override
	public MemberVO getMemInfo(String mem_id) {
		MemberVO memVo = new MemberVO();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		int count = 0;
		
		try {
			conn = DBUtil.getConnection();
			String sql = "select * from mymember where mem_id=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, mem_id);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				memVo.setMem_id(rs.getString("mem_id"));
				memVo.setMem_pass(rs.getString("mem_pass"));
				memVo.setMem_name(rs.getString("mem_name"));
				memVo.setMem_tel(rs.getString("mem_tel"));
				memVo.setMem_addr(rs.getString("mem_addr"));
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if(rs!=null) try{rs.close();} catch(SQLException e) {}
			if(pstmt!=null) try{pstmt.close();} catch(SQLException e) {}
			if(conn!=null) try{conn.close();} catch(SQLException e) {}
		}
		return memVo;
	}
}

IMemberService.java (interface)

  • Service객체는 DAO에 만들어진 메서드를 원하는 작업에 맞게 호출하여
    결과를 받아오고, 받아온 결과를 Controller에게 보내주는 역할을 한다
  • 보통 DAO의 메서드와 구조가 같다
package kr.or.ddit.member.service;

import java.util.List;

import kr.or.ddit.member.vo.MemberVO;

public interface IMemberService {
	/**
	 * MemberVO객체에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param memVo DB에 insert할 자료가 저장된 MemberVO 객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int insertMember(MemberVO memVo);
	
	/**
	 * 회원ID를 매개변수로 받아서 해당 회원 정보를 삭제하는 메서드
	 * @param mem_id 삭제할 회원ID
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int deleteMember(String mem_id);
	
	/**
	 * 매개변수로 받은 MemberVO객체를 이용하여 해당 회원 정보를 수정하는 메서드
	 * @param memVo update할 회원 정보가 저장된  MemberVO객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int updateMember(MemberVO memVo);
	
	/**
	 * DB의 전체 회원 정보를 가져와 List에 담아서 반환하는 메서드
	 * @return 전체 회원정보 각각을 MemberVO에 담고 있는 List객체
	 */
	public List<MemberVO> getAllMember();
	
	/**
	 * 회원ID를 매개변수로 받아서 해당 회원ID의 개수를 반환하는 메서드
	 * @param mem_id 검색할 회원ID
	 * @return 검색된 회원ID의 갯수
	 */
	public int getMemIdCount(String mem_id);
	
	/**
	 * 회원ID를 매개변수로 받아서 해당 회원의 정보를 반환하는 메서드
	 * @param mem_id 검색할 회원ID
	 * @return 검색된 회원ID 정보
	 */
	public MemberVO getMemInfo(String mem_id);
}

MemberServiceImpl.java

package kr.or.ddit.member.service;

import java.util.List;

import kr.or.ddit.member.dao.IMemberDao;
import kr.or.ddit.member.dao.MemberDaoImpl;
import kr.or.ddit.member.vo.MemberVO;

public class MemberServiceImpl implements IMemberService {
	private IMemberDao dao; // DAO객체가 저장될 변수 선언
	
	// 생성자
	public MemberServiceImpl() {
		dao = new MemberDaoImpl();	// DAO객체 생성
	}

	@Override
	public int insertMember(MemberVO memVo) {
		return dao.insertMember(memVo);
	}

	@Override
	public int deleteMember(String mem_id) {
		return dao.deleteMember(mem_id);
	}

	@Override
	public int updateMember(MemberVO memVo) {
		return dao.updateMember(memVo);
	}

	@Override
	public List<MemberVO> getAllMember() {
		return dao.getAllMember();
	}

	@Override
	public int getMemIdCount(String mem_id) {
		return dao.getMemIdCount(mem_id);
	}

	@Override
	public MemberVO getMemInfo(String mem_id) {
		return dao.getMemInfo(mem_id);
	}

}

MemberController.java

package kr.or.ddit.member.controller;

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

import kr.or.ddit.member.service.IMemberService;
import kr.or.ddit.member.service.MemberServiceImpl;
import kr.or.ddit.member.vo.MemberVO;

public class MemberController {
	private Scanner scan;
	private IMemberService service;

	public MemberController() {
		service = new MemberServiceImpl();
		scan = new Scanner(System.in);
	}

	public static void main(String[] args) {
		new MemberController().memberStart();
	}

	// 시작 메서드
	public void memberStart() {
		while (true) {
			int sel = displayMenu();
			switch (sel) {
			case 1:
				insert();
				break;
			case 2:
				delete();
				break;
			case 3:
				update();
				break;
			case 4:
				update_part();
				break;
			case 5:
				print();
				break;
			case 0:
				System.out.println("시스템을 종료합니다");
				return;
			default:
				break;
			}
		}
	}

	private void update_part() {
		String mem_id = "";
		System.out.print("ID >> ");
		mem_id = scan.next();
		int count = service.getMemIdCount(mem_id);
		if (count == 0) {
			System.out.println("존재하지 않는 아이디입니다.");
			return;
		}
		String sel = displayUpdateMenu();
		try {
			MemberVO memVo = service.getMemInfo(mem_id);
			if (sel.contains("1")) {
				System.out.print("PW >> ");
				memVo.setMem_pass(scan.next());
			}

			if (sel.contains("2")) {
				System.out.print("이름 >> ");
				memVo.setMem_name(scan.next());
			}

			if (sel.contains("3")) {
				System.out.print("전화번호 >> ");
				memVo.setMem_tel(scan.next());
			}

			if (sel.contains("4")) {
				scan.nextLine();
				System.out.print("주소 >> ");
				memVo.setMem_addr(scan.nextLine());
			}

			service.updateMember(memVo);

		} catch (Exception e) {
			// TODO: handle exception
		}

	}

	public String displayUpdateMenu() {
		System.out.println("업데이트할 내용을 선택해주세요");
		System.out.println("중복선택이 가능합니다");
		System.out.println("ex. 123 >  비밀번호/이름/전화번호 수정");
		System.out.println();
		System.out.println("1. 비밀번호 수정");
		System.out.println("2. 이름 수정");
		System.out.println("3. 전화번호 수정");
		System.out.println("4. 주소 수정");
		return scan.next();
	}

	private void print() {
		List<MemberVO> list = service.getAllMember();

		System.out.println("-- 전체 자료 출력 --");
		System.out.println();
		System.out.println("-------------------------------------------------");
		System.out.println("회원아이디\t비밀번호\t회원이름\t전화번호\t\t주소");
		System.out.println("-------------------------------------------------");

		for (MemberVO memVo : list) {
			System.out.println(memVo.getMem_id() + "\t" + memVo.getMem_pass() + "\t" + memVo.getMem_name() + "\t"
					+ memVo.getMem_tel() + "\t" + memVo.getMem_addr());
		}
		System.out.println("-------------------------------------------------");

	}

	private void update() {
		String mem_id = "";
		System.out.print("ID >> ");
		mem_id = scan.next();
		int count = service.getMemIdCount(mem_id);
		if (count == 0) {
			System.out.println("존재하지 않는 아이디입니다.");
			return;
		}
		System.out.println("변경할 정보를 입력해주세요");

		MemberVO memVo = new MemberVO();

		memVo.setMem_id(mem_id);

		System.out.print("PW >> ");
		memVo.setMem_pass(scan.next());

		System.out.print("이름 >> ");
		memVo.setMem_name(scan.next());

		System.out.print("전화번호 >> ");
		memVo.setMem_tel(scan.next());
		// 버퍼 삭제
		scan.nextLine();
		System.out.print("주소 >> ");
		memVo.setMem_addr(scan.nextLine());

		service.updateMember(memVo);

	}

	private void delete() {
		String mem_id = "";
		System.out.print("ID >> ");
		mem_id = scan.next();
		int count = service.getMemIdCount(mem_id);
		if (count == 0) {
			System.out.println("존재하지 않는 아이디입니다.");
			return;
		}
		service.deleteMember(mem_id);
		System.out.println("삭제가 완료되었습니다.");

	}

	private void insert() {
		String mem_id = "";
		int count;
		do {
			count = 0;
			System.out.print("ID >> ");
			mem_id = scan.next();
			count = service.getMemIdCount(mem_id);
			if (count > 0) {
				System.out.println("중복된 아이디입니다");
			}
		} while (count > 0);

		MemberVO memVo = new MemberVO();

		memVo.setMem_id(mem_id);

		System.out.print("PW >> ");
		memVo.setMem_pass(scan.next());

		System.out.print("이름 >> ");
		memVo.setMem_name(scan.next());

		System.out.print("전화번호 >> ");
		memVo.setMem_tel(scan.next());
		// 버퍼 삭제
		scan.nextLine();
		System.out.print("주소 >> ");
		memVo.setMem_addr(scan.nextLine());

		service.insertMember(memVo);
	}

	private int displayMenu() {
		System.out.println("1. 자료 추가");
		System.out.println("2. 자료 삭제");
		System.out.println("3. 자료 수정");
		System.out.println("4. 부분 수정");
		System.out.println("5. 전체 자료 출력");
		System.out.println("0. 작업 끝");
		System.out.print("메뉴 >> ");
		int sel = scan.nextInt();
		return sel;
	}

}