본문 바로가기
코딩/수업 정리

21.01.08 Fri [033]

by 6^6 2021. 1. 8.
728x90

SQL Oracle

 

wikidocs.net/3935

 

Dual 테이블 이란 ?( from dual; )
오라클 자체에서 제공되는 테이블
간단하게 함수를 이용해서 계산 결과값을 확인 할 때 사용하는 테이블

 

 

<대문자 upper 소문자 lower>

select 'welcome to oracle' "적용전", upper('welcome to oracle') "upper적용후" from dual; // 테이블이름 :upper적용후 / 출력 WELCOME TO ORACLE
select 'WELCOME TO ORACLE' "적용전", lower('welcome to oracle') "lower적용후" from dual; // welcome to oracle

select 'WELCOME TO ORACLE' "적용전", INITCAP('WELCOME TO CRACLE') "INITCAP적용후"FROM DUAL; //Welcome To Cracle (첫글자만 대문자로)

 

 

<문자열 길이, 단위 관련 함수 LENGTH LENGTHB INSTR>

*LENGTH 문자열 길이 구하는 함수

select LENGTH('Oracle'), LENGTH('오라클') FROM DUAL; // LENGTH('Oracle') 6 | LENGTH('오라클') 3 

*LENTGTHB byte 단위로 계산하는 함수 (영어는 1byte, 한글은 3byte로 계산)

select LENGTHB('Oracle'), LENGTHB('오라클') FROM DUAL; //LENGTHB('Oracle') 6 | LENGTHB('오라클') 9 

*INSTR(문자열, 검색할 문자, 시작지점, n번째 검색단어) 

select INSTR('WELCOME TO ORACLE', 'O') FROM DUAL; //5 (O가 5번째에 있다)

SELECT SUBSTR ('WELCOME TO ORACLE', 4,3) FROM DUAL; //COM (4번째문자부터 3개 출력)

 

 

<문자열 세서 해당 년, 도 뽑아내기>

select ename, 19 || substr(hiredate, 1,2)년도, substr(hiredate,4,2) 달 from emp; // 1번째부터시작해서 2개세기,4번째부터 시작해서 2개 세기

select ename, hiredate from emp where substr(hiredate,4,2) ='09'; //9월에 입사한 사원을 출력하는 쿼리문

 

 

 

select lpad('ORACLE', 20, '#') from dual; //##############ORACLE (왼쪽에 20개공간 마련하고 #로 채워넣어라)

select rpad('ORACLE', 20, '#') from dual;//ORACLE##############(오른쪽에 20개공간 마련하고 #로 채워넣어라) 

 

<TRIM 함수>

select trim('a' from 'aaaaORACLEaaaaa') from dual; //ORACLE (a 빼고 출력해라)

select trim('   ORACLE   ') from dual; //ORACLE (공백빼고 출력됨)

 

<날짜함수>

select SYSDATE from DUAL; // 오늘날짜 출력

SELECT SYSDATE-1 어제, SYSDATE 오늘, SYSDATE+1 내일 FROM DUAL; // 어제 오늘 내일 테이블 만들고 날짜 출력

select ename, sysdate, hiredate, months_between(sysdate, hiredate) 근무개월수 from emp; // 각 직원들의 근무한 개월 수를 구하는 쿼리문 (개월수가 소숫점까지 제공)

select ename, sysdate, hiredate, trunc(months_between(sysdate, hiredate)) 근무개월수 from emp; // round나 trunc써서 소숫점 반올림하거나 버릴수 있다.

select ename, hiredate, ADD_MONTHS(HIREDATE, 4) FROM EMP; // 개월수 더하기

select sysdate, next_day(sysdate, '수요일') from dual; //오늘을 기준으로 가장 가까운 다음 수요일은 언제인지 알아보는 쿼리문(해당날짜부터 시작하여 명시된 요일을 만나면, 해당되는 날짜를 반환하는 함수이다.)

select hiredate, last_day(hiredate) from emp; // 해달 달의 마지막 날 출력

 

wikidocs.net/3936

<형변환 함수(숫자형 number, 문자형 char(string) , 날짜형 date)>

