MVC패턴은 Model, View, Controller의 약어로, 프로그램을 개발하는 중 발생했던 문제를 정리하여 상황에 따라 간편하게 사용하여 쓸 수 있는 것을 정리하여 특정한 규약을 통해 쉽게 쓸 수 있는 형태로 만든 디자인패턴 중 하나.
비지니스 처리 로직과 사용자 인터페이스 요소들을 분리시켜 서로 영향없이 개발 하기 수월하다는 장점이 있다.
예를 들어 그냥 jQuery를 이용한다면 $('#lucid')로 DOM을 선택할 수 있는 것을 그냥 순수Javascript를 사용한다면 document.getElementsByid('lucid')로 길게 써가며 찾아야 하겠죠. 예를 들어 어떠한 data를 만들고 이 data를 수정할 로직을 짠다. 그리고 그 data를 보여주는 부분을 만들 때 이거 하나하나가 로직이 분리가 안되있고 한꺼번에 정의가 되어있다면? 나중에 유지보수하기가 힘들겁니다. 그걸 "돕기" 위해 디자인패턴이라는게 나오는 것이며 이렇듯 "좀 더 쉽고 편리하게" 사용할 수 있게 만든 특정한 방법들을 디자인 패턴이라고 합니다. 그 디자인 패턴이라는 것은 스트래티지 패턴, 옵저버 패턴 등등 정말 여러가지가 있고 그 중에 하나가 바로 MVC패턴입니다.
1. Model이란 ?
규칙 1: 사용자가 편집하기 원하는 모든 데이터가 담겨있어야 한다.
규칙 2 : view나 controller에 대해서 어떤 정보도 알지 말아야 한다. (UI를 직접조정할 수 없다는 의미)
규칙 3 : 데이터에 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야 한다
규칙 4: 재상요이 가능해야 하며 다른 인터페이스에서도 변하지 않아야 한다.
2. Controller란 ?
Model내의 [Data]와 사용자의 인터페이스[View] 를 잇는 매개역할을 합니다.
규칙 1 : 모델이나 뷰에 대해서 알고 있어야 한다.
규칙 2 : 모델이나 뷰의 변경을 모니터링 해야 한다 (모델이나 뷰의 변경통지를 받으면 이를 해석하여
각각의 구성요소에 통지를 해야 한다. )
3. view란 ?
input텍스트, 체크박스 항목과 같은 사용자의 인터페이스영역입니다. 사용자가 데이터를 입력하거나, 요청한
데이터를 출력해주는 역할을 담당합니다.
규칙 1 : 모델이 가지고 있는 임의의 정보를 화면에 노출해서는 안된다.
규칙 2 : 모델이나 컨트롤러와 같이 다른 구성요소들을 알아선 안된다.
자신을 제외하고는 다른 요소의 참조와 동작요소를 알아선안된다.
MVC 패턴을 왜 사용할까?
View, Controller, Model이 각각 분리되어 자신의 역할에 집중할 수 있기 때문에
국내외 많은 IT조직에서 소프트웨어 프로젝트 관리 향상을 위하여, PMS(Project Management System)를 도입하고 있다.
이러한 추세는 단순한 수작업으로 SW 프로젝트 관리를 수행하기에는 체계의 복잡성이나 업무의 양 자체가 매우 크다는 것을 입증한다. 실제로 PMS와 같은 자동화 시스템 없이 다수의 프로젝트를 체계적인 관리 한다는 것은 현실적으로 불가능하다. 때문에 수많은 조직에서 앞다투어 PMS를 도입하고 있다.
6) 요구사항 분석 및 화면설계서 작성 (요구사항은 분석 시 대략적인 기능만 작성, 화면설계서는 'Process' 삭제 후, 경로로 대체)
7) PMS 분야 역할 및 기능
공통 : CEO (조회 위주이기 때문에 CEO의 역할은 따로 정해지지 않은 상태) 지은님 : 일정 혜진님 : PM 성근님 : TM 다은님 : HR
(1) 통합 관리 : 대시보드 조회 (TM) (2) 일정 관리 : 프로젝트의 통합 일정 관리 (TM) (3) 의사소통관리 : 채팅, 보고서 제출 (TM) (4) 범위관리 : 프로젝트 등록 (PM), 프로젝트 확인 (결과-대시보드) (5) 인적자원관리 : 프로젝트 참여인원 관리 (PM), 기업의 인적관리 (HR)
TM : 프로젝트 관리 (보고서 제출, 채팅) 일정 관리 (팀 / 개인, Gantt Chart) PM : 프로젝트 관리 (프로젝트 등록) 대시보드 (추가기능) 리스크 관리 HR : 인적관리 로그인
(선택 옵션 - 상황에 따라서 추가로 구현할 수 있는 범위) (1) 위험관리 : 리스크 등록 (TM), 리스크 조치 (PM) (2) 품질관리 : 테스트 결과 (TM), 결과 조치 (PM)
-------------------------------------------------------------------- 09.24 주요 회의 내용
@GetMapping : @RequestMapping(method = RequestMethod.GET) 의 축약형이다. 클라이언트의 요청에 대해 어떤 ****Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션 //클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시하여 사용 //클라이언트는 URL로 요청을 전송하고, //요청 URL을 어떤 메서드가 처리할지 여부를 결정하는 것이 바로 "@RequestMapping" 라고 할수 있어요. // 미자막 XXXMapping("url주소")
ORACL연결 & JAR 파일 구축 1) DB 베이스 서버 구축. - oracle 사이트. 11g xe 서버를 다운 접속을 하기 위해 ip, port, sid, 계정, 비밀번호 ip : tcp/ip기반의 특정 위치 네트워크 접속 port : 서버의 특정 연동 통로 ex) 웹서버7080, 오라클:1521, 메일서버, 파일서버 - 계정에 포함된, 2차원 테이블 기반의 데이터를 저장, 수정, 삭제로딩을 할 수 있다. 2) DB client를 통해서 접속. - cmd창에서 sqlplus 계정/비밀번호 - eclipse의 plugin 프로그램(dbeaver) 설치, 접속 드라이버 관리(jdbc 드라이버) 접속처리 (새데이터베이스 연결) 연결 DB 내용을 확인. 3) 프로그래밍(spring)을 접속.. - jdbc 드라이버를 통해 접속할 수 있다. springweb\WebContent\WEB-INF\lib하위에 ojdbc6.jar 4) DB에 있는 데이터를 controller하는 실제 명령어 : sql ex) select * from emp, insert into 테이블명 value(입력데이터.. )
1. 기본 설정관련. 1) db연결을 위한 jdbc driver 설정. cf) jdbc : java database connection java 프로그램으로 db 서버를 연결하기 위한 공통 모듈 web에서 lib로 추가. springweb\WebContent\WEB-INF\lib\ojdbc6.jar 2) mybatis 연결 모듈(framework).jar springweb\WebContent\WEB-INF\lib\ commons-dbcp-1.2.2.jar mybatis-spring-1.0.2.jar mybatis-3.0.6.jar, 설정.
1. 컨테이너설정!
3) 컨테이너(dispatcher-servlet.xml)에서 - dbcp(database connection pool)로 연결정보와 jdbc 드라이버를 통해 db서버에 연동하도록 한다. ip, port, sid, 계정, 비밀번호 - mybatis 연결 정보 설정. dbcp 연결 mybatis의 연결의 공통 설정 파일 선언(mybatis.Spring.xml위치) - mybatis와 연결시, interface를 통해 mybatis가 실제 객체를 만들어 주는데, 이 dao interface 폴드 위치를 선언. ex) EmpDao dao = new RealEmpDao(); RealEmpDao ==> mybatis를 통해서 만들어 진 실제 데이터 처리 결과를 포함하는 실제 객체가 인터페이스명 으로 할당되어 service단에서 사용될 수 있다. 4) mybatis 공통 xml 설정파일(mybatis.Spring.xml) - 사용한 VO,DTO 객체를 alias이름을 선언 - 각 DAO클래스 단위와 연결하는 XXXMapper.xml를 선언. ex) BoardDao(인터페이스), BoardMapper.xml 5) XXXMapper.xml의 선언. - 조회, 수정, 삭제 처리하는 sql을 각 기능단위로 선언하는 곳을 말한다. 2. XXXMapper.xml VS XXXDao.java의 관계 1) 인터페이스를 통해서 MYBATIS를 통해 실제 상속받은 클래스를 통해 실제 객체를 만들어 주는 관계에 있기에 특정한 코드는 연동이 가능하게 선언하여야 한다. 2) 연동 규칙 xxxDao.java XXXMapper.xml interface EmpDao <mapper namespace="패키지명.EmpDao"> public ArrayList<Emp> empList(Emp sch) <select 속성=속성값 1) ArrayList<Emp> resultType="emp" 2) empList id="empList" 3) (Emp sch) parameterType="emp" ex) public Emp getEmp(int empno) <select id="getEmp" resultType="emp" parameterType="int" ex) public void insertEmp(Emp ins) <insert id="insertEmp parameterType="emp" // ex)
3. sql 처리 순서.. 1) sql 작성. 결과값으로 처리할 vo의 내용 확인 select * from dept; insert into dept values(10,'회계','서울');
2) VO 작성(조회시 결과 단위데이터를 저장할 객체)
3) DAO 인터페이스 구성.. springweb.a05_mvc.a03_dao에서 구성. 테이블 단위나 업무단위로 Dao인터페이스 추가.. interface DeptDao{}
4) 기능 메서드 선언. sql통해서 나타나는 데이터를 return할 객체, 조회조건 VO
5) 공통 mybatis.Spring.xml - 사용할 VO를 alias로 선언. - XXXMapper.xml 테이블 단위나 업무단위로 XXXMapper.xml을 추가하면 된다. 6) XXXMapper.xml - 결과 객체 선언. resultMap - sql문 처리할 요소객체 선언 - id, 매개변수, return값 선언.. 1. java의 Dao인터페이스 상속한 실제 객체를 생성해주는 역할을 하는 것이 XXXMapper.xml 2. sql의 결과 데이터 ==> 객체로 할당 처리.. 3. DAO인터페이스가 특정한 규칙에 의해서 XXXMapper.xml의 속성과 연결처리..
그렇다면! <Context:component-scan>이란? Bean이 될 수 있는 모든 Component를 자동으로 찾아 Bean container에 등록해준다. 패키지명 이후의 하위 패키지를 검색해 @Component 어노테이션을 포함하는 모든 클래스를 Bean으로 자동 등록해준다.
그렇다면 , annotaion이란? 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공하는 것이다. 코드에 정보를 추가하는 정형화된 방법이다. 즉, 프로그램에 추가적인 정보를 제공해주는 메타데이터(data를 위한 data) 라고 볼 수 있다. @Component 어노테이션이 달린 클래스를 Bean으로 자동 등록/생성해준다는의미다.
Spring의 좋은 점 중 하나는 connection full을 일일이 지정해주지 않아도된다는 것에 있다.
property 속성값으로 드라이버, 주소,계정,비번을 입력하고
bean의 아이디와 class값을 설정해주면, 이후부터는 connection 을 따로 써주지 않아도 자동연동처리된다.
참 간단하죵?
네번째! mybatis연동
2. Mybatis와 연동
1) dbcp연결
2) java/resource/mybatis.Spring.xml
로 공통 연결 처리..
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation"
value="classpath:resource/mybatis.Spring.xml" />
</bean>
세번째에 선언해놓은, dataSource라는 DB 연동 소스를 참고하여 mybatis.srping.xml에 값을 매핑시켜준다.
여기서 Mybatis란?
Mybatis는 자바object 와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크이다.
JDBC의 모든 기능은 mybatis가 대부분 제공하기때문에 JDBC코드를 작성하지 않아도되며,
복잡한 JDBC코드를 걷어낼 수 있기 때문에 깔끔한 소스코드를 유지할 수 있다.
수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다.
다섯번째! DAO의 인터페이스 위치를 설정
3. dao 인터페이스 페이지 위치를 설정..
인터페이스 ==> 인터페이스의 상속받은
실제객체생성(mybatis 프레임웍 XXXmapper.xml)
name="basePackage" value="dao경로1, dao경로2,..."
-->
<bean
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="springweb.a05_mvc.a03_dao"/>
</bean>
인터페이스의 상속받은 실제 객체를 생성하는 것은 mybatisframework에서 진행한다. xxxmapper.xml
name= "basePackage"로 지정한다면 vlaue="dao경로1" "dao경로2" 의 식으로 작성한다.
-- ex1) job이 'SALESMAN'인 데이터를 출력하되, 칼럼은 ENAME, JOB, SAL을 선택하세요.
--myquery (where job = "소문자로 입력시 출력이안된다.")
SELECT ename, job, SAL
FROM emp
WHERE job = 'SALESMAN';
--답
SELECT ename, job, sal
FROM emp
WHERE job = 'SALESMAN';
-- ex2) 부서번호(deptno)가 20이고, sal가 4000미만인 데이터를 출력하세요.
--myquery
SELECT *
FROM emp
WHERE deptno = 20 AND sal < 4000;
--답
SELECT *
FROM emp
WHERE deptno = 20
AND sal < 4000;
-- ex3) 연봉(sal)이 2000에서 3000사이 이거나, 직책(job)이 'SALESMAN'인 사원번호(EMPNO),
-- 사원명(ENAME), 직책(JOB), 연봉(SAL)을 출력하세요
--myquery
SELECT empno, ename, job, sal
FROM emp
WHERE sal BETWEEN 2000 AND 3000
OR job = 'SALESMAN'; --"SALESMAN"은 ''로 쓰지않으면 오류나온다.
--정답
SELECT ename, job, sal
FROM emp
WHERE (sal >=2000 AND sal <= 3000)
OR (job = 'SALESMAN');
-- ex4) 부서번호가 10이 아닌 경우 처리.
--myquery
SELECT * FROM EMP e
WHERE deptno != 10;
--답
SELECT *
FROM EMP
WHERE DEPTNO !=10;
-- ex5) job이 CLERK가 아닌 데이터를 출력하세요.
--myquery
SELECT * FROM emp
WHERE job != 'CLERK';
--답
SELECT *
FROM EMP e
WHERE NOT (job = 'CLERK');
--ex6) comm이 null이 아닌 데이터를
-- [ename]과 [sal의 comm의 합산한 급여]로 출력하세요.
--myquery
SELECT ename,sal, comm, sal+comm "합산"
FROM emp
WHERE comm IS NOT NULL;
--답
SELECT ename, sal, comm, sal+comm "합산"
FROM EMP e
WHERE COMM IS NOT NULL;
--ex)7 comm이 null인 데이터 중
--ename과 sal + comm 합산 급여를 출력
SELECT ename, sal, comm, sal + comm
FROM emp
WHERE comm IS NULL;