-
22-09-06_jspmain 2022. 9. 6. 18:20
request를 주로 배우고있습니다.
req가 이루어질때, http에 따라 세가지가 생김 { Line (URL - 자원의 식별자, 행위에 대한 식별성은 들어가지 않고 자원의 식별성만 들어감 , Method (post, get..., trace.. 내가 요청을 발생시키는 목적, 포장방식 등) // Header(들어가는 정보 두가지. 클라이언트가 의도해서 보내지는 않지만, 나에대한 정보, 요청에대한 정보, 편지봉투처럼. 이 안의 메타데이터 형식이 다양.... ) // Body : 의도적인 데이터, Contents - 보낼 게 없으면, 의도가 없으면 body가 필요 없기도 하다고... }
어제는 이 body를 server side에서 어떻게 사용하느냐... 하는걸 배움
method가 post라는건 편지에 내용이(contents)가 있는데, contents에도 종류가 있음, 텍스트, 그림, 동영상.... body라는 영역이 존재해서 그 안에 contents가 들어갈텐데... .... content-file이라는 헤더로 올려줌...
업로드 정책에 따라 파일의 크기가 제한이 될텐데... ?? what sir said..??
서버는 식당운영이랑 비슷하대. 손님이 오면 주문을 받는데, 주문은 디테일하게 받아야 된대. 그 주문의 구체적인 정보는 위 req의 세가지에 들어있음.
---
part,,,, body가 하나로 구성되느냐 여러 개로 쪼개지느냐..
parameter로 req가 전달되면, 기본적으로 string 문자형이고 하나로 구성함. 그 내용은 query string
그런데 multi-part형으로 데이터를 보낸다고 하면, body라는 영역이 여러개의 파트로 쪼개져있다는거...
1)몇개로쪼갤거냐 2)뭘 기준으로 part를 나눌거냐...
여기서 기억할 건. mutipart의 경우, 내용을 입력하지 않았더라도 input태그 같은게있으면 파트가 쪼개짐.
--> 실제 데이터가 입력된 part인지 아닌지를 식별할 수 있어야 함.
input tag가 6개라 part가 6개가 된다고 하면 각 part를 다 객체화 해서 넣어야 함.
part api....
part를 가지고 놀려면 part라는 객체.. ... ...?가 필요.. servlet3점대면 part api가 있는데 , 필드에서 servlet2.0대이면.... part api자체가 없을 수 있다고..
이 때 file item이라는 객체가있는데, 이걸 대신 쓰면 되고, 이걸 쓸 때는 lib가 필요.
어제 추가해서 뭐 했었음.
오늘은 일단 진도를 멈추고 우리가 여태 했던 req를 뜯어보고 더 살펴볼 수 있었던 예제들을 보겠다.
req의 header와 res의 header를 어케쓰는지..
calander예제를 보고...
marshall????무슨 구조를 보자고...
-------------
두개는 같은 방식으로 클래스를 가져옴... getField하면 안가져옴 System.out.println 해도 안나옴. 왜냐면 저건 public field만 가져온다는 제약이 있기 때문임 getDeclaredField 하면 가져옴 지금 우리는..reflection의 첫 단계로 얘가 어떤 field를 가지고 있는지 찾아낸거래...
이렇게 하니까...fldName 출력해보니까 Map의 key값과 field 이름이 같음... setAccesible로 접근 가능하게 했는데..... set에서 객체랑 value달라함 reflection은 한가지 전제조건이 있는데, 불확실성을 기반으로 함. 알지 못하는걸 기반으로 추출을 하는거라서 언제든지 예외가 발생할 수 있는 구조를 가지고 있다고 함.
그래서 try로 감싸야 하는데, illegalargument... 뜨게 됨 그래서.... illegalaccess도 뭐...
map이 가진 property를 그대로 복사해왔다고... getMethod는 또 public instance method만 가져옴... 이걸누르면 이르케 뭔가 추가됩니다 invoke를쓸건데 vo가 넘거가는 인자임..
자 뭔지는 모르겠지만 잘 복사가 되었다 뭐ㅓㄹ...뭘 복사한대 또뭔가를했네.. 직렬화...?......를.....
여기에 reflectionTest.jar를 넣고 add to BuildPath mem_hp를 ....휴대폰 번호를 바꿔보자... reflection을 통해 property를 찾아야 하고, 나한테 필요한 property의 이름, 해당 property에 접근할 수 잇는.... 찾고...바꿔...
reflection의 전제조건은,....객체가 존재한다...
java bean 규약에 따라 정의된 한 객체의 한쌍의 accessor method(getter/setter)정보를 가진... IntrospectionException : 자바 빈 규약에 따라 (7가지) 만들어지지 않았을 때 발생하는 exception..
Read -> getter / writer ->setter reflection을 이해를 못하면 나중에 수업을 못따라가서..api미리..보는거라고...
Marshalling / UnMarshalling
json / xml 왜쓸까 - 서로 다른 시스템을 가지고 있는데, 그 시스템 간에 메세지 교환을 해야 하는데, 한 쪽에만 맞는 메세지, 시스템을 고수하면 커뮤니케이션이 안되서 양쪽에 공통데이터 표현방식을 써야 하는데 크게 이 두가지가 있는 거임
근데 왜 두개가 필요하지
한놈이 단점이 있어서 다음놈이 나왔겠지?
예전에는 xml많이 썼는데, .... 이거 다 불편하져 : 하지 말라는게 많음. 제약조건이 많음. xml schema가 전제조건임. db...에 데이터 넣을때도 보면 제약조건, 타입, 이거저거 많음. 이게 schema인데..xml도 똑같은 구조를 가지고 있다는 거...
제약조건, 길이, 타입 등에 안 맞는걸 쓰면 막힌다고 함.
그래서 xml 단점은..
1) 제약조건이 많아서 표현방법이 까다로움
2) tag가 사용됨.
빨간줄 두놈만써야되는데 잔뜩들어감. 테이블이 무거워진다고 함. 쓰잘데기 없는걸 많이씀...
json
//경량 데이터 교환 방식..?......
근데 json도 단점이 있음. scheme 구조가 없어서, 내가 원하는 형태의 구조가 아닌 잘못된 형태의 구조로 데이터가 넘어올 수 있음. xml이 나빠서 안쓴다가 아니라, 각각의 표현방식이 가진 장단점이 있어서 그에 맞게 쓴다는거지...
Marshalling : native data -> JSON / xml로 바꾸는 과정
UnMarshalling : JSON / xml -> native data로 바꾸는 과정
ex) 내가 가진 데이터가 C면 이걸 marshalling해서 보내면 그걸 받아서 java구조로 unmarshalling 함..
데이터를 보낸다고 할때..
Network을 타고 전달될 수 있는데이터는 0,1로 표현된 데이터뿐임.
Serialization (직렬화) : 0, 1의 집합으로 데이터를 표현하는것....
DeSerialization... 해서 그 후에 unmarshalling...
Serialization : 전송이나 저장을 목적으로 객체의 상태를 byte array(bit stream)로 변환하는 과정.
* DeSerialization : byte array(bit stream)으로부터 객체의 상태를 복원하는 과정native data -> marshalling --> serialization --전송--> deserialization -->unmarshalling --> 데이터 가공
* native data -> JSON/XML -> byte array -> JSON/XML -> native data
* Marshalling Serialization Deserialization UnMarshalling
*
*
* native data <- JSON/XML <- byte array <- JSON/XML <- native data
* UnMarshalling DeSerialization serialization Marshalling
*음 우리도 모르는새 이걸 계속 하고있었대요. ajax.. js...java 하면서...
얘는 byte Stream, 2차 스트림이면서 얘를 이용해서 직렬화를 할수있대 checked exception을 uncheceked exeption으로 바꿈., throw가 있어도 없는것처럼 동작한다고? NotSerializable Exception . 직렬화가 안된대. TestVO 뒤에 implements Serializable 이거 써줘야 됨 이제 뭔가 됨. 직렬화래 역직렬화를할거래..
이런 파일을 만들었는데 읽을수없는데이터임 역직렬화 코드를짜고있는데...
뭔가하는중임 뭔가나옴 아까만든 dat파일 일단 지울것
transient 넣어서 일단 얘는 예외처리할거고.. deserialize 하고 serialize 해서 처리했는데, prop2는 아까 transient 처리해서 안나옴(null로나옴)) 우리 나중에 Spring 할 떄 GSON안쓰고 JACKSON? 쓸거니까 그거 쓸거래
Jackson을 받을거에요...Main Portal page for the Jackson project - GitHub 이 세개의 링크가 필요한데 https://github.com/FasterXML/jackson-databind
GitHub - FasterXML/jackson-databind: General data-binding package for Jackson (2.x): works on streaming API (core) implementatio
General data-binding package for Jackson (2.x): works on streaming API (core) implementation(s) - GitHub - FasterXML/jackson-databind: General data-binding package for Jackson (2.x): works on strea...
github.com
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/
Central Repository: com/fasterxml/jackson/core/jackson-databind
repo1.maven.org
2.13.4 이게 일단 최신이래 ( https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.13.4/)
이거 세개를 받아야 함 lib에 넣고 add to build path 해 줌 세개 다. 아우 이런거 다 해주래요
이제 볼 수 있는데
이렇게 나오는데 설명에 보면 POJOs는 java bean이라는거임 그러니깐 JSON에 의해 읽고 쓰는걸 지원한다 == marshalling, unmarshalling을 지원한다는거...
찝찝하게 에러나져 나머지 두놈도 필요한거임... https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.13.4/
Central Repository: com/fasterxml/jackson/core/jackson-core/2.13.4
repo1.maven.org
여기서 똑같이 javadoc, saource, jar파일 다운...
https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.13.4/
Central Repository: com/fasterxml/jackson/core/jackson-annotations/2.13.4
repo1.maven.org
여기서 또,....
다시 죄다 lib에 넣고 add to build path .writerWithDefaultPrettyPrinter() 중간에 얘를 추가해주면 좀더 예쁘게 나온대 저거 저놈가지고 하는데 TestVO [prop1=Value1, prop2=Value2] 이게 console에 복원된 걸 볼 수 있다. 근데 prop2는 안하게 처리했는데 되네 뭐지?
transient는 marshalling에서 보호해주지는 않음. serialization만 보호해줌. 그래서 우리는 annotation이 하나 필요함 package kr.or.ddit.object; import java.io.Serializable; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonIgnore; public class TestVO implements Serializable { /*implements Serializable*/ private String prop1; @JsonIgnore private transient String prop2; public String getProp1() { return prop1; } public void setProp1(String prop1) { this.prop1 = prop1; } //이런 식으로 메서드 이름이 같고 파라미터만 다르다고 하면, 이걸 처리하려면 가변형파라미터를 처리하는게 필요함.. public void setProp1(String prop1, int tmp) { this.prop1 = prop1; } public String getProp2() { return prop2; } public void setProp2(String prop2) { this.prop2 = prop2; } @Override public int hashCode() { return Objects.hash(prop1, prop2); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TestVO other = (TestVO) obj; return Objects.equals(prop1, other.prop1) && Objects.equals(prop2, other.prop2); } @Override public String toString() { return "TestVO [prop1=" + prop1 + ", prop2=" + prop2 + "]"; } }
package kr.or.ddit.object.marshalling; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import com.fasterxml.jackson.databind.ObjectMapper; import kr.or.ddit.object.TestVO; /** * * Marshalling / UnMarshalling * * json / xml 왜쓸까? - 이기종 시스템간 메시지 교환시 사용되는 공통 데이터 표현 방식 * * Marshalling : native data -> JSON / xml로 바꾸는 과정 * UnMarshalling : JSON / xml -> native data로 바꾸는 과정 * * Serialization : 전송이나 저장을 목적으로 객체의 상태를 byte array(bit stream)로 변환하는 과정. * DeSerialization : byte array(bit stream)으로부터 객체의 상태를 복원하는 과정 * * * native data -> JSON/XML -> byte array -> JSON/XML -> native data * Marshalling Serialization Deserialization UnMarshalling * * * native data <- JSON/XML <- byte array <- JSON/XML <- native data * UnMarshalling DeSerialization serialization Marshalling * */ public class JSONMarshallingDesc { public static void main(String[] args) throws IOException { TestVO vo = new TestVO(); vo.setProp1("Value1"); vo.setProp2("Value2"); // serialize(vo); // deSerialize(); String json = marshalling(vo); TestVO vo2 = unMarshalling(json, TestVO.class); /* String json2 = "{\r\n" + " \"prop1\" : \"Value1\",\r\n" + " \"prop2\" : \"Value2\"\r\n" + "}\r\n" + "";*/ //System.out.println(vo2); transfer(vo); } private static void transfer(Object target) { String json = marshalling(target); serialize(json); } private static <T> T unMarshalling(String json, Class<T> javaType) { try { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(json, javaType); }catch(IOException e){ throw new RuntimeException(e); } } private static String marshalling(Object target) { try { ObjectMapper mapper = new ObjectMapper(); String json = mapper .writerWithDefaultPrettyPrinter() .writeValueAsString(target); System.out.println(json); return json; }catch(IOException e) { throw new RuntimeException(e); } } //deserialize 하고 serialize 해서 처리했는데, prop2는 아까 transient 처리해서 콘솔에 null로 출력될 것 private static void deSerialize() { File objFile = new File("d:/contents","obj.dat"); try ( FileInputStream fis = new FileInputStream(objFile); ObjectInputStream ois = new ObjectInputStream(fis); ){ //DeSerialization Object obj = ois.readObject(); System.out.println(obj); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } } private static void serialize(Object target) { File objFile = new File("d:/contents","obj.dat"); try( FileOutputStream fos = new FileOutputStream(objFile); // ObjectOutputStream oos = new ObjectOutputStream(System.out); //system console에 뽑겠다. ObjectOutputStream oos = new ObjectOutputStream(fos); ){ oos.writeObject(target); }catch (IOException e) { throw new RuntimeException(e); //예외의 종류를 변경함. } } }
적는중입니다만
시발뭔가잘못했는데.... dat파일도 나오고 콘솔이 근데 출력이 한줄만나와야되는데 왜 두줄나와ㅣ https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/
Central Repository: com/fasterxml/jackson/dataformat/jackson-dataformat-xml
repo1.maven.org
저거 첫번쨰 들어가주고 jackson-dataformat-xml 이거 복사해주는데, 이게 artifact-id래 이걸 위에 사이트에 검색.. 맨윗놈 의존성 확인가능..어떤 버전 받아야되는지도 알수있대. 6.3.1누르고 시ㅏ발 들어와서 bundle새기다운로드 여기들어오래 여긴 의존성 없으니까 안받아도 되는데 의존성 있을때마다 받으래요
시발...ㅠ
json--을 복사해서 xml--로 만든다
이거 두개만 바꿔주면 똑같대... DOM Tree구조에서 최상위 루트의 이름을 결정해줘야해서 JSONMarshalling과 XmlMarshalling의 차이는....
의도적으로 이름을 바꿀수있다고?
이 어노테이션을 추가해주면 되는데, 일단 얘는 value가 없으니까 single value annotation으로는 못쓰고...
이렇게 이름을 바꿔주면 이렇게 바뀐다... 이것도 된대 syso도 살려주세요 jesus christ... what do I listening....
출력스트림... 'main' 카테고리의 다른 글
22-09-07_jsp(1) (0) 2022.09.07 22-08-29_python (0) 2022.09.06 22-09-06_파이썬 (0) 2022.09.06 살려주세요 (0) 2022.09.05 220905_파이썬 (0) 2022.09.05