날짜형 혹은 숫자형을 문자형으로 변환

select sysdate, to_char(sysdate,'yyyy-mm-dd') from dual; //'yyyy/mm/dd' 도 가능. // 2021/01/08 로 출력

select hiredate, to_char(hiredate,'YYYY/MM/DD DAY') from EMP; //사원들의 입사일을 출력하되, 요일까지 함께 출력하는 쿼리문 - day만 붙이면된다.

SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS') FROM DUAL; // 현재 시분초 출력

SELECT ENAME, SAL, TO_CHAR(SAL, 'L999,999') FROM EMP; // 각 지역별 통화 기호를 앞에 붙이고 천 단위마다 콤마를 붙여서 출력하는 쿼리문(예: ₩1,230,000) // ₩1,600 이런식으로 sal값이 바뀌어져서 나옴.

 

*문자형을 날짜형으로 변환하는 함수.

SELECT ENAME, HIREDATE FROM EMP WHERE HIREDATE=TO_DATE(19810220, 'YYYYMMDD'); //TO_DATE(문자(숫자)형, 날짜형) 문자형을 날짜형으로 바꿔줌. 바꾸는 이유는 날짜를 +-로 계산할 수 있기 때문에

SELECT TRUNC(SYSDATE-TO_DATE('2016/01/01', 'YYYY/MM/DD')) FROM DUAL; // 올해 며칠이 지났는지 현재 날짜에서 2016/01/01을 뺀 결과를 출력하는 쿼리문 (sysdate에서 to_date를 뺀다.)

 

*to_number (number타입으로 바꾸는것)

SELECT TO_NUMBER('20,000', '99,999')-TO_NUMBER('10,000', '99,999') FROM DUAL; //'20,000'과 '10,000'의 차이를 알아보기 위해서 빼기(-)연산을 구하는 쿼리문 / '99,999'가 숫자에 ,를 넣어주는것.

 

 

<NULL을 다른 값으로 변환하는 NVL함수>

SELECT ENAME, SAL, COMM, JOB FROM EMP ORDER BY JOB; //이것만 쓰면 null값이 그대로 (null)로 출력됨.

SELECT ENAME, SAL,NVL(COMM, 0), JOB FROM EMP ORDER BY JOB; // comm의 null값을 전부 0으로 출력함.

 

<선택을 위한 DECODE 함수 명령어>(여러가지 경우에 대해서 선택할 수 있도록 하는 기능을 제공한다.(SWITCH CASE문과 같은 기능이다.)

 

SELECT DEPTNO, DECODE(DEPTNO, 10, 'A', 20, 'B', 'DEFAULT') FROM EMP ORDER BY DEPTNO; //사원의 부서 번호를 이름으로 설정하는 쿼리문. 10은 A, 20은 B, 나머지는 DEFAULT로

↓응용

SELECT ENAME, DEPTNO, DECODE(DEPTNO, 10, 'ACCOUNTING', 20, 'RESEARCH', 30, 'SALES', 40, 'OPERATIONS') AS DNAME FROM EMP; //위의 부서번호를 이름으로 나타내는 부분이 함수로 되어 있어 이것을 DNAME로 바꿔 보자

SELECT
    ename,
    deptno,
    decode(deptno, 10, 'ACCOUNTING', 20, 'RESEARCH',
           30, 'SALES', 40, 'OPERATIONS') AS cname
FROM
    emp;

 

 

<조건에 따라 서로 다른 처리가 가능한 CASE 함수>

 SELECT ENAME, DEPTNO, CASE WHEN DEPTNO=10 THEN 'ACCOUNTING' WHEN DEPTNO=20 THEN 'RESEARCH' WHEN DEPTNO=30 THEN 'SALES' WHEN DEPTNO=40 THEN 'OPERATIONS' END AS DNAME FROM EMP;

 SELECT
    ename,
    deptno,
    CASE
        WHEN deptno = 10    THEN
            'ACCOUNTING'
        WHEN deptno = 20    THEN
            'RESEARCH'
        WHEN deptno = 30    THEN
            'SALES'
        WHEN deptno = 40    THEN
            'OPERATIONS'
    END AS dname
FROM
    emp;

//10이면 accounting, 20이면 research, 30이면 sales, 40이면 operations로 DNAME테이블에 넣어준다.

(if-else랑 같은 구조) case , end as 중요

 

 

< SQL 복수행 함수 - 그룹 함수>

1) 그룹함수

