-
22-09-23_jsp(1)main 2022. 9. 23. 12:18
오늘수업의 목표 . 정시에끝내기
---
3 tier부터 가자
경우에 따라 DB가 여러개 tier로쪼개 질 수도 있다.
그래서 3 tier 가 아니라 n - tier 일 수 있다는 것
중요한 건 pear와 pear 사이에 데이터가 어떻게 이동되느냐.
---FTP와 server 사이에선
FTP는 file server가 되고 server는 file client가 된다. 그러면 여기선 FTP라는 통신방식이 사용될거고
DB와의 통신에서는 정해진 프로토콜이 없어서 driver라는걸 사용
--
프레임워크들 사용 위해 개발 환경 어떻게 바꿔야 하는가.
cient로부터 http라는 요청 발생하면, C.L가 받고.
MemberInsertServlet에서는 client가 보내준 데이터를 validate 메서드가 검증 해 줌.
Hiberate Validate라는 방법으 ㄹ쓸거임. 그러면 검증이 이쪽으로 분담이 빠져서 controller 부담이 줄음.
HV는 도메인 기반의 검증 레이어
DL (도메인 레이어, VO) 이 DB의 scheme 반영해왔는데
constrict, relation은 아직 반영 안했지만, HV쓰면 반영가능.
두번째 쓰게 될 framework는
우리가 반영 못한 relation 반영 위해
Lombok이라는 framework 쓸 것.
DL구현할 때 어렵진 않지만 귀찮은게, java bean 규약에 의해 정해진 형식이 있어서, 데이터가 추가되거나 빠지거나 하면 tostring이라 eqaul이라 다 하나하나 바꿔줘야 하는데 Lombok쓰면 이런 게 편하게 관리됨.
PL 데이터 받음
MemberDAOImpl. 메서드는 몇 개 없지만, 메서드 코드들이 길음.
- 나중에 필드에서 클래스마다 100줄미만임.. 그만큼 분담이 나뉘어있다는 것.
sqlMapper (dao->db)
dataMapper (db->dao)
처음에 mybnatis쓰면 dao구현체 자체가 없어지고
나중에 ??쓰면 dao 자체가 없어질 수도 있음
framework의 틀을 만족시키면 편하게 쓰는데, 처음엔 적응이 낯설 수 ㄴ있음
P.L은 raw data니까 BLL에서 처리해주어야 함. raw data 가져와서
CL에서 modeling된 객체를 넘김.
이만큼이 modeller
이제 CL에서 VL에 가야 함.
MemberViewServlet
인코딩하고
제일 마지막에 view를 선택. 경우에따라 reidirect, forward
(뷰를 선택하고 뷰에 가야하는 과정은 다 똑같음)
-모든 코드의 종류, 들어가는 코드가 같다.
--
CRUD 처리할 떄, CRUD 처리하는 만큼 컨트롤러가 필요한 것....
그런데 처음과 마지막에 다 같은 코드를 가짐.
이 중복을 제거하는 방법은?
--
controller가 열개 뭐 이렇게 되면...
앞단에 지금까지는ㄴ 컨트롤러가... 갸 ㅇ있었는데
그 컨트롤러들 앞에 front controller라는걸 세워서, 반복되는 요청은 거기서 처리하고
이 f.c를 지나서 back단위의 controller로 넘어감
(Front Conroller Pattern), 이걸 지원하는 프레임워크가 SPRING
--
처음에는 SPRING과 같은 구조의 framework를 만들어보자 했는데, 일단은 시간 안에 어려울 것 같고 SPRING을 많이 써보자
--
지금 우리 template.jsp 사용해서 응답 보여주고있는데, 이런 걸
composit view, (이걸 통해서 응답 데이터 보내는게 composit view pattern)
Tyles??????
--
E.L사용해보니 null문자를 해결해 줬는데, 그 외에ㅐ 다른 장점들도 있으.
jsp. script도 뭐도 원하는거 다 쓸 수 있음. 그러다보니 가독성 떨어짐
이를 해결하는게 custom tag라는 구조
우리 template.jsp 보면
<jsp:include>라는 actioin tag, 이건 사실 server side tag
그냥 단순한 tag처럼 보임
가독성 떨어지는 문제 해결하는데 사용 : JSTL? scriptlet 구조가 다 없어짐
----
오늘 수업은 일단 이런 framework들의 jar파일을 어떻게 쉽게 가져올건가. 그래서 MAVEN이라는걸 사용해보자.
--
일단 CRUD 끝내고 하자
이 코스트를 해결하는 desing pattern도 사용해보자.... 나중에는..
--
memberView.jsp - 실제 상세조회 페이지는 여기서 만들어지지만
memberList.jsp - 위에 대한 작업은 여기의 버튼에서 이루어짐.
update 기능을 만들자면, 새로 폼을 또 하나 만들어야 하나? ㄴㄴ
여기 action이 없음. 그러면 어떻게 타고 왔느냐에 따라서 어떻게 사용될지 결정됨
- 같이 사용하려면,
이 내용에 대한 공통성?이?필요?
----
memberList.jsp에서
<button type="button" class="btn btn-secondary" id="updateBtn">UPDATE</button> <button type="button" class="btn btn-danger" id="deleteBtn">DELETE</button>
두버튼은 모두 한 사람의 정보에 대한 핸들링. 같은 처리를 가짐.
<form id="deleteForm" action="<%=request.getContextPath()%>/member/memberDelete.do" method="post"> <input type="hidden" name="who" /> </form> <form id="updateForm" action="<%=request.getContextPath()%>/member/memberUpdate.do"> <input type="hidden" name="who" /> </form>
form도 유사.
정규편식
find AND\s+MEM_(\s+)=\s*:V\d+ () 그룹 인덱스...칠환할땐 $이용 replace with , MEM_$1 = ?
properties에..... 날짜형식처럼 반복되는거 따로 빼놓고 쓰면...편안.... 코드를 바꿔야 될 때 수정이 편안....
$(":input:not")
$(":input:not(.editable)")
<script type ="text/javascript"> $(":input:not(.editable)").prop("readonly",true) </script>
--
--
TemplateClass : 추상클래스 -> 인스턴스 생성 불가
derivedClass쪽 화살표 : 상속관계...
이걸 클래스로 만들면 아래와 같다.
패키지 구성 아래는 소스코드
--
package kr.or.ddit.designpattern.templatemethod.example1; public abstract class TemplateClass { public final void template() { stepOne(); stepTwo(); stepThree(); } //얘는 추상메서드 아님 private void stepOne() { System.out.println("1단계"); } //얘는 추상메서드임, body 없음 protected abstract void stepTwo(); //얘도 추상메서드 아님 private void stepThree() { System.out.println("3단계"); } }
package kr.or.ddit.designpattern.templatemethod.example1; public class DerivedClass1 extends TemplateClass { @Override protected void stepTwo() { System.out.println("2단계의 case1"); } }
package kr.or.ddit.designpattern.templatemethod.example1; public class DerivedClass2 extends TemplateClass { @Override protected void stepTwo() { System.out.println("2단계의 case2"); } }
package kr.or.ddit.designpattern.templatemethod; import kr.or.ddit.designpattern.templatemethod.example1.DerivedClass1; import kr.or.ddit.designpattern.templatemethod.example1.DerivedClass2; import kr.or.ddit.designpattern.templatemethod.example1.TemplateClass; public class Example1Ground { public static void main(String[] args) { TemplateClass[] array = new TemplateClass[] { new DerivedClass1() , new DerivedClass2() }; for(TemplateClass obj : array) { obj.template(); } } }
일정한 순서와 단계별로 동작해야하는게 있는데,
그 안에 세부적인 작업만 다 다른 경우
파생되는 가능성의 형태를 만들어 주어야 함.
이거랑 아까 우리가 만든 dao를 비교해보자.
연결, query객체 생성, query실행, 실행결과 가져오기. 안바뀜. 이렇게 작업단계 4단계는 정해져 있는데
어떤 query를 실행할지, 어떤 parameter를 넣을지, 결과 가져와서 어떻게 처리할지. 이 부분들은 다름.
반복되는 것들이 있음.
그래서 우리 dao가 가진 문제를 해결하기에 가장 좋은게 이 template pattern임.
ibatis도 이 pattern으로 만들은 것.
---
우리 먼저, 순서를 정의하는게 필요.
--
위와 같은 구성으로
우리가 그동안 그냥 써 왔던 framework인 ibatis 중에 sqlMapClient 예제를 한번 만들어서 어떻게 동작하는지 호가인해보자
package kr.or.ddit.designpattern.templatemethod.example2; public abstract class SqlMapClient { public final void queryForObject(String id, Object param, Class<?> resultClass) { connect(); String query = statement(id); String result = executeQuery(query, param); handleResult(result, resultClass); } private void connect() { System.out.println("연결수립"); } private String statement(String id) { return id+"아이디의 쿼리 객체 생성 및 반환"; } private String executeQuery(String stmt, Object param){ return stmt + "를 실행할때, 파라미터 "+param+" 설정했음."; } //추상메서드 void 안하면 reflection까지 가야해서 너무 난이도가 올라갈듯하니 void 하자 protected abstract void handleResult(String result, Class<?> resultClass); }
ibatis 안에서도 연결수립, 쿼리객체생성, 파라미터 주고... 다 하고 있었음. 다만 내가 하는게 아니라 ibatis가 대신 해 주고 잇었음.
이런 걸 미리 정의된 집합이라고 해서 framework라고 함
--
MAVEN
MAVEN은 프로젝트를 관리해주는 툴입니다 이걸 다운받을거예요 다운받으면 이렇게 되고 경로 copy해서 환경설정을 해 줄 것. 환경설정 setting하자
sysdm.spl을 검색해서 들어가자.
메이븐이 2버전 3버전 이름을 다르게 설정해야 함
M2_HOME로 인식하는 버전이 있고
MAVEN_HOME으로 인식하는 버전이 있어서, 둘다 인식하도록 아래처럼 설정해주자
MAVEN_HOME으로 인식하는 경우 M2_HOME으로 이동하도록 경로 설정 path 편집해줍니다. 이제 윈도우 커맨드 창을 열어서 잘 설치 되었는지 확인해 줍니다.
설치 잘 되었는지 cmd창에서 확인
---
PMD 는
정적 테스트 (JUnit은 동적테스트였잖) 제공
(sysout 제일 많이 잡아줌) -> 그러면 디버깅을 못하나? ㄴㄴ debug 툴 있으니까 가능
이제 pdf파일을열어봅시다 .
애플리케이션배포_통합본.pdf
----
빌드... 프로젝트 개발하고 하는 모든 과정을 얘기하는건데요
문제가 있음.
- 문제1 - 정형화된 개발환경이 필요함
ex) WebStudy01 만들 때 res, lib....... context 다 분리해줌... 아주복잡함
할 순 있는데 귀찮은거지......
프로젝트 하나를 개발하려고 해도, 여럿이 모여서 개발하려면 공통적으로 사용할 수 있는 툴이 필요함.
MAVEN이 이 작업을 대신 해 줘서
메이븐의 기능1 - template projerct를 제공한다.
문제2 - 다양한 라이브러리에 의존성, jar파일이 많이 필요함. 우리 수동으로 일일히 추가해줬음.
MAVEN이용하면 자동으로 처리해줌
메이븐의 기능2 - 의존성 관리 기능
메이븐의 기능 3 - 코드 품질관리, 결함 관리 == test 기능 제공,
: 메이븐을 사용하면 테스트가 쉬워진다는거지
: 한꺼번에 테스트 할 때 test swift????를 MAVEN이 한번에 묶어서 통합테스트를 진행해줌.
==> 프로젝트 시작부터 MAVEN이 다 관리해줘서, 얘를 '빌드 관리 툴'이라고 함.
-
소스만들면 클래스만들고
컴파일하고
테스트하고....
빌드라는 과정 내의 세부적인 작업과정...
메이븐은 전체 빌드를 통으로 관리하지 않고, 세부적인 과정 하나하나로 쪼개서 관리하는데
그 세부적인 과정을 각 'Phase' 라고 함
그리고 그 phase를 plugin으로 지원함.
1) 소스 개발 phase
2) 만든 소스 컴파일phase
3) 컴파일 된 결과물 테스트하는 phase
...
그걸 도식화 한 그림이
노랑색 사각박스가 phase, 초록색 사각박스가 plugin...
세부적인 내용은 이 pdf에 저장되어있으니까 읽어보세용
--
이제 maven 설정해줄거임.
window-preference-'maven' 검색해서 installation 들어가서, 현재 embeded로 설정되어있지만 버전이 너무 낮죠. 새로 add해줍시다. directyry 설정해서 maven 저장된 폴더 경로를 설정해주고 finish 해줌 새로 추가된걸 chec하고 apply 이제 user_setting할것 메이븐에게 저장소라는 개념이 있어서 우리가 사용하는 소스나 이런 것들을 관리한다고 하면, 저장소 필요
central repository 라고 함 중앙저장소....
그러면 중앙저장소에서 우리가 필요한 걸 가져와서 저장하는 저장소 필요 local repository
maven은 mart를 이용하는거랑 비슷함. mart에서 shopping하고 와서 냉장고에 넣어두는 것 처럼
중앙저장소(mart)는 우리 소관이 아니지만 local repository(냉장고)는 우리가 설정해야.
User setting 해야 하는 이유
---
파일 finish했으면 open file 해줌
--이런 파일이 열림
--아래에서 세팅해줌
세팅에보면 local-repositary 설정을 해 줄거예요. 사용자 저장공간에 저장되는데, 한글이름인 user면 에러가 날 수도 있으니 주의 이제 repository 설정되어서 local rep에 plugin들 다운받아옴 --
이제다시 wondow-preference 가서 local repository경로를 reindex 해줌 --
maven project crtl+new로 설정하고 맨 위에 check box 체크하시고요 이렇게 해보고요 --
template 만들고 template 관리하기 위한 plugin들을 central repository에서 계속 가져오는 것
m 붙은것, maven으로 관리됨, test,main도 쪼개줌 wabapp 없음
java version 너무 낮네? 적어도 1.8버젼은 되어야 함.
그러면 이제 phase와 plugin필요
throws 하려고 해도 버전이 낮아서 안 됨. 이게 문제임. pom == project object model, 하나의 프로젝트를 객체화 시켜 둔 모델.
(DOM 처럼)
하나의 프로젝트를 객체처럼 관리하고, 그걸 여기서 관리함. 여기 와서 보면, xml에 이렇게 설정이 되어 있다는 거지... maven의 실체란 이런 plugin 이런 것들인데... 이 plugin이 우리에게 안 맞는 버전을 갖고 있음. 재설정 해야. 아래처럼 pom.xml에서 수정해서 설정 해 주면 된다.
잘 정리되어서 찾아서 가져오면 됨.
groupId: 몇 번 코너, 몇 번 매대. 하는 것 처럼
artifactId : 제품명
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>kr.or.ddit</groupId> <artifactId>dummyMVN</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 설정 변경하고 싶으면 여기서 하면 됨 --> <build> <plugins> <plugin> <!-- 이제 중앙 저장소에서 필요한 것 가져와야 함.... --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
적용 이제 에러 안남 짠 근데 이걸 maven 을 하나하나 써야되면 아무도 안쓰겠져. 이걸 자동으로 해 주는걸 오후에 해봅시다.
'main' 카테고리의 다른 글
22-09-23_jsp(2) (0) 2022.09.23 정규식 편하게하는 라이브러리 (0) 2022.09.23 22-09-21_jsp(2) (0) 2022.09.21 22-09-21_jsp(1) (0) 2022.09.21 22-09-20_jsp (2) 2022.09.20