💡 과제 주제
이 Java 애플리케이션은 입력에 기반하여 특정 위치 내의 장소를 검색할 수 있도록 합니다.
자신의 위치를 기반으로 특정위치에 있는 장소를 검색하여 출력하는 자바 애플리케이션을 개발할 수 있다.
Kakao 로컬 REST API중 키워드로 장소 검색하기, 카테고리로 장소 검색하기 API를 활용할 수 있다
부트캠프 자바기초 교육에서 배운 내용을 활용하여 문제를 해결하는게 중요 포인트이다.
활용 내용
- API 활용
- Stream 을 이용한 Http 서버와의 I/0
- Stream 데이터를 Json 형태로 변환
💡 프로젝트 진행 순서
1. 프로젝트 세팅
- JDK 11 Version
- Gradle
- JUnit 5
과제의 깃허브에는 Readme 제외하고 빈 자바 프로젝트이다.
그렇기 때문에 기본설정을 직접 진행하여야 했다.
1-1. Gradle 세팅
- bulid.gradle 파일을 직접 프로젝트 최상단 내의 생성한다.
plugins {
id 'java'
}
group 'group.name'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
2. settings.gradle 파일을 직접 프로젝트 최상단 내의 생성한다.
rootProject.name = '프로젝트 명 기입'
3. 여기까지 작성하면 intelliJ 가 자동으로 Gradle 프로젝트를 인지하고 변환시켜 준다.
만약 임포트가 완료되어도 src 구조가 안 생긴다면 직접 등록을 해주어야 한다.
[프로젝트 폴더 우클릭 - New - Directory를 클릭한 뒤, 밑에 나오는 "Gradle Source Sets"를 전체 선택] 한 뒤 엔터를 누르면 된다.
여기까지 한다면 Gradle + JUnit 5 프로젝트가 구성된다.
2. Kakao API 설정
2-1. 내 애플리케이션 만들기
https://developers.kakao.com/console/app 로 들어가 [애플리케이션 추가하기] 버튼을 클릭해 애플리케이션을 구성한다.
2-2. API 확인
[앱 키] > [REST API키] 복사하여 사용하면 된다.
2-3. 프로젝트 내 API 키 등록
properties 파일을 생성해 key를 등록하였다.
3. Kakao API 서버로 Request / Response 해보기
3-1. httpcomponents를 dependency 하여 사용하였다.
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
// https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.13'
}
3-2. Request를 보내보자
/**
* Http Get 공통모듈
* @param url
* @param params
* @param headers
* @return
* @throws URISyntaxException
*/
public JSONObject get(String url, Map params, List<Header> headers) throws URISyntaxException {
JSONObject json = null;
List<NameValuePair> paramList = convertParam(params);
HttpGet httpGet = new HttpGet(url);
for(Header header: headers){
httpGet.addHeader(header);
}
URI uri = new URIBuilder(httpGet.getURI())
.addParameters(paramList)
.build();
httpGet.setURI(uri);
try(CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = (CloseableHttpResponse) client.execute(httpGet);
){
if(response.getStatusLine().getStatusCode() == 200){
json = getJsonObject(response);
}
}catch(Exception e){
throw new RuntimeException(e);
}
return json;
}
- HTTP Get 통신을 위한 공통 모듈을 만들어서 활용하였다.
public static final String KAKAO_KEYWORD_ADDRESS_URI = "https://dapi.kakao.com/v2/local/search/keyword.json";
HttpProxy httpProxy = HttpProxy.getInstance();
public Location keyWordAPI(String query, int radius) throws URISyntaxException {
...
//헤더값 세팅
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("Authorization", "KakaoAK " + kakaoApiKey));
headers.add(new BasicHeader("Content-Type", "application/json;charset=UTF-8"));
//전송한 파라미터 세팅
Map map = new HashMap<>();
map.put("query", query);
//HTTP Get 메서드 호출
JSONObject json = httpProxy.get(KAKAO_KEYWORD_ADDRESS_URI, map, headers);
...
}
3-3. Response 데이터를 Json으로 변환하자
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
// https://mvnrepository.com/artifact/org.json/json
implementation group: 'org.json', name: 'json', version: '20230227'
// https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.13'
}
- org.json을 dependency에 등록한다.
private JSONObject getJsonObject(CloseableHttpResponse response) throws IOException {
StringBuffer result = new StringBuffer();
InputStream inputStream = (InputStream) response.getEntity().getContent();
String inputLine = null;
try(BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));) {
while((inputLine = in.readLine()) != null) {
result.append(inputLine);
}
}catch (Exception e){
e.printStackTrace();
}
JSONObject json = new JSONObject(result.toString());
return json;
}
- 서버에서 보낸 InputStream을 Buffer에 담아 JSONObject로 받아 처리했다.
이후 입출력구현, Service 구현 등을 진행하면 된다.
💡 후기
오랜만에 프로젝트를 진행하는 거라 두서없이 진행이 된 거 같다. 원래 계획대로 라면 TDD 공부를 하고 있으니 배운 방식으로 진행하려고 했으나 실패했다.
JUnit 세팅을 하였지만 사용을 안 하고 개발을 했다. 꼭 TDD 가 아니더라도 테스트는 중요한데 안 좋은 습관대로 개발을 진행하였다.
다음 프로젝트 때에는 어느 정도 가이드를 정하고 시작해야 될 거 같다.
피드백을 아직 받기 전이라 코드 리뷰를 하긴 그렇지만 상수 처리 나 에러처리에 대한 부분이 정리가 안된 느낌이라 추가적으로 공부를 진행해야 할 거 같다.
'프로젝트&부트캠프 > 패스트캠퍼스x야놀자 백엔드과정' 카테고리의 다른 글
[패스트캠퍼스x야놀자 개발자벡엔드 부트캠프] 미니프로젝트를 마치며 정리할 내용 기록하기 (0) | 2023.12.06 |
---|---|
[패스트캠퍼스x야놀자 개발자벡엔드 부트캠프] 토이 프로젝트 1차 후기 (0) | 2023.09.15 |
[패스트캠퍼스x야놀자 개발자벡엔드 부트캠프] Java 과제 2 (0) | 2023.09.01 |