SELECT SUM(SAL) FROM EMP; // EMP에 있는 모든 SAL을 더해서 출력★자주씀

SELECT count(*) FROM EMP; // EMP에 대해서 총 몇명인지 세는 함수★자주씀

SELECT avg(sal) FROM EMP; // 급여평균

select min(sal), max(sal) from emp; // 가장 낮은급여, 높은급여 출력

 

SELECT COUNT(COMM) FROM EMP; //사원 테이블의 사원들 중에서 커미션(COMM)을 받은 사원의 수를 구하는 쿼리문 - 0은 count함. null은 count(X) //4출력

SELECT COUNT(DISTINCT JOB) 업무수 FROM EMP;//중복 제거를 반영하여 담당업무의 개수를 구하는 쿼리문 //5출력

 

2) GROUP BY ★★★

SELECT DEPTNO FROM EMP GROUP BY DEPTNO; // 사원 테이블을 부서 번호로 그룹 짓는 쿼리문 - distinct와 같다.

select *from emp group by deptno; 이건 사용 불가능. -어떤 타입을 group by시킬건지 모르기때문에

select avg(sal) from emp group by deptno; // 소속부서별 평균 급여를 구하는 방법

select deptno, ename, avg(sal) from emp group by deptno; //이게 안되는 이유 : ename에 이름이 다 다르기때문에 뒤에 group by ename을 써도 의미없다.

select deptno, sum(sal), avg(sal) from emp group by deptno; // 소속 부서별 급여 총액과 평균 급여를 구하는 쿼리문

select deptno, count(*), count(comm) from emp group by deptno; //부서별 사원의 수와 커미션을 받는 사원의 수를 계산하는 쿼리문. count(*)쓰는 것은 emp의 전부를 구해주는것이기 때문. 어차피 그 숫자가 그 숫자. 확실히 값을 넣어주고 싶으면 count(empno)를 쓰면된다.

 

 

 

 

 

 

JSP

 

 

어제 employee usebean만들어서 코드짰던거 ArrayList<>컬렉션프레임 사용해서 짜는 방법

SQL  select *from emp; 해서 출력된걸 이클립스로 짜는 방법

1)WebContent - WEB-INF - lib 에 ojdbc6.jar 을 반!드!시! 넣어준다.

2)class추가해서 패키지명 edu.bit.ex.vo로 클래스명 EmpVO.java를 생성해준다.(12개 테이블 변수를 다 생성하고 getset추가.)

3)class추가해서 패키지명 edu.bit.ex.dao로 클래스명 EmpDAO.java를 생성해준다.

4)WebContent에 empList.jsp 생성해준다. 

[EmpDAO.java]
package edu.bit.ex.dao;

import java.sql.*;
import java.util.ArrayList;
import edu.bit.ex.vo.EmpVO;

public class EmpDAO {
	private String url = "jdbc:oracle:thin:@localhost:1521:xe"; // 기본적으로 이 3개 기본적으로 복사
	private String uid = "scott";
	private String upw = "tiger";

	public EmpDAO() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

		} catch (Exception e) {

		}

	}

	public ArrayList<EmpVO> empSelect() {
		ArrayList<EmpVO> dtos = new ArrayList<EmpVO>();

		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		String sql = "select * from emp";
		try {

			con = DriverManager.getConnection(url, uid, upw);
			stmt = con.createStatement();
			/*rs = stmt.executeQuery("select * from emp");
								// 해당 데이터를 갖고 옴*/
			rs = stmt.executeQuery(sql);//바뀔수있으니까 이렇게 생성
			
			while (rs.next()) {//12개 다 받아오는 로직 rs.next()
				String name = rs.getString("ename");//String이니까
				int empno = rs.getInt("empno");//int니까
				String job = rs.getString("job");

				EmpVO eDto = new EmpVO(name, empno, job);
				dtos.add(eDto); // ArrayList 로 관리
			}

		} catch (Exception e) {
			e.printStackTrace();

		} finally {

			try {

				if (rs != null)
					rs.close();
				if (stmt != null)
					stmt.close();
				if (con != null)
					con.close();

			} catch (Exception e2) {
				e2.printStackTrace();
			}

		}

		return dtos; //dtos에 12개가 다 들어간것.
	}

}
[EmpVO.java]
package edu.bit.ex.vo;

