JsonParser API

웹에서 가져온 Json 데이터를 읽어준다.

 

라이브러리 추가

maven repository에서 json을 찾아 pom.xml에 넣어준다.

<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
	<groupId>org.json</groupId>
	<artifactId>json</artifactId>
	<version>20211205</version>
</dependency>

 

 

JsonParser

JsonParser은 Json 데이터를 읽기만 가능합니다. next를 사용하면 "0" -> "id" ->"Category:\"Tomás Bote Lavado\", Conservatorio" 순서대로 " "안에 있는 내용을 읽습니다. 

https://docs.oracle.com/javaee/7/api/javax/json/stream/JsonParser.html

 

다양한 방법으로 Json을 파싱 해줍니다. String 문자열도 Json 데이터 규칙으로 이루어진 경우 파싱 해줍니다.

 

IMSLP에서 제공하는 Json 데이터

더보기

{
  "0"(키 값) : { ("0"의 값)
    "id" (키 값): "Category:\"Tomás Bote Lavado\", Conservatorio",( id의 값)
    "type": "1",
    "parent": "",
    "intvals": [
    ],
    "permlink": "https://imslp.org/wiki/Category:\"Tomás_Bote_Lavado\",_Conservatorio"
  },
  "1": {
    "id": "Category:.q, Wulfi",
    "type": "1",
    "parent": "",
    "intvals": [
    ],
    "permlink": "https://imslp.org/wiki/Category:.q,_Wulfi"
  },
 


"metadata": {
    "start": 0,
    "limit": 1000,
    "sortby": "id",
    "sortdirection": "ASC",
    "moreresultsavailable": true,
    "timestamp": 1641791992,
    "apiversion": 10
  }

}

 

 

private String testLink 
= "https://imslp.org/imslpscripts/API.ISCR.php?account=worklist/disclaimer=accepted/sort=id/type=1/start=0/retformat=json";


//웹에서 Json 데이터를 가져올 경우 URL을 통해 값을 전부 가져와 준다.
public String connectToIMSLP() throws Exception {
	// TODO Auto-generated method stub
	URL url = new URL(testlink);
	BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
	String result = bufferedReader.readLine();

	return result;
}

 

public ScoreMetaData scoreMetaDataExtract() throws Exception {
	
    // metadata 라는 키값을 받음
    JSONObject metadata = (JSONObject) parser().get("metadata");
	Map<String, String> map = (Map) metadata.clone();
   
   //키값안에 키값들
	String start = String.valueOf(map.get("start"));
	String limit = String.valueOf(map.get("limit"));
	String sortby = String.valueOf(map.get("sortby"));
	String sortdirection = String.valueOf(map.get("sortdirection"));
	String moreseltsavilable = String.valueOf(map.get("moreresultsavailable"));
	String timestamp = String.valueOf(map.get("timestamp"));
	String apiversion = String.valueOf(map.get("apiversion"));

	return new ScoreMetaData(Integer.valueOf(start), Integer.valueOf(limit), sortby, sortdirection,
			Boolean.valueOf(moreseltsavilable), Long.valueOf(timestamp), Integer.valueOf(apiversion));
}

// 이렇게 만들 필요는 없다.
private JSONObject parser() throws ParseException {
	
	JSONParser jsonParser = new JSONParser();
	JSONObject jsonObject = (JSONObject) jsonParser.parse("값");
    
    // jsonObject.size() => 매핑된 키값들의 사이즈를 반환해 줍니다.
	
    return jsonObject;
}

 

값 안에 있는 내용을 Map<key,value> 형태로 매핑됩니다.
 예) {key="0" : value ={ "id": "....", "key" : "value" ....}}
      {key="1" : value ={ " key " : " value " , ....}}
    

 

 

jsonObject.size() => 매핑된 키값들의 사이즈를 반환해 줍니다.

jsonObject.get("0") =>  을 한다면 예시에 있는 값 그대로 Map<key, value> 형식으로 반환해줍니다.

jsonObject.clone() => hashmap 을 반환해 줍니다.

JSONObject


위에 있는 코드에서 JSONObject를 사용했는데 Jsonparser은 데이터를 하나하나 읽는다면 JSON값을 매핑해준다.

읽은 값은 Object 값이나 Collection 또는 map으로 매핑된다.

 

