Java/Spring MVC

[2020.09.22 SpMVC_ReadBook] HttpHeader, RestTemplate, URI클래스 사용해서 API parsing, Dao의 Generic

우롱차 2020. 9. 22. 16:44
728x90
httpConn.setRequestProperty("X-Naver-Client-Id", SecretNaver.NAVER_CLIENT_ID);
httpConn.setRequestProperty("X-Naver-Client-Secret", SecretNaver.NAVER_CLIENT_SECRET);

저 값은 네이버에다가 인가를 하는 부분이라 대소문자, - 틀리게 하면 안된다.

 

if (resCode == 200) {
// naver가 정상적으로 응답을 할 것이다.
	is = new  InputStreamReader(httpConn.getInputStream()); // 정상적일 때는 getinput
} else {
	is = new  InputStreamReader(httpConn.getErrorStream());// 오류메시지는 geterror
}
// InputStreamReader와 BufferdReader를 파이프로 연결
buffer = new BufferedReader(is);
StringBuffer sBuffer = new StringBuffer();
// String sBuffer = "";
String reader = new String();
while ((reader = buffer.readLine()) != null) {
	sBuffer.append(reader);

파일 읽는 코드와 거의 같은 구조라고 보면된다.

String reader = new String();
while ((reader = buffer.readLine()) != null) {
	sBuffer.append(reader);
    sBuffer += reader; // += 로 써도 큰 문제를 일으키지 않는다. 근데 고수들은 이런코드 시러함
}

이런 코드도 있다고 보여주는..

하지만 이런 코드는 유지보수가 어려운 코드

 

위의 코드와 아래 코드는 같다

String sBuffer = "";
while (true) {
	reader = buffer.readLine();
	if (reader == null) break;
	sBuffer.append(reader);
}

 

 

빌드 패턴을 사용하여 bookVO 객체 생성

일반적인 VO객체를 생성하고 데이터를 Setting하는 방법
 1. 비어있는 VO를 객체를 생성 :  vo = new VO();
    setter method를 사용하여 데이터를 입력하는 방법
 2. 생성자에 값을 설정하고 VO객체를 생성 : vo = new VO(값1,값2,값3...)

   가. 생성자에 값을 설정(주입)하고 VO객체를 생성하는 방법은
       데이터의 순서가 완전히 개발자 책임이다.

       혹여 순서가 바뀐채로 VO객체가 생성되면
       이후에 발생하는 모든 문제를 개발자가 책임져야한다.

   나. 일부 데이터만 사용하여 객체를 생성하려면
       생성자를 필요한 매개변수만 있는 또 다시 만들어야한다. (생성자를 만들어야한다는 이야기)
       ex) vo = new VO(값1,값2) : VO(String 값1, String 값2)
       ex) vo = new VO(값1,값2, 값3) : VO(String 값1, String 값2, String 값3)
       많은 생성자의 중복 선언이 발생할 수 있다.

3. Builder(Build) 패턴을 사용한 객체 생성 

  ex ) VO = VO.Builder()
       .변수1(값1)
       .변수1(값2)
       .변수3(값3)
       .build();

>> VO에서만
 가. 생성자를 통해서 객체를 필요할 때 즉시 생성한다.
 나. 생성자에 매개변수를 주입하는 방식인데,
    여기서는 필요한 데이터만 매개변수로 주입할 수 있다.
    모든 변수를 생성자에 주입할 필요가 없다. (가장 큰 장점)
 다. 매개변수를 주입할 때 set*()와 같은 method를 사용하지 않고,
    매개변수의 이름을 통해 직접 설정할 수 있다.
 라. 객체를 생성할 때, 객체 chainning 코딩을 사용할 수 있다.
    객체.변수1().변수2().변수3().변수4().변수5()

>> VO를 만들 때 new라는 키워드 말고 build 패턴을 사용할 예정

 

>> NaverServiceImplV1


RestTemplate restTemplate = new RestTemplate();

외부url -> json > json*클래스 : 복잡한 과정을 restTemplate이 대신 해준다.

 

restTemplate을 쓸때는 url이라는 클래스말고 URI클래스를 쓰더라

어떤 정보를 담고있을 때 쓰는 내부적으로는 다르겠지만 겉과 비슷한 url, uri

// queryURL(요청주소포함된) 문자열을 URI 객체로 만들어
// http 프로토콜에서 사용할 수 있도록 만드는 클래스
URI restURI = null;
RestTemplate restTemplate = new RestTemplate();

 

 

>> NaverServiceImplV2

 


<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.3</version>
</dependency>

RestTemplate을 사용하여 XML 결과를 받기 위한 보조 도구

jackson 밑에다가 붙여줌

>> pom.xml

 


BookVO 객체들의 리스트를 담을 리스트 클래스

 

RestTemplate 기능을 사용하여 API 데이터를 가져오기 위한
핵심 기능을 사용하기위한 매우 중요한 model 클래스

API를 통해 가져올 데이터(VO)들을 담을 List를 선언하는데

이때 변수의 이름은 API에서 보내주는 데이터의 이름을 참조하여 만들어야 한다.

 

>> Book_JSOM_Parent

 


<property name="typeAliasesPackage" value="com.biz.book.model"/>

이 코드가 config파일의 

>>context.xml파일

 

<typeAliases>
	<typeAlias type="com.biz.dbms.persistence.BBsDTO"
		alias="BBsDTO" />
</typeAliases>

이걸 대신해준다는 소리

 

그리고 JSON_Parent 클래스에 

@Alias("BookList")


/*
* GenericDao를 extends 하면 기본 CRUD method를 별도로 정의하지 않아도  된다.
*/
public interface BookDao extends GenericDao<BookVO, Integer> {

>> BookDao

 


controller와 jsp파일의 변수명은 같아야한당 

 

>> BooksController와 list.jsp 의 ${BOOKS} 참조

 

      <c:choose>
            <!-- books에 담겨있는 데이터가 없으면 아래 코드를  표시하고-->
            <c:when test="${empty BOOKS}">
                  <tr>
                        <td colspan="6">데이터가 없음</td>
                  </tr>             
            </c:when>
            <!-- 그렇지 않으면 이 otherwise안에있는 코드를 실행하라 -->
            <c:otherwise>
                  <c:forEach items="${BOOKS}" var="boos" varStatus="i">
                        <tr>
                              <td>${i.count}</td>
                              <td>${book.title}</td>
                              <td>${book.author}</td>
                              <td>${book.publisher}</td>
                              <td>${book.price}</td>
                              <td>${book.buydate}</td>
                        </tr>
                  </c:forEach>
            </c:otherwise>    
      </c:choose>

c태그의 if문(c:when)과 else(c:otherwise)문이라고 보면됌

 

이런식으로 나옴

>> book-list.jsp

 

 

<fieldset>
	<legend>도서정보입력</legend>

레전드는 필드셋안에 꼭 해야함

>> book-write.jsp

728x90