import java.sql.Timestamp;

public class EmpVO {
//SQL에서 select *from emp;를 담는 코드를 짤것

	private String ename;
	private int empno;// String으로 받아와도 되지만 두번처리해야하니까..
	private String job;
	private Timestamp date;

	// 디폴트 생성자 반드시 만들기
	public EmpVO(String name, int mpno, String job) {
		this.ename = name;
		this.empno = mpno;
		this.job = job;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public Timestamp getDate() {
		return date;
	}

	public void setDate(Timestamp date) {
		this.date = date;
	}

}
[empList.jsp]
<%@page import="edu.bit.ex.vo.EmpVO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!--EmpDAO eDao =new EmpDAO();랑 같은뜻. jsp안에 이렇게 객체생성하는건 안좋음..-->
<jsp:useBean id="eDao" class="edu.bit.ex.dao.EmpDAO" scope="page" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<%
		//↓컬렉션프레임 이제 무조건 써야함. 
	ArrayList<EmpVO> dtos = eDao.empSelect();
	for (int i = 0; i < dtos.size(); i++) {
		EmpVO vo = dtos.get(i);
		out.println("이름: " + vo.getEname() + ", 번호: " + vo.getEmpno() + "<br/>");
	}
	%>
</body>
</html>

↓출력화면

 

 

 

↑위 코드 원리

↑ 이 그림 설명

톰캣하고 서버하고 연결해주는게 Connection 객체이다.(비유는 채팅창)

Statement(쿼리용 객체)가 쿼리문을 서버에 날리고 오라클이 쿼리문을 보고 결과를 다시 서버에 주면 그 결과를 ResultSet 받고 알아서 정리해서 출력 

 

EmpDAO.java 에서

String driver ="oracle.Driver"의 의미는?

Class.forName("Oracle.jdbc.driver.OracleDriver"); 임

 

Oracle안에 connection, statemen, resultset이 있다.(oracle이 만든것. 그래서 이 3종세트를 짜는것이다.)

Connerction, Statement, ResultSet은 제조사가 짜는것. 왜 제조사가 짜야하는지?

메모리를 올려야  ~~??

 

private String url = "jdbc:oracle:thin:@localhost:1521:xe"; //~:thin까지는 정해진것. 그 뒤에는 프로그램(ex.오라클) 번호. xe 이런것도 다 지정되어있는것.

 

 

 

 

update 는 테이블명 변경

DCL DML DDL(delete) 로 나눔- 나중에 배운다.

 

BOF(=before) 가 먼저 있고

rs.next()가 true면 데이터 차례대로 출력(우리는 12개니까 12개 출력)

EOF(after)

 

employee 다시 짜기

[empList.jsp]
<%@page import="edu.bit.ex.vo.EmpVO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!--EmpDAO eDao =new EmpDAO();랑 같은뜻. jsp안에 이렇게 객체생성하는건 안좋음..-->
<jsp:useBean id="eDao" class="edu.bit.ex.dao.EmpDAO" scope="page" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<%
		//↓컬렉션프레임 이제 무조건 써야함. 
	ArrayList<EmpVO> dtos = eDao.empSelect();
	for (int i = 0; i < dtos.size(); i++) {
		EmpVO vo = dtos.get(i);
		out.println("이름: " + vo.getEname() + ", 번호: " + vo.getEmpno() + 
				", 직업: " + vo.getJob() + ", Mgr: " + vo.getMgr() +
				", 입사일" + vo.getHiredate() + ", 급여: " + vo.getSal() +"만원"+
				", 성과금: " + vo.getComm()+"만원" + ", 부서번호: " + vo.getDeptno() + "<br/>");
	}
	%>
</body>
</html>

[EmpVO.java]
package edu.bit.ex.vo;
import java.sql.Timestamp;

public class EmpVO {
//SQL에서 select *from emp;를 담는 코드를 짤것