private JSONObject parser() throws ParseException {
	JSONParser jsonParser = new JSONParser();
	JSONObject jsonObject = (JSONObject) jsonParser.parse(scoreOriginalList);
    
	return jsonObject;
}

 

 

https://docs.oracle.com/javaee/7/api/javax/json/JsonObject.html

 

스프링의 IoC 컨테이너 종류 중에서 가장 많이 사용되는 것이 WebApplication이다. 먼저 공부한 내용을 내가 이해한 내용을 정리하기에 앞서 IoC에 대해서 간략하게 정리하자면, 객체의 생명과 관리에 대한 제어권을 바뀐다는 의미이다. 

A라는 객체를 만드고 B에 대입한다면, B는 A에 의해 종속된다. 종속된다는 의미는 A의 동작이 바뀐다면 B의 동작도 같이 바뀌게 된다. 그렇기에 B의 동작이 유연하지가 않다. 스프링은 이러한 관계를 대신해준다. IoC컨테이너 관리하는 객체를 Bean이라고 부른다.

 

대충 이런 관계이지 않을까 싶다. 아직 공부가 부족해서 이러한 구조가 많은 것인지 잘 모르겠다.

그리고 솔직히 왜 IOC/DI가 좋다고들 하는데 지금으로써 나는 이론만 공부하고 있을 뿐이지 예제를 많이 구현해본 것이 아니라 좋은 건지 잘 모르겠다..ㅎㅎ

 

어쨌든 여러 가지 IoC컨테이너가 있는데 StaticApplicationContext, GenericApplicationContext 등이 있지만 주로 WebApplication을 사용한다.

 

IoC 계층구조 : 각자 독립적으로 자신이 관리하는 빈을 갖고있기는 하지만 DI를 위해 빈을 찾을 때는 부모 애플리케이션 콘텍스트의 빈까지 모두 검색한다.

중요한 건 자신의 부모 콘텍스트에게만 빈 검색을 요청하지 자식 콘텍스트에게는 요청하지 않는다는 점이다. 그런 이유로 같은 레벨에 있는 형제 콘텍스트의 빈도 찾을 수 없다.

 

오늘 공부한 내용을 간략하게 정리했지만 아직 코딩을 해보지 않아서 왜 좋은건지 잘 모르겠다.. 한번 해봐야겠다.

오후에 공부하다가 자꾸 매핑이 안돼서 어떻게 하면 매핑할 수 있을까 고민하다가 자기 전까지 생각 못했는데..

며칠 전 유튜브에서 잠깐 스쳐지나간 생각 때문에 컴퓨터 켜서 해보니 됐다.. 

 

src/main 폴더에 com.java.test란 패키지를 만들었는데 다른 패키지 구조인 com.java.controller안에 클래스를 만들어서 매핑하려고 시도했다.. 

유튜브에서는 꼭 처음만든 패키지 안에 패키지를 만들라고 했는데..

 

다음에 똑같은 실수를 하지 않기 위해서 적어두어야겠다..

토비의 스프링 3.1을 읽으면서 기억해두면 좋을 것 같은 내용이 있어서 적어 두어야겠다.

 

리팩토링 : 기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다.

리팩토링을 하게 된다면 코드 내부의 설계가 개선되어 코드를 이해하기 편해지고, 변화에 효울적으로 대응할 수 있다고 한다.

 

템플릿 메소드 패턴: 상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법이다.

변하지 않는 기능은 슈퍼클래스에 만들어두고 자주 변경되며 확장할 기능은 서브클래스에서 만들도록 해야한다고 한다.

슈퍼클래스에서는 미리 추상 메소드 또는 오버라이드 가능한 메소드를 정의해두고 이를 활용한다.

 

팩토리 메소드 패턴: 템플릿 메소드 패턴과 마찬가지로 상속을 통해 기능을 확장하게 하는 패턴이다. 구조도 비슷하다고 한다. 

 

개방 폐쇠 원칙: 깔끔한 설계를 위해 적용 가능한 객체지향 설계 원칙 중의 하나다. 간단히 정희하자면 클래스나 모듈은 확장에는 열려있어야 하고 변경에는 닫혀있어야 한다.

 

