벡엔드 웹프로그래밍/Spring

Spring 웹 프로그래밍 93일차 (25/3/31)

wkun 2025. 3. 31. 15:04

contents

 

네트워크 프로그래밍 구현 test

 

 

-----------------------------------------------------------------------

 

 

네트워크 프로그래밍 구현 test

 

문제

첨부된 프로젝트를 다운로드 받아서 아래의 요구사항을 만족하는 코드를 제출하시오.

문항 1. 컨트롤러에의 geo()메서드에서  addr변수의 값을 URL을 인코딩하는 코드를 작성하시오.(10점)
- 인코딩 타입 : "UTF-8"

문항 2.  URL연결객체를 생성하시오.(10점) 
- 생성자 파라미터는 urlstr 입니다.

문항 3. URL 커넥션 객체를 오픈하시오. (10점)

문항 4. 서버로 부터 바이너리 데이터(1010101)을 수신받는 코드를 작성하시오.(10점)

문항 5. 버퍼에(br변수)에 있는 데이터를 한줄씩 읽어와서 sb변수에 누적하는 반복문 코드를 작성하시오.(10점)

문항 6. JSON을 인식하는 토큰러를 생성하시오.(10점)
- 생성시 파라미터는 sb변수를 활용하시오.

문항 7. JSON 토큰러를 사용하여 json 객체를 생성하시오.(10점)

문항 8. json객체에서 "addresses" 배열을 json배열로 변환하시오.(10점)

문항 9. json배열에서 i 인덱스에 해당하는 json객체를 temp변수에 가져오는 코드를 작성하시오.(10점)

문항 10. tempname과 .jpg확장자로 이미지파일을 생성하는 코드를 작성하시오.(10점)

 

1.String encodedAddr = URLEncoder.encode(addr, "UTF-8");

2.URL url = new URL(urlstr);

3.HttpURLConnection conn = (HttpURLConnection) url.openConnection();

4.InputStream is = conn.getInputStream();

5.while((line=br.readLine())!=null) {
        sb.append(line);
}

6.JSONTokener tokener = new JSONTokener(sb.toString());

7.JSONObject obj = new JSONObject(tokener);

8.JSONArray arr = obj.getJSONArray("addresses");

9.temp = (JSONObject) arr.get(i);

10.tempname = tempname + ".jpg";
     File f = new File(tempname);

 

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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springmvc</groupId>
<artifactId>networkprogram</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>json Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<java-version>17</java-version>
<org.springframework-version>5.3.19</org.springframework-version>
<org.aspectj-version>1.9.9.1</org.aspectj-version>
<org.slf4j-version>1.7.36</org.slf4j-version>
<security.version>5.6.3</security.version>
<commons-fileupload-version>1.4</commons-fileupload-version>
<commons-io-version>2.11.0</commons-io-version>
</properties>
<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson
</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>networkprogram</finalName>
</build>
</project>

 

web.xml

<web-app id="servlet-2_5" version="2.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

 

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />


<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />


<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>

<context:component-scan base-package="com.springmvc.*" />



</beans:beans>

 

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Root Context: defines shared resources visible to all other web components -->

</beans>

 

ExamController.java

package com.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;


import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;


@Controller
@RequestMapping("/exam")
public class ExamController {

Gson gson=null;

//위도와 경도를 얻는 api
@GetMapping("/geo")
public String geo(@RequestParam String addr) {
String client_id = "xxx"; // 발급받은 Client ID
String client_secret = "yyy"; // 발급받은 Client Secret



try {
// exam1 : 주소 URL 인코딩
String encodedAddr = URLEncoder.encode(addr, "UTF-8");


String urlstr = "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query=" + encodedAddr;


// exam2 : 연결 객체 생성
URL url = new URL(urlstr);

// exam3 : null처리된 url 객체 커넥션 오픈;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("X-NCP-APIGW-API-KEY-ID", client_id);
conn.setRequestProperty("X-NCP-APIGW-API-KEY", client_secret);



int responseCode = conn.getResponseCode();
System.out.println("응답 코드: " + responseCode);


// exam4 : 응답 읽기
InputStream is = conn.getInputStream(); //서버로 부터 010100101과 같은 바이트 스트림을 전달받음
InputStreamReader isr = new InputStreamReader(is); // 바이트 스트림을 문자 스트림으로 변환
//System.out.println(isr.toString());
BufferedReader br = new BufferedReader(isr); //줄단위로 텍스트를 읽을 수 있게 도와주는 보조 스트림
//System.out.println(br.toString());
StringBuilder sb = new StringBuilder();
String line;
// exam5 :sb변수에 데이터 누적하기
while((line=br.readLine())!=null) {
sb.append(line);
}
System.out.println("응답 결과:");
System.out.println(sb.toString());



conn.disconnect();

//exam6 : 토큰러 생성
JSONTokener tokener = new JSONTokener(sb.toString());
//exam7 : json객체생성
JSONObject obj = new JSONObject(tokener);
//exam8 : json 배열생성
JSONArray arr = obj.getJSONArray("addresses");
String x;
String y;

JSONObject temp=null;
for(int i=0; i<arr.length();i++) {
//문항 9 : json객체를 가져오는 코드
temp = (JSONObject) arr.get(i);
}
x = (String)temp.get("x");
y = (String)temp.get("y");
System.out.println("위도:"+x);
System.out.println("경도:"+y);

map(x,y,addr);

} catch (Exception e) {
e.printStackTrace();
}


return "ajax";
}
public void map(String x, String y, String address) {
String client_id = "xxx";
String client_secret = "yyy";
String urlstr = "https://naveropenapi.apigw.ntruss.com/map-static/v2/raster?";
String url=null;

try {
String posvalue = x+" "+y; //문항1번과 같음 posvalue를 "UTF-8"로 인코딩하시오;
String pos = URLEncoder.encode(posvalue, "UTF-8");

url = urlstr;
url += "center=" + x + "," + y;
url += "&level=16&w=700&h=500";
url += "&markers=type:t|size:mid|pos:"+pos+"|label:"+URLEncoder.encode("아이티에듀넷", "UTF-8");


//문항 2번과 같음
URL urls = new URL(url);
//문항 3번과 같음
HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
conn.setRequestMethod("GET");


conn.setRequestProperty("X-NCP-APIGW-API-KEY-ID", client_id);
conn.setRequestProperty("X-NCP-APIGW-API-KEY", client_secret);


int responsecode = conn.getResponseCode();
System.out.println("응답 코드: " + responsecode);


if (responsecode == 200) {
InputStream is = conn.getInputStream();
int read;
byte[] bytes = new byte[1024];


String tempname = Long.valueOf(new Date().getTime()).toString();
System.out.println("파일이름: " + tempname);


//exam10 : 파일생성

tempname = tempname + ".jpg";
File f = new File(tempname);
f.createNewFile();
FileOutputStream ot = new FileOutputStream(f);


while ((read = is.read(bytes)) != -1) {
ot.write(bytes, 0, read);
}


ot.close();
is.close();


System.out.println("이미지 저장 완료");
} else {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"));
StringBuilder errorMsg = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
errorMsg.append(line);
}
br.close();
System.out.println("에러 메시지: " + errorMsg.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}



}

*String client_id = "xxx"; / String client_secret = "yyy"; :  보안 주의

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<form action="exam/geo" method="GET">
주소 : <input type="text" name="addr" />
<input type="submit" value="전송">
</form>
</body>
</html>

 

ajax.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


</body>
</html>

 

실행 결과

 

1743400829954.jpg