	private String ename;
	private int empno;// String으로 받아와도 되지만 두번처리해야하니까..
	private String job;
	private int mgr;
	private String hiredate;
	private double sal;
	private double comm;
	private int deptno;

	private Timestamp date;

	// 디폴트 생성자 반드시 만들기
	public EmpVO(String name, int mpno, String job, 
			int mgr, String hiredate, double sal, 
			double comm, int deptno) {
		this.ename = name;
		this.empno = mpno;
		this.job = job;
		this.mgr = mgr;
		this.hiredate = hiredate;
		this.sal = sal;
		this.comm = comm;
		this.deptno = deptno;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public Timestamp getDate() {
		return date;
	}

	public void setDate(Timestamp date) {
		this.date = date;
	}

	public int getMgr() {
		return mgr;
	}

	public void setMgr(int mgr) {
		this.mgr = mgr;
	}

	public String getHiredate() {
		return hiredate;
	}

	public void setHiredate(String hiredate) {
		this.hiredate = hiredate;
	}

	public double getSal() {
		return sal;
	}

	public void setSal(int sal) {
		this.sal = sal;
	}

	public double getComm() {
		return comm;
	}

	public void setComm(int comm) {
		this.comm = comm;
	}

	public int getDeptno() {
		return deptno;
	}

	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}

}
package edu.bit.ex.dao;

import java.sql.*;
import java.util.ArrayList;
import edu.bit.ex.vo.EmpVO;

public class EmpDAO {
	private String url = "jdbc:oracle:thin:@localhost:1521:xe"; // 기본적으로 이 3개 기본적으로 복사
	private String uid = "scott";
	private String upw = "tiger";

	public EmpDAO() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

		} catch (Exception e) {

		}

	}

	public ArrayList<EmpVO> empSelect() {
		ArrayList<EmpVO> dtos = new ArrayList<EmpVO>();

		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		String sql = "select * from emp";
		try {

			con = DriverManager.getConnection(url, uid, upw);
			stmt = con.createStatement();
			/*
			 * rs = stmt.executeQuery("select * from emp"); // 해당 데이터를 갖고 옴
			 */
			rs = stmt.executeQuery(sql);// 바뀔수있으니까 이렇게 생성

			while (rs.next()) {// 12개 다 받아오는 로직 rs.next()
				String name = rs.getString("ename");// String이니까
				int empno = rs.getInt("empno");// int니까
				String job = rs.getString("job");
				int mgr = rs.getInt("mgr");
				String hiredate = rs.getString("hiredate");
				int sal = rs.getInt("sal");
				int comm = rs.getInt("comm");
				int deptno = rs.getInt("deptno");

				EmpVO eDto = new EmpVO(name, empno, job, mgr, hiredate, 
						sal, comm, deptno);
				dtos.add(eDto); // ArrayList 로 관리
			}

		} catch (Exception e) {
			e.printStackTrace();

		} finally {

			try {

				if (rs != null)
					rs.close();
				if (stmt != null)
					stmt.close();
				if (con != null)
					con.close();

			} catch (Exception e2) {
				e2.printStackTrace();
			}

		}

		return dtos; // dtos에 12개가 다 들어간것.
	}

}

 

 

 

오늘의 문제

 

1.아래가 에러가 나는 이유는?
SELECT DEPTNO, ENAME, SUM(SAL), AVG(SAL) FROM EMP GROUP BY DEPTNO;

 

선택은 DEPTNO 와 ENAME을 선택했는데 GROUP BY 에는 DEPTNO만 들어가 있기 때문에. 


2.그룹 함수의 종류는?

SUM, COUNT, AVG, MIN, MAX

예시)

SELECT SUM(SAL) FROM EMP; // EMP에 있는 모든 SAL을 더해서 출력

