728x90

 

세션 영역에 있는 관리자 로그인 정보 중에 id만 가져와서

admin 테이블로 casting하고 다시 보드 테이블에 넣어주어 이를 공지사항 쓰기할 때

고정적으로 작성자에 보여주는걸로 코드 수정 및 기능 추가

 

	@RequestMapping("adminNoticeWriteView.ad")
	public String adminNoticeWriteView() {
		return "adminNoticeWriteView";
	}

 

	@RequestMapping("adminNoticeWriteView.ad")
	public String adminNoticeWriteView(@ModelAttribute Board b, Model model, HttpSession session) {
		
		String adId = ((Admin)session.getAttribute("adminUser")).getId();
		b.setAdminId(adId);
		model.addAttribute("b",b);
		
		return "adminNoticeWriteView";
	}

 

728x90
반응형
728x90

 

 

 

코드에서 중점적으로 봐야할 부분

(코드를 끌어온다거나 새로 만들면서 중점적으로 봐야할 부분)

 

1. 컨트롤러가 dispatcher servlet으로부터 어떤 url로 받아올지에 대한 url 설정 부분

2.page : 해당 게시물을 상세보기로 들어갔다 뒤로가기해서 나와도 해당 페이지 번호를 유지하기 위해 필요한 값

3.required=false 옵션을 안해놓으면 항상 값이 들어가야하기 때문에 처음 페이지 들어갈 때는 page값에 수가 없으므로 에러 발생

4.Integer page : page가 int라 null 못들어가서 int 타입으로 받으면 parsing 해줘야하니 래퍼클래스(wrapper)로 한번에 받아옴

5. model과 ModelAndView 둘 중 하나 선택가능

핵심 데이터값이라 알아둬야하는 변수명

6. service를 거쳐 dao로 보낼 메소드명

7.setViewName() 메소드를 통해 어느 뷰를 보여줄 지 결정하는 부분

8.아래처럼 예외(exception)처리해도 되고, 에러페이지를 따로 만들어서 거기로 에러메시지 값과 함께 보내도됨 

9.return  : 리턴 유무 여부와 리턴할 데이터타입 잊지말고 체크

 

 

728x90
반응형
728x90

 

sql의 테이블 확인하고 

vo의 필드(전역변수) 세팅

필요한 값들을 필드에 넣기

 

package com.kh.test.model;

import java.sql.Date;

public class Test {
	
	public int seq;
	public String writer;
	public String title;
	public String content;
	public Date regDate;
	
	public Test() {}

	public Test(int seq, String writer, String title, String content, Date regDate) {
		super();
		this.seq = seq;
		this.writer = writer;
		this.title = title;
		this.content = content;
		this.regDate = regDate;
	}

	
	public int getSeq() {
		return seq;
	}

	public void setSeq(int seq) {
		this.seq = seq;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	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;
	}

	public Date getRegDate() {
		return regDate;
	}

	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	
	

}
728x90
반응형
728x90

 

MVC 로직 작동 순서 설명 (feat. JDBC 메뉴구현)

메뉴파일 MVC패턴 설명 with JDBC & oracle

 

1.run파일에서 뷰의 메뉴 메소드 호출

(view를 기준으로 하나씩 구현해가면 덜 헷갈린다)

package com.kh.run;
import com.kh.view.Menu;

public class Run {
	public static void main(String[] args) {
		**new Menu().mainMenu();**
	}
}

 

 

2.뷰의 메뉴 메소드에서 사용자에게 메뉴 번호 입력받아 해당 번호를 실행하기 위해 콘트롤러에게 해당 번호 메소드 요청

