Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,18 @@ services:
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
<<<<<<< Updated upstream
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: badgeload
MYSQL_DATABASE: badgeload
MYSQL_USER: badgeload
MYSQL_PASSWORD: badgeload
MYSQL_PASSWORD: badgeload
=======
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: badgeroad
MYSQL_DATABASE: badgeroad
MYSQL_USER: badgeroad
MYSQL_PASSWORD: password
>>>>>>> Stashed changes
18 changes: 18 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,24 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-security</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
22 changes: 0 additions & 22 deletions src/main/java/com/hotnerds/badgeroad/HomeController.java

This file was deleted.

18 changes: 18 additions & 0 deletions src/main/java/com/hotnerds/badgeroad/home/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.hotnerds.badgeroad.home;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

@GetMapping("/")
public String homepage() {
return "index";
}

@GetMapping("/user")
public String user() {
return "login";
}
}
243 changes: 243 additions & 0 deletions src/main/java/com/hotnerds/badgeroad/openapi/NaverClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
package com.hotnerds.badgeroad.openapi;

import com.hotnerds.badgeroad.openapi.dto.SearchImageReq;
import com.hotnerds.badgeroad.openapi.dto.SearchImageRes;
import com.hotnerds.badgeroad.openapi.dto.SearchLocalReq;
import com.hotnerds.badgeroad.openapi.dto.SearchLocalRes;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

@Component
public class NaverClient {

// yaml 파일 사용하는데 @Value 어노테이션을 사용하며
// 내부에 "${}"형태로 yaml에 설정한 대로 기입
@Value("${NAVER-CLIENT}")
String naverClientId;

@Value("${NAVER-KEY}")
String naverSecret;

@Value("${naver.url.search.local}")
String naverLocalSearchUrl;

@Value("${naver.url.search.blog}")
String naverBlogSearchUrl;

@Value("${naver.url.search.image}")
String naverImageSearchUrl;

public String searchBlog(String query) {
try {
query = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패", e);
}

String apiURL = naverBlogSearchUrl +
"?query=" + query;

Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", naverClientId);
requestHeaders.put("X-Naver-Client-Secret", naverSecret);
String responseBody = get(apiURL, requestHeaders);
System.out.println(responseBody);

return responseBody;
}

public String searchImage(String query) {
try {
query = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패", e);
}

String apiURL = naverImageSearchUrl +
"?query=" + query;

Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", naverClientId);
requestHeaders.put("X-Naver-Client-Secret", naverSecret);
String responseBody = get(apiURL, requestHeaders);
System.out.println(responseBody);

return responseBody;
}

public String searchLocal(String query) {
try {
query = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패", e);
}

String apiURL = naverLocalSearchUrl +
"?query=" + query;
SearchLocalReq searchLocalReq = new SearchLocalReq();
// URI apiURL = ServletUriComponentsBuilder
// .fromUriString(naverLocalSearchUrl)
// .queryParams(searchLocalReq.toMultiValueMap())
// .build()
// .encode()
// .toUri();

Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", naverClientId);
requestHeaders.put("X-Naver-Client-Secret", naverSecret);
String responseBody = get(apiURL.toString(), requestHeaders);
//
//
// var uri = UriComponentsBuilder
// .fromUriString(naverLocalSearchUrl)
// .query(query)
// .queryParams(searchLocalReq.toMultiValueMap())
// .build()
// .encode()
// .toUri();
//
// System.out.println(apiURL);
// System.out.println(uri);

// var headers = new HttpHeaders();
// headers.set("X-Naver-Client-Id", naverClientId);
// headers.set("X-Naver-Client-Secret", naverSecret);
// headers.setContentType(MediaType.APPLICATION_JSON);
//
// var httpEntity = new HttpEntity<>(headers);
// var responseType = new ParameterizedTypeReference<SearchImageRes>(){};
//
//
// var responseEntity = new RestTemplate()
// .exchange(
// uri,
// HttpMethod.GET,
// httpEntity,
// responseType
// );


return responseBody;
}

private String get(String apiUrl, Map<String, String> requestHeaders) {
HttpURLConnection con = connect(apiUrl);

try {
con.setRequestMethod("GET");
for (Map.Entry<String, String> header: requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}

int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
return readBody(con.getInputStream());
} else {
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}

private HttpURLConnection connect(String apiUrl) {
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}

private String readBody(InputStream body) {
InputStreamReader streamReader = new InputStreamReader(body);

try (BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();

String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}

return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는 데 실패했습니다.", e);
}
}

public SearchLocalRes searchLocal(SearchLocalReq searchLocalReq) {
var uri = UriComponentsBuilder
.fromUriString(naverLocalSearchUrl)
.queryParams(searchLocalReq.toMultiValueMap())
.build()
.encode()
.toUri();

var headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverSecret);
headers.setContentType(MediaType.APPLICATION_JSON);

var httpEntity = new HttpEntity<>(headers);
var responseType = new ParameterizedTypeReference<SearchLocalRes>(){};


var responseEntity = new RestTemplate()
.exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);

return responseEntity.getBody();
}

public SearchImageRes searchImage(SearchImageReq searchImageReq) {
var uri = UriComponentsBuilder
.fromUriString(naverImageSearchUrl)
.queryParams(searchImageReq.toMultiValueMap())
.build()
.encode()
.toUri();

var headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverSecret);
headers.setContentType(MediaType.APPLICATION_JSON);

var httpEntity = new HttpEntity<>(headers);
var responseType = new ParameterizedTypeReference<SearchImageRes>(){};


var responseEntity = new RestTemplate()
.exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);

return responseEntity.getBody();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.hotnerds.badgeroad.openapi;

import lombok.RequiredArgsConstructor;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RequiredArgsConstructor
@RestController
@RequestMapping("/openapi")
public class OpenApiController {
@Autowired
NaverClient naver = new NaverClient();

@ResponseBody
@GetMapping("naver/blog")
public ResponseEntity<JSONObject> getPlace(@RequestParam("query") String query) throws Exception {
JSONParser parser = new JSONParser();
Object obj = parser.parse(naver.searchBlog(query));
JSONObject jsonObj = (JSONObject) obj;
return ResponseEntity.ok(jsonObj);
}

@ResponseBody
@GetMapping("/naver/image")
public ResponseEntity<JSONObject> getImage(@RequestParam("query") String query) throws Exception {
JSONParser parser = new JSONParser();
JSONObject jsonObj = (JSONObject)parser.parse(naver.searchImage(query));
return ResponseEntity.ok(jsonObj);
}

@ResponseBody
@GetMapping("/naver/local")
public ResponseEntity<JSONObject> getLocal(@RequestParam("query") String query) throws Exception {
JSONParser parser = new JSONParser();
JSONObject jsonObj = (JSONObject)parser.parse(naver.searchLocal(query));
return ResponseEntity.ok(jsonObj);
}
}
Loading