SELECT COUNT(*) FROM EMP; // EMP에 대해서 총 몇명인지 세는 함수

SELECT AVG(sal) FROM EMP; // 급여평균을 나타내는 함수

SELECT MIN(sal), MAX(sal) from emp; // 가장 낮은급여, 높은급여 출력

 

3.오라클에서 형의 종류와 변환 함수에 대하여 설명하시오.

형변환 함수(숫자형 number, 문자형 char(string) , 날짜형 date)

날짜형 혹은 숫자형을 문자형으로 변환


4.decode 함수에 대하여 설명하시오.

선택을 위한 DECODE 함수 명령어 : 여러가지 경우에 대해서 선택할 수 있도록 하는 기능을 제공한다.(SWITCH CASE문과 같은 기능이다.)

 예시) 

SELECT DEPTNO,

DECODE(DEPTNO, 10, 'A', 20, 'B', 'DEFAULT')

FROM EMP

ORDER BY DEPTNO; 

//사원의 부서 번호를 이름으로 설정하는 쿼리문. 10은 A, 20은 B, 나머지는 DEFAULT로

 


5.CASE 함수에 대하여 설명하시오.

조건에 따라 서로 다른 처리가 가능한 함수이다.

emp 에서 deptno 값에 따라 이름을 붙인걸 dname테이블을 만들어서 ename과 deptno테이블을 출력하고 싶을때, 

SELECT

ename, deptno, 

case when deptno = 10 then 'Accounting'

when deptno = 20 then 'Research'

when deptno = 30 then 'Sales'

when deptno = 40 then 'Operations' 

end as dname

from emp;

 

↓출력화면


6.아래를 프로그래밍 하시오.
-객체 생성 하도록 할것.
-인풋박스 두개 생성하여-가로 세로
-결과를 뿌리는 페이지 

 

[RecArea.java]
package edu.bit.ex.dao;

public class RecArea {
	private double width, height;
	
	public RecArea(){
		
	}

	public RecArea(double width, double height) {
		this.width = width;
		this.height = height;

	}

	public double getWidth() {
		return width;
	}