public class Menu {
	public void mainMenu() {
	Employee**Controller ec** = new EmployeeController();
	do { 			
			System.out.println("====================");
			System.out.println("[Main Menu]");
			System.out.println("1.전체 사원 정보 조회");	
			// ... 
	switch(user) {
			case 1: **ec.selectAll()**; break;
			case 2: break;
			// ...
			default: System.out.println("잘못 입력")	
			}
		} while(user != 0); 

 

 

3.컨트롤러에서 DAO 메소드를 호출한다.(후에 결과값 받아옴)

목적이 DB(오라클)에서 전체 사원정보 조회이기에 자바랑 sql 오라클을 연결해서 받아 올 수 있게 DAO에서 메소드를 호출한다

DAO(Date Access Object) : 외부 데이터 저장공간과 연결하는 역할

세부설명 : DB의 data에 접근하기 위한 객체로 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.

package com.kh.controller;

public class EmployeeController {
public void selectAll() {
		**empDAO.selectAll()**; // DAO에서 메소드를 호출
	}

 

 

4.DAO에서 jdbc 드라이버 연결 및 받아온 데이터를 리턴함

  • 주의사항 : 리턴할 때 리턴하는 데이터의 타입을 보고 해당 메소드( selectAll() )의 반환타입을 리턴하는 데이터로 수정해준다. 보통은 void로 되어있을 것이다.
package com.kh.model.dao;
public class EmployeeDAO {
	public **ArrayList<Employee>** selectAll() {
		// jdbc 드라이버 연결 및 자료 받아오기
		**return list**;
  }	
}

 

 

5.위의 3번에서 empDAO.selectAll(); 이 코드가 필요에 의해 DAO를 호출했기에 받아온 값을 다시 넣어줘야한다 .

그리고 사용자에게 받아온 데이터의 결과값을 보여주기 위해 뷰의 메소드를 호출한다

package com.kh.controller;

public class EmployeeController {
public void selectAll() {
		**ArrayList<Employee> list** = empDAO.selectAll(); 
		
		// list가 비어있을 때 = 사원이 없을 때
		if(list.isEmpty()) {
			menu.displayError("조회 결과가 없습니다.");
		}else {
		// list가 비어있지 않을 때 = 사원 존재할 때
			**menu.selectAll(list);** // DAO에서 받아온 list의 값이 존재하니 받아온 데이터를 넘겨줌
		}
	}

 

 

6.DAO에서 받아온 전체사원정보 데이터를 콘트롤러에서 menu.selectAll(list); 코드를 통해 아래의 뷰 selectAll()메소드로 보내주었고, 받아온 데이터의 형식이 리스트에 여러 행이 존재하기에 for문 돌려서 한 줄 씩 받아와서 출력이 되도록 println() 해준다

package com.kh.view;
public class Menu {
	public void mainMenu() {
		// ...
	}

	public void **selectAll**(ArrayList<Employee> list) {
			for(int i = 0; i < list.size(); i++) {
				System.out.println(list.get(i));
			}
	}
}

 

7.다른 메뉴의 기능 구현할려면 2번으로 돌아가 do while문 안에 switch문의 case에서 컨트롤러를 호출하는 메소드를 기술하고 컨트롤러에 가서 해당 메소드를 생성하는 것으로 이어가면 된다

 

 

요약

V → C → M

V ← C ← M

 

1.run파일에서 뷰 메뉴 메소드 호출

2.실행 할 기능의 컨트롤러 메소드 호출

3.컨트롤러에서 DAO 메소드 호출 for DB연결 및 데이터 가져오기

4.호출된 DAO 메소드에서 jdbc로 db에 연결 및 받아온 데이터를 리턴해준다.

5.컨트롤러에서 필요에 의해 값을 받아오기 위해 DAO 메소드를 호출했으니, 호출요청한 코드에 DAO에서 받아온 데이터를 넣어준다

그리고 사용자에게 받아온 데이터의 결과값을 보여주기 위해 뷰의 메소드를 호출하고 호출하면서 DAO에서 받아온 데이터를 같이 보내준다

6.DAO에서 컨트롤러를 거쳐 받아온 데이터를 사용자에게 보여주기 위해 해당 뷰 메소드에서 받아온 데이터를 출력할 수 있게 데이터처리하고 출력하면 된다

 

JDBC 메뉴구현 : MVC 로직 작동 순서 설명 (notion.site)

 

JDBC 메뉴구현 : MVC 로직 작동 순서 설명

A new tool for teams & individuals that blends everyday work apps into one.

furtive-coelurus-447.notion.site

 

 

 

728x90
반응형
728x90

 

MVC패턴 적용

 

Run

View

Controller

Model.DAO

Model.VO

 

package MVC.run;
import MVC.view.pView07;

public class pRun07 {
	public static void main(String[] args) {
		
		pView07 pv = new pView07();
		pv.mainMenu();
	}
}

 

package MVC.view;
import java.util.ArrayList;
import java.util.Scanner;

import MVC.controller.pController07;
import MVC.model.vo.pModelVo07;

public class pView07 {
// view : 화면
//	   		   사용자에게 보여지는 곳	
	private Scanner sc = new Scanner(System.in);
	
	
	public void mainMenu() {
		
		pController07 pc = new pController07();
		int user = 0;
		
		do {
			
			System.out.println("====================");
			System.out.println("[Main Menu]");
			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.println("====================");
			System.out.print("메뉴 선택 : ");
			user = Integer.parseInt(sc.nextLine());
			
			switch(user) {
			case 1: pc.selectAll(); break;
			case 2: break;
			case 3: break;
			case 4: break;
			case 5: break;
			case 0: System.out.println("프로그램을 종료합니다"); break;
			default: System.out.println("잘못 입력");
				
			}
		}while(user !=0 );
		
	}
	public void displayError(String disErr) {
		System.out.println("서비스 요청 실패  : " + disErr);
	}
	public void displaySuccesss(String disSuc) {
		System.out.println("서비스 요청 성공 : "+ disSuc);
	}
	
	// 메뉴1.전체 사원 정보 조회
	public void selectAll(ArrayList<pModelVo07> al) {
		for(int i=0; i<al.size(); i++) {
			System.out.println(al.get(i));
		}
		
	}
	
	
	
	
}

 

package MVC.controller;
import MVC.model.DAO.pModelDAO07;
import MVC.model.vo.pModelVo07;
import MVC.view.pView07;

import java.util.ArrayList;


public class pController07 {

//	controller : Model과 View를 연결해주는 다리역할
//	 넘겨받은 데이터를 가공시키는 역할
//	어떤 뷰에 출력할지를 결정	

	private pModelDAO07 pmDAO = new pModelDAO07();
	private pView07 pV07 = new pView07();
	
	 
	// 메뉴1.전체 사원 정보 조회
	public void selectAll() {
		ArrayList<pModelVo07> al = pmDAO.selectAll();
		if(al.isEmpty()) {
			System.out.println("조회 결과가 없습니다");
		}else {
			pV07.selectAll(al);
		}
			
	}
		
		
	
		
}

 

package MVC.model.DAO;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import MVC.model.vo.pModelVo07;

public class pModelDAO07 {

// DAO : Date Access Object
//		 데이터를 외부에 저장해놓을 수 있는 파일,db
//	 	 서로 왔다갔다 할 수 있는 공간으로 사용됨
//	 	외부 데이터 저장공간과 연결
//	 	DAO는 DB의 data에 접근하기 위한 객체로 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.

	
	
	// 메뉴1.전체 사원 정보 조회
	public ArrayList<pModelVo07> selectAll() {
		ArrayList<pModelVo07> al = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "SCOTT", "qrwe"); 
			String query1 = "SELECT * FROM EMP";
			stmt = conn.createStatement();
			rset = stmt.executeQuery(query1);
			
			al = new ArrayList<pModelVo07>();
			while(rset.next()) {
				
				int empNo = rset.getInt("EMPNO");
				String empName = rset.getString("ENAME");
				String job = rset.getString("JOB");
				int mgr = rset.getInt("MGR");
				Date hireDate = rset.getDate("HIREDATE");
				int sal = rset.getInt("SAL");
				int comm = rset.getInt("COMM");
				int deptNo = rset.getInt("DEPTNO");
				
				pModelVo07 pv07 = new pModelVo07(empNo, empName, job, mgr, hireDate, sal, comm, deptNo);
				
				al.add(pv07);
						
				System.out.println(al);
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				conn.close();
				rset.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}	
		}
		
		return al;
	}
	
	
	
}

 

package MVC.model.vo;
import java.sql.Date;

public class pModelVo07 {
//  VO : Vaule Object
//		 데이터를 잠시 담아두는 ‘임시 저장공간’
//    	 변수로써 사용
//	 	 Read-Only속성을 값 오브젝트
//   	  자바에서 단순히 값 타입을 표현하기 위해 불변 클래스(Read-Only)를 만들어 사용

	private int empNo; // 사번
	private String empName; // 이름
	private String job; // 직책
	private int mgr; // 직속 상사(manager)
	private Date hireDate; // java.sql.Date // 고용일
	private int sal; // 급여
	private int comm; // 커미션(인센티브)
	private int deptNo; // 부서번호

	
	public pModelVo07() {}
	public pModelVo07(String job, int sal, int comm) {
		this.job = job;
		this.sal = sal;
		this.comm = comm;
	}
	public pModelVo07(int empNo, String job, int sal, int comm) {
		this(job, sal, comm);
		this.empNo = empNo;
	}
	public pModelVo07(int empNo, String empName, String job, int mgr, int sal, int comm, int deptNo) {
		this(job,sal,comm);
		this.empNo = empNo;
		this.empName = empName;
		this.mgr = mgr;
		this.deptNo = deptNo;
	}
	public pModelVo07(int empNo, String empName, String job, int mgr, Date hireDate, int sal, int comm, int deptNo) {
		this(job,sal,comm);
		this.empNo = empNo;
		this.empName = empName;
		this.mgr = mgr;
		this.deptNo = deptNo;
		this.hireDate = hireDate;
	}
	
	public int getEmpNo() {
		return empNo;
	}
	public String getEmpName() {
		return empName;
	}
	public String getJob() {
		return job;
	}
	public int getMgr() {
		return mgr;
	}
	public Date getHireDate() {
		return hireDate;
	}
	public int getSal() {
		return sal;
	}	
	public int getComnn() {
		return comm;
	}
	public int getDeptNo() {
		return deptNo;
	}
	
	public void setEmpNo(int empNo) {
		this.empNo = empNo;
	}
	public void setEmpName(String empName) {
		this.empName = empName;
	}
	public void setMgr(int mgr) {
		this.mgr = mgr;
	}
	public void setHireDate(Date hireDate) {
		this.hireDate = hireDate;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public void setComm(int comm) {
		this.comm = comm;
	}
	public void setDeptNo(int deptNo) {
		this.deptNo = deptNo;
	}
	
	
	@Override
	public String toString() {
		return empNo+" / "+empName+" / "+job+" / "+mgr+" / "+hireDate+" / "+sal+" / "+comm+" / "+deptNo+" / ";
	}
	
}

 

728x90
반응형
728x90

 

model.VO

Override toString() + setter/getter

 

package MVC.model.vo;
import java.sql.Date;

public class pModelVo07 {
//  VO : Vaule Object
//		 데이터를 잠시 담아두는 ‘임시 저장공간’
//    	 변수로써 사용
//	 	 Read-Only속성을 값 오브젝트
//   	  자바에서 단순히 값 타입을 표현하기 위해 불변 클래스(Read-Only)를 만들어 사용

	private int empNo; // 사번
	private String empName; // 이름
	private String job; // 직책
	private int mgr; // 직속 상사(manager)
	private Date hireDate; // java.sql.Date // 고용일
	private int sal; // 급여
	private int comm; // 커미션(인센티브)
	private int deptNo; // 부서번호

	
	public pModelVo07() {}
	public pModelVo07(String job, int sal, int comm) {
		this.job = job;
		this.sal = sal;
		this.comm = comm;
	}
	public pModelVo07(int empNo, String job, int sal, int comm) {
		this(job, sal, comm);
		this.empNo = empNo;
	}
	public pModelVo07(int empNo, String empName, String job, int mgr, int sal, int comm, int deptNo) {
		this(job,sal,comm);
		this.empNo = empNo;
		this.empName = empName;
		this.mgr = mgr;
		this.deptNo = deptNo;
	}
	public pModelVo07(int empNo, String empName, String job, int mgr, Date hireDate, int sal, int comm, int deptNo) {
		this(job,sal,comm);
		this.empNo = empNo;
		this.empName = empName;
		this.mgr = mgr;
		this.deptNo = deptNo;
		this.hireDate = hireDate;
	}
	
	public int getEmpNo() {
		return empNo;
	}
	public String getEmpName() {
		return empName;
	}
	public String getJob() {
		return job;
	}
	public int getMgr() {
		return mgr;
	}
	public Date getHireDate() {
		return hireDate;
	}
	public int getSal() {
		return sal;
	}	
	public int getComnn() {
		return comm;
	}
	public int getDeptNo() {
		return deptNo;
	}
	
	public void setEmpNo(int empNo) {
		this.empNo = empNo;
	}
	public void setEmpName(String empName) {
		this.empName = empName;
	}
	public void setMgr(int mgr) {
		this.mgr = mgr;
	}
	public void setHireDate(Date hireDate) {
		this.hireDate = hireDate;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public void setComm(int comm) {
		this.comm = comm;
	}
	public void setDeptNo(int deptNo) {
		this.deptNo = deptNo;
	}
	
	
	@Override
	public String toString() {
		return empNo+" / "+empName+" / "+job+" / "+mgr+" / "+hireDate+" / "+sal+" / "+comm+" / "+deptNo+" / ";
	}
	
}
728x90
반응형
728x90

 

 

 

 

package model.vo;

public class pModelVo01 {

	private String name;
	private int score;
	
	public pModelVo01() {}
	public pModelVo01(String name, int score) {
		this.name = name;
		this.score = score;
	}
	
	// getter & setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	
	
	// toString
	@Override
	public String toString() {
//			return name(score점); 이 줄이 아래 코드 의미...
		return name+"("+score+"점)";
	}
		
		
	
}

 

package controller;
import java.util.ArrayList;
import model.vo.pModelVo01;

public class pController01 {

	public void firstR() {
		
//		ArrayList list = new ArrayList();
		ArrayList<pModelVo01> list = new ArrayList<pModelVo01>(3); // 지네릭스 : 데이터타입 한정
		
		System.out.println(list); // 결과값 : []
								  // 리스트 자체가 대괄호 자동생성
		list.add(new pModelVo01("1번", 0));
		list.add(new pModelVo01("2번", 2));
		list.add(new pModelVo01("3번", 3));
		list.add(new pModelVo01("4번", 3));
		System.out.println(list);
//		list.add("hi",0);
//		
		
	}
	
}

 

728x90
반응형

+ Recent posts