높은 응집도: 변경이 일어날 때 모듈의 많은 부분이 함께 바뀌면 응집도가 낮다고한다.

 

낮은 응집도: 높은 응집도와 반대로 관계 를 유지하는데 꼭 필요한 최소한의 방법만 간접적인 형태로 제공된다.

 

결합도: 하나의 오브젝트가 변경이 일어날 때에 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도

 

예를들어) 유저DAO클래스를 만들 때 유저DAO를 사용할 메소드(삽입, 삭제등 유저 데이터가 필요한 경우) 유저DAO에 데이터가 추가된다면 그 밑 하위 클래스들도 영향을 미친다. DB에 연결할 인터페이스를 만들고 DB 연결 기능을 구현한 클래스가 바뀌더라도 DAO는 바뀔 필요가 없다.

 

 

전략패턴: 자신의 기능 맥락에서, 필요에 따라 변경이 필요한 알고리즘을 인터페이스르 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 알고리즘 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴이다.

ORM이란, Object(객체)와 Relation( 관계형 데이터베이스) 간의 불일치 문제를 해결하기 위한 도구이다. 자바에서는 데이터 베이스 서버에 접속해서 쿼리를 수행하고 그 결과를 프로그램상에서 사용할 수 있도록 JDBC API를 제공한다.

 

 

Spring Data JPA

 

 

Spring Data JPA의 Repository 구조

 

 

 

오늘 스프링 부트를 공부하면서 알게 된 점은 

 

1. 스프링 부트는 jsp를 지원하지 않는다.

2. 동적 파일과 정적파일을 구분해야 한다.

3. @RestController는 리턴 값을 함수 정의 값으로 리턴 하지만, @Controller는 파일 경로를 리턴한다.

 


 

스프링 부트는 jsp를 지원하지 않는다.

 

스프링 부트는 jsp를 지원하지 않기에 따로 의존성을 부여하여야 한다. 스프링 프로젝트 파일을 처음 만들 때 선택할 수도 있고 pom.xml에서 이 의존성을 추가해주면 된다.

 


동적 파일과 정적파일을 구분해야 한다

 

스프링 프로젝트를 만들면 밑의 그림처럼 static과 templates가 생기는데 static은 정적 파일( HTML, CSS, IMG javascript)등 컴파일이 필요 없는 파일을 모아두는 곳이 있다.

static파일에 test.html을 만들고 /test url로 get 요청을 한다면 올바르게 요청을 받아드리는 것을 볼 수 있다.

그렇다면 동적 파일인 jsp를 요청하면 어떻게 될까?

 

JSP 요청

 

 

요청을 받아들이지 못하고 있다. 그렇기에 resource 밑에있는 static 파일은 정적인 파일만을 저장해 두어야 한다.

그렇다면 어떻게 하면 정적인 파일을 사용할 수 있을까?

 

웹을 개발하기 위해서 사용되는 파일 구조가 있다. 그런데 spring boot는 jsp를 지원하지 않기 때문에 webapp가 없다.

폴더를 만들어 주고 다시 실행하면 정상적으로 jsp 파일을 불러오는 것을 볼 수 있다.

 

오늘 스프링 부트를 공부해 보면서 여러 가지를 공부했다. 오늘 공부했던 내용을 정리해보자! 

 

스프링을 공부하려고 했지만 토비의 스프링 책이 너무 비싸서 일단 조금 비싸지 않은 책을 샀다.

 

시큐리티


시큐리티는 무엇일까.. 로그인이나 기타 인증을 관리하는 걸까. 처음 시작했을 때 로그인 화면이 나와서 당황했다.

그래서 시큐리티 관련된 의존성을 주석해보았다. 그러니 처음에 나온 녀석 말고 다른 화면이 나왔다. 로그인 페이지도 만들어 주는 건가?

이 녀석을 주석했다.

 

 

 

데이터 베이스 연결


그래서 컨트롤러를 만들고 URL 요청이 오면 작동이 되는지 확인하기 위해서 만들었더니 잘 되었다.

 

 

 

이제 데이터 베이스에 연결하기 위해 깔아 두었던 mysql을 연결하기 위해서 찾아봤더니

yml이란 파일을 만들면 쉽게 관리할 수 있다고 한다.