	public void setWidth(double width) {
		this.width = width;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public double getArea() {

		return (height * width);

	}
//	public String getArea() { //만약 문자열도 출력하고싶으면 string으로 받기
//		return "넓이는?"+(height * width);
//	}
}
[Recjsp.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
 	<jsp:useBean id="dao" class="edu.bit.ex.dao.EmpDAO" />
	<jsp:useBean id="eDao" class="edu.bit.ex.dao.RecArea"  />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<%
	double width = Double.parseDouble(request.getParameter("width"));
	double height = Double.parseDouble(request.getParameter("height"));

	eDao.setWidth(width);
	eDao.setHeight(height);

	out.println(eDao.getArea());
	%>  
</body>
</html>
[RecMain.html]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="Recjsp.jsp" method="get">
가로 : <input type="text" name="width"><br/>
세로 : <input type="text" name="height"><br/>
<input type="submit" value="제출">
</form>
</body>
</html>

 


7.MVC 모델에 대하여 설명하시오. (onebyone1.tistory.com/44)에 뉴렉 설명있음 - 해외면접에서 엄청물음

coding-factory.tistory.com/70

 

[Jsp] MVC 패턴 회원가입 및 로그인

이전 포스팅에서 JSP MVC패턴의 구조와 개념에 대해서 공부를 해보았는데요 이번에는 본격적으로 예제소스를 예로 들어 MVC2 패턴에 심도 있게 공부를 해보도록 하겠습니다. 첫번째 예제로는 웹

coding-factory.tistory.com

Controller(자바코드) : 입력과 제어를 담당 <% %>

Model : 출력데이터

View(HTML코드) : 출력담당 <%=  %>

 

로직을 구현할 때 코드를 훨씬 더 쉽게 이해할 수 있고, 출력을 관리하는 곳 또한 편하게 화면을 구성할 수 있다. 

 

↓MVC모델 적용전 예시 - java코드 작성시 조잡해진다.

[firstjsp.jsp] - WebContent
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int num = 0;
int num_ = Integer.parseInt(request.getParameter("num_"));
%>
	<%if(num_%2 != 0){ %>
	홀수입니다.
	<% }else{%>
	짝수입니다.
	<%} %>
</body>
</html>

 

MVC모델1 적용 예시↓

[MVC_model1.jsp]-WebContent
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%     <--Controll부분-->
	int num = 0;
int num_ = Integer.parseInt(request.getParameter("num_"));

String result;

if (num_ % 2 == 0)
	result = "짝수";
else {
	result = "홀수";
}
%>

<-- ----Model 부분---- -->

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<-- View 부분 -->
	<%=result%>입니다.
    
</body>
</html>

 

velog.io/@doby14515/JSP-in-Model2MVC(model1, model2차이 매우 중요 면접 필수)

model1은 jsp안에 객체 생성(new~)이 들어가면 안된다.

model2는 jsp에 객체생성이 안들어간다.

 

 

[model2]

Controller,Model단과 View단을 완전 분리한다.

Controller(자바코드) doget, dopost

  • 입력과 제어를 담당 <% %>
  • 다른 자바클래스에서 데이터를 넘겨주는 부분
  • Servlet사용
  • request 객체에 결과값(bean) 저장

Model(Class파일)

  • 출력데이터.
  • Java Beans사용
  • [pageContext, request, session, application]객체가 있는데 request 가장 적합

View(HTML코드) (Controlloer에 구현내용있는 껍데기. )

  • 문서출력담당 <%= %>
  • JSP사용
  • HTML파일로 만들수도 있지만 JSP로 사용하면 JAVA코드를 쓸 수 있다는 장점이 있다.

 

[MVCtemp.java(servlet)] src-패키지-class-jsp
import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MVCtemp")
public class spa extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public spa() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		int num = 0;
		int num_ = Integer.parseInt(request.getParameter("num"));

		String result;

		if (num_ % 2 == 0)
			result = "짝수";
		else
			result = "홀수";

		// 이제 이 파일과 MVC_model2.jsp파일을 이어줘야하는데
		// 이어주는 방법 2가지
		// forward : 현재 작업한 것을 이어가는것 -
		// redirect : 새로운 작업 요청
        
        <-- controller 부분-->
		request.setAttribute("result", result);

		RequestDispatcher dispatcher = request.getRequestDispatcher("MVC_model2");
		dispatcher.forward(request, response);

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}
}
[MVC_model2.jsp] - WebContent
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <-- view 부분-->
	<%=request.getAttribute("result") %>입니다.
</body>
</html>

 

↓더 쉽게 표현하는 방법인 EL(Expression Language)

[MVC_model2.jsp] - WebContent - EL방법으로 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <-- view 부분-->
   	 ${result}입니다
</body>
</html>

 

 

*번외*

6번 문제 - RecArea.java 에서 생성자에 public을 안붙였을 경우 생기는 오류.

 

코드상으론 오류가 없었음에도 불구하고 오류페이지 500이 뜨면서 useBean의 class속성을 위한 값은 유효하지 않습니다. 서버가, 해당 요청을 충족시키지 못하게 하는 예기치 않은 조건을 맞닥뜨렸습니다. 라는 메시지가 나왔다.

왜안되는지 스스로 결론?

default는 같은 클래스내부와 같은 패키지 내에선 불러올 수 있는데 Recjsp.jsp파일은 RecArea.java와 같은 클래스나 같은 패키지 내에 들어있지 않기 때문에 이외의 영역에서도 가질 수 있는 public을 붙인 생성자를 만들어야 오류가 나지않는다. public을 붙여주지 않아도 코드상의 오류는 없으나 실행할때 오류가 난다. 오류화면에서도 어떤 오류인지 알 수 없어 오류찾는데 많은 시간을 소요했음을 잊지말것!

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

21.01.12 Tue [035]  (0) 2021.01.12
21.01.11 Mon [034]  (0) 2021.01.11
21.01.07 Thu [032]  (0) 2021.01.07
21.01.06 Wed [031]  (0) 2021.01.06
21.01.05 Tue [030]  (0) 2021.01.05

댓글