-
MVC 3 Tier,인터페이스정의서,AJAX-JSON사용,BLOB(image)JAVA 2021. 7. 25. 14:23
MVC - 3 Tier
3 Tier ( 3 layer architecture ) presentation : control, view business(logic) : service(인터페이스통신) dataservice : DAO common : VO 위 3개 항목이 common 소스들을 공통적으로 사용한다. business : 송-수신 관계의 시스템들이 통신하는 인터페이스들의 영역.
presentation 과 business 가 함께 존재시 서버에 과부하가 올 수도 있다.
그래서 이 둘을 서버를 더 생성하여 서로 다른 서버에 두는 방식이 있는데 이것이 웹 서비스 이다.
지금까지는 축소형 MVC 사용중이였다.
: control view DAO VO
http://dawoonjeong.com/mvc-vs-3tier/
인터페이스 데이터 통신 (송신, 전달, 수신 모두 인터페이스라 칭한다.)
- 시스템 인터페이스 정의서
예를들어 재고관리 인터페이스라고 설정하자면..
1. 인터페이스 목록 1) 송신( 판매시스템 ) 인터페이스번호 : 이 활동에 대한 임위의 번호 지정 일련번호 : 인터페이스번호에 따른 활동이 여러개일 수 있으니 일련번호를 순차적으로 넣어 구분하는듯 하다. 송신시스템명 : 판매시스템 프로그램ID : 해당 판매시스템의 ID 2) 전달 처리형태 : 인터페이스 방식 : URL 호출 ( HTTP형식 ) 발생빈도 : 수시 3) 수신( 재고시스템 ) 상대 담당자 확인 : 미리 정해놓은 담당자의 문자기입 프로그램ID : 해당 재고시스템의 ID 수신시스템명 : 재고시스템 수신번호 : 4) 관련요구사항ID 사용자 요구 사항 : 계약한 상대방 측에 제대로 요구사항을 받아 도장찍어 확정받고 그 요구사항서 번호를 기입한다. 2. 인터페이스 명세 1) 인터페이스번호 : 위 목록을 연결하는 같은 번호 2) 데이터 송신 시스템 : 판매시스템, 전달하는 데이터를 기입(DB항목) 3) 데이터 수신 시스템 : 전달받는 데이터와 매칭되는 데이터를 기입(DB항목) ex) 송신 시스템 데이터 = 상품번호(char)
수신 시스템 데이터 = 상품번호(char) , 재고량(int)
송신시스템이 상품번호데이터를 주고 재고량데이터를 달라고 요청한 것이고,
수신 시스템이 상품번호데이터를 살펴 재고량데이터를 주는 것이다.외부 모듈 : 타회사의 시스템이다. 시스템끼리 소통할 때 이 시스템을, 외부 모듈이라고 칭한다.
내부 모듈 : 내가 다니는 회사의 시스템으로 직접 다룰 수 있는 시스템이다.
이 상황에서 내가 제조사라 송신시스템을 다루고 있고, 판매회사와 주고받는 입장이라면
송신시스템이 내부모듈 수신시스템이 외부모듈이다.
AJAX
데이터 비동기식 : XML, AJAX(XML파생) 이 가장 대표적이다
동기 : 데이터를 가지고 올 때 기존페이지가 작동을 멈추며 화면을 초기화 시킨다. 그리고 그대로 순서대로 코드를 진행시킨다.
비동기 : 데이터를 가지고 오는 동안 기존 페이지가 작동을 멈추지 않아, 화면을 유지한 채 데이터를 가져올 수 있다. 순서가 없어 문제점이 있을 수 있다. ( 이럴 땐 콜백함수 방법을 써야 한다. )
$.ajax(); // 그냥 $ 변수의 ajax() 라는 메서드를 사용한다고 생각하면 된다. // 자바로 보면 아래처럼 A $ = new A(); $.m();
JSON "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 클래스 없이 객체를 만들 수 있다. 장점 : 만들기 쉬움 단점 : 설계도인 클래스가 없으므로 만들때마다 다시 똑같이 만들어야함 JS 에는 객체 + 비객체 지향이 섞여 있다.
비객체지향 : 메서드가 객체없이 독립적으로 사용가능하다.
var h = function(){}; h(); // 메서드 즉, 행동 자체가 독립적일 수 있다. function h(){} // 위와 똑같은 상황이며 마치 C언어 같이 행동이 독립적이다. // ajax 의 객체생성(javascript가 근원이다) $.ajax({}); // {} 가 생성문구 // java 는 new 생성자. var 한학생 = {성명:"철수" , 번호 : 1 } // 이걸 JSON 이라고 부른다. JavaScript Object Notation //예시 var z = function(){} var p = {url:"", success:z, type:"", dataType:"json", } $.ajax(p) // 위 아래 동일한 결과로, 객체를 ajax() 메서드안에 바로 생성하는 방법인 2번째 것을 쓴다. $.ajax({url:"", success:function(){}, type:"", dataType:"json", })
>> 송신측
// ajax 에 넣는 JSON 대표 속성 예시. 수신측이랑 연결하는 메서드 $.ajax({url: "http://localhost:8090/재고시스템/판매예정상품재고량조회.jsp", success:function(result){ alert("상품재고수량은 "+ result.재고량); alert(status); }, type:"POST", dataType:"json", contentType:"text/plain; charset=utf-8", data :JSON.stringify({상품번호:"pno"}) // data :JSON.stringify({상품번호:$("#pno1").val()}) 같은 결과 });
url : 수신 측이 외부시스템이니 풀주소로 요청, html을 받아온다는게 아니고 그 안의 데이터들을 return 해옴 success : result = 수신측에서 보낸 JSON 객체이므로 그 객체의 속성명을 사용해 속성값을 얻어낸 것이다.
status = ajax가 송수신 측 통신이 잘되었는지 결과를 저장한 변수type : url 의 method 지정 dataType : return 데이터타입 (요청 받아오는 애 타입, result 의 타입이다. )
가져오는 측에서 보니까 sendJSONObject 라고 보냈음. 즉 JSON 객체로 저장한 데이터를 가져오는 거니까 dataType 이 json 인 것이다.contentType : 현재 ajax() 로 요청보낼 때의 타입 data : 수신 측에 보내는 데이터로, 이 데이터에 맞는 데이터를 수신측에서 get 하여 put 으로 결과를 보내는 것이다.
JSON.stringify() 은 JSON 표기법으로 해서(var o = {키:값}) 매개값을 문자열로 보낸다는 의미 // key들 보면 " " 없다!(헷갈려하지 말자)
= "{상품번호:\"pno1\"}" 이렇게 전체를 JSON 객체인 문자열로 보낸다.
여기서 "pno" 는 $("#pno").val() 과 똑같음.>> 수신측
<% request.setCharacterEncoding("utf-8"); // 클라이언트(송신측) 에 받는 값을 utf-8 형태로 바꾼다. BufferedReader reader = request.getReader(); JSONObject receiveJSONObject = new JSONObject(reader.readLine()); String 상품번호 = receiveJSONObject.getString("상품번호"); // 받은 상품번호로 DB 에서 where 조건문에 대입하여 재고량 데이터를 가져왔다 치고 JSONObject sendJSONObject = new JSONObject(); sendJSONObject.put("상품번호", 상품번호); sendJSONObject.put("재고량", 재고량); // 넘길값을 sendJSONObject 에 넣는다. response.setCharacterEncoding("utf-8"); // 클라이언트(송신측) 에 보낼 값을 utf-8 형태로 바꾼다. out.print(sendJSONObject.toString()); %>
BufferedReader reader = request.getReader(); : request 가 들어온 데이터를 reader에게 넘김 JSONObject receiveJSONObject = new JSONObject(reader.readLine());
// 송신측에서 문자열로 (JSON.stringify()) 변환하여 보내서 읽어지는 것이다.String 상품번호 = receiveJSONObject.getString("상품번호");
// 송신측에서 보낸 data 를 받는다.out.print(sendJSONObject.toString());
// out 이라는 내장객체가 송신측에 print 즉 , 출력하는데
// 그 값은 매개의 sendJSONObject 가 다시 String형태 JSON표기법으로 변형한 값이다.>> 수신측이 받은 값
board : MVC 3 Tier (ajax 활용)
이진데이터?
char 도 아니고 int 도 아닌 둘의 속성을 섞은 데이터
모든 데이터들은 이진데이터로 할 수 있으며 이진데이터를 보낼 수 있는 JSON 에는 image를 넣거나 동영상을 넣는 등
여러가지가 가능함.
>> Member.java (blob 추가)
import com.mysql.cj.jdbc.Blob; public class Member { private int no; private String name; Blob profile; private String post; private String address; private String detailaddress; private String tel; private String email; private String id; private String password; private Date rdate; private String state; private String size; // setter, getter 부분
>> MemberDAO.java
save 메서드에 Member의 추가한 멤버변수도 추가(sql 문에도 profile 추가, statement의 setBlob()로 추가)
public void save(Member member) { try { Connection c = ConnectionUtil.getConnection(); PreparedStatement pre = c.prepareStatement("insert into 회원(name,profile,post,address,detailaddress,tel,email,id,password) values(?,?,?,?,?,?,?,?)"); pre.setString(1, member.getName()); pre.setBlob(2, member.getProfile()); pre.setString(2, member.getPost()); pre.setString(3, member.getAddress()); pre.setString(4, member.getDetailaddress()); pre.setString(6, member.getTel()); pre.setString(5, member.getEmail()); pre.setString(7, member.getId()); pre.setString(8, member.getPassword()); pre.executeUpdate(); pre.close(); c.close(); } catch (Exception e) { e.printStackTrace(); } }
이미지 선택버튼 눌러 첨부시 화면에 뜨게 하기
<body> <input type="file" id="myfile" /> <img id="myimg" /> <script> function 그림파일읽어출력하기(이벤트) { var 그림파일 = 이벤트.target.files[0]; if (!그림파일.type.match('image.*')) { alert("욱! 그림이 아니예요!"); } var 파일리더 = new FileReader(); 파일리더.onload = function(한그림파일) { var myimg=document.getElementById("myimg"); myimg.src=한그림파일.currentTarget.result; }; 파일리더.readAsDataURL(그림파일); } document.getElementById('myfile').addEventListener('change', 그림파일읽어출력하기, false); </script> </body>
* img 태그에 addEventListener 로 input에서 넣은 값을 띄울 메서드를 만들어야한다. 1. 메서드의 매개변수에는 event 의 대상이 자동으로 객체화 되어있는데 이를 가져올 수 있다. (이름은 아무거나) 2. event 의 target 속성은 실제 이벤트가 발생된(클릭한) 대상을 의미한다.(자세한건 아래 1번 참조) 3. event.target.files 는 이벤트발생 대상에 파일들이 들어간 경우 사용하며, File 객체들의 배열인 FileList 를 생성한다.
files[0] 이면 첫번째 File 을 꺼내온다는 의미이다.4. File 에는 type 정보가 있으며 이를 match() 함수로 형식이 "image/*" 로 되있나 확인 (type정보는 3번 참조) 5. FileReader를 생성하여 파일을 읽는 메서드들(2번 참조)을 사용해
file을 읽고(=load) 다 읽으면 onload 이벤트가 발생하여
해당 이벤트를 발생된 대상은 스스로이므로 FileReader가 function() 의 매개값으로 들어간다.6. result 속성은 FileReader 가 메서드를 사용하여 읽고 저장한 정보값을 나타낸다. 7. input 태그에 addEventListener() 로 위 이벤트를 건다. 'JAVA' 카테고리의 다른 글
이미지업로드: inputStream,outputStream, cos.jar-MultipartRequest (0) 2021.07.25 ModelAndView (0) 2021.07.25 Servlet, 과도기 MVC (0) 2021.07.25 MVC모델2, JSTL (0) 2021.07.25 MVC모델이란 (0) 2021.07.25