내 mysql 계정의 내용을 url과 username passwd에 넣고 프로젝트를 실행하면 오류가 나지 않는다. 

 

 

그런데 프로젝트 파일을 만들 때 JPA , MySQL 등을 깔고 처음으로 시작하게 된다면 오류가 발생할 것이다. 그 이유는 위에 있는 데이터베이스의 내용을 입력해주어야 한다. 스프링이 시작되면 MYSQL, 시큐리티, 내가 만든 자바 프로젝트 파일 등을 비롯한 모든 내용이 읽힌다. 그런데 데이터 베이스에 연결이 되어있지 않는다면 

 

이렇게 길게 뭐라 하는데 데이터베이스를 초기화하기 위한 데이터가 없다 뭐 이런 거 같은데 위에 datasource를 만들어 준다면 에러는 사라지고 스프링 부트가 정상적으로 실행이 될 것이다.

 

 

ps. 미래의 나에게.. pom.xml의 내용이 바뀔 때마다 maven project update를 꼭 해라.....ㅠㅠ

request: 클라이언트 요청정보 저장

response: 응답 정보를 저장

pageContext: JSP 페이지에 대한 정보를 저장

  • 기본 객체 구하기
  • 속성 처리하기
  • 페이지의 프름 제어하기
  • 에러 데이터 구하기

기본 객체 구하기

  • getRequest() : request 기본 객체 ,                  Return 타입 : ServletRequest
  • getResponse() : Response기본 객체,               Return 타입 : ServletResponse
  • getSession() : Session기본 객체,                    Return 타입 : HttpSession
  • getServletContext() : ServletContext기본 객체,  Return 타입 : ServletContext
  • getServletConfig() : ServletConfig기본 객체,     Return 타입 : ServletConfig
  • getOut() : Out기본 객체,                              Return 타입 : JspWriter
  • getException() : Exception기본 객체,               Return 타입 : Exception
  • getPage() : Page기본 객체,                           Return 타입 : Object

session: HTTP 세션  정보 저장

 

application: 웹 어플리케이션에 대한 정보를 저장한다.

-> application 기본 객체는 웹 어플리케이션 전반에 걸쳐서 사용되는 정보를 담고있다. ex) 초기 설정 정보 및 서버 정보를 읽어오기, 웹 어플리케이션이 제공하는 자원 읽어오기

 

web.xml 파일에 초기화 파라미터를 추가하면, jsp는 application 기본 객체가 제공하는 메서드를 사용해서 초기화 파리미터를 사용 할 수 있다.

 

  • getInitParameter(String name) : 이름이 name인 웹 애플리케이션 초기화 파라미터의 값을 읽어온다. 존재하지 않으면 NULL
  • getInitParameterNames() : 웹 어플리케이션 초기화 파라미터의 이름 목록을 리턴한다.

웹 어프리 케이션 초기화 파라미터는 언제 사용할까?

=> 예를들어 데이터 베이스 연결과 관련된 설정 파일의 경로나 로깅 설정파일 또는 웹 어플리케이션의 주요 속성 정보를 담고 있는 파일의 경로등을 지정할 떄 초기화 파라미터를 사용한다.


out: JSP 페이지가 생성하는 결과를 출력할 때 사용하는 출력 스트림이다.

out기본 객체의 출력 메소드

  • Print() : 데이터를 출력한다.
  • Println() : 데이터를 출력하고, 줄바꿈 문자( \r\n or \n)를 출력한다.
  • newLine() : 줄바꿈 문자( \r\n or \n)를 출력한다.

out 기본 객체와 버퍼의 관계

  • getBufferSize() : 버퍼의 크기
  • getRemaining() : 현재 버퍼의 남은 크기를 구한다.
  • clear() : 버퍼의 내용을 비운다. Exception 발생 O
  • clearBuffer() : 버퍼의 내용을 비운다. Exception 발생 X
  • flush() : 버퍼를 플러시한다.
  • isAutoFlush() : 버퍼가 다 찼을 때 자동으로 플러시 할 경우 true 리턴

config: JSP 페이지에 대한 설정 정보 저장

page: JSP 페이지를 구현한 자바 클래스 인스턴스

exception: 익셉션 객체이다. 에러 페이지에서만 사용한다.

 

네 가지 영역과 기본 객체의 관계

+ Recent posts