ํจ์คํธ์บ ํผ์คX์ผ๋์: ๋ฐฑ์๋ ๊ฐ๋ฐ ๋ถํธ ์บ ํ - Java ์ฌํ ๊ณผ์ 1
โ๏ธ๊ณผ์ 1 : ์์น๊ธฐ๋ฐ ์ฅ์ ๊ฒ์ Java ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
(Location Based Place Search Java Application Development)
์ด Java ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๋ ฅ์ ๊ธฐ๋ฐํ์ฌ ํน์ ์์น ๋ด์ ์ฅ์๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ํฉ๋๋ค.
์์ ์ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํน์ ์์น์ ์๋ ์ฅ์๋ฅผ ๊ฒ์ํ์ฌ ์ถ๋ ฅํ๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ ํ ์ ์๋ค.
Kakao ๋ก์ปฌ REST API์ค ํค์๋๋ก ์ฅ์ ๊ฒ์ํ๊ธฐ, ์นดํ ๊ณ ๋ฆฌ๋ก ์ฅ์ ๊ฒ์ํ๊ธฐ API๋ฅผ ํ์ฉ ํ ์ ์๋ค.
โ๏ธ์์ ์ต์
๋ค์ ์์ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ๊ตฌํํ์ธ์
- ํน์ ์์น(ํค์๋) ์ฃผ๋ณ์ ์ง์ ๋ ๋ฐ๊ฒฝ ๋ด์์ ์ฃผ์ ์๋ฅผ ๊ฒ์ํ๋ Java ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํฉ๋๋ค.
- ํน์ ์์น(ํค์๋) ์ฃผ๋ณ์ ์ง์ ๋ ๋ฐ๊ฒฝ ๋ด์์ ์ฝ๊ตญ์ ๊ฒ์ํ๋ Java ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํฉ๋๋ค.
โ๏ธ
๊ณผ์ ์ผ์ 8์ 21์ผ (์) ~ 8์ 23์ผ (์) 23:59๊น์ง
โ๏ธ
๋ฌธ์ ์ค๋ช๋จ๊ณ 1: ์นด์นด์ค API ํค ํ๋
- ์นด์นด์ค ๊ฐ๋ฐ์์ ๋ก๊ทธ์ธํฉ๋๋ค.
- ์์ ๊ฐ์ด๋์ ๋ฐ๋ผ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค.
- ๋์ค์ ์ฌ์ฉํ REST API ํค๋ฅผ ๋ฉ๋ชจํด ๋ก๋๋ค.
๋จ๊ณ 2: ๋ก์ปฌ REST API ์ฌ์ฉ
- ๋ก์ปฌ REST API ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ํค์๋๋ก ์ฅ์ ๊ฒ์ํ๊ธฐ์ ์นดํ ๊ณ ๋ฆฌ๋ก ์ฅ์ ๊ฒ์ํ๊ธฐ์ ํ์ฉํ์ฌ ๊ฐ๋ฐํฉ๋๋ค.
- ์์ฒญ๊ณผ ์๋ต ๊ตฌ์กฐ์ ๋ํ ์์ ์ฝ๋๋ฅผ ํ์ธํฉ๋๋ค.
๋จ๊ณ 3: Java ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌํ
- ํค๋ณด๋๋ก ํน์ ์์น ํค์๋์ ๊ฒ์ ๋ฐ๊ฒฝ์ ์ ๋ ฅํฉ๋๋ค.
- ์ ๋ ฅํ ํค์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋(latitude)์ ๊ฒฝ๋(longitude)๋ฅผ ์ถ์ถํฉ๋๋ค.
- ์ถ์ถํ ์์น๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅํ ๋ฐ๊ฒฝ(radius) ๋ด์์ ์ฃผ์ ์๋ ์ฝ๊ตญ์ ๊ฒ์ํฉ๋๋ค.
- ๊ฒ์ ๊ฒฐ๊ณผ(JSON)์์ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ํ์ํฉ๋๋ค.
- ์์ 10๊ฐ ๊ฒฐ๊ณผ์ ๋ํ ์ถ์ถ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํฉ๋๋ค.
- ๊ฒ์๋ ๊ฒฐ๊ณผ์์ ์ฅ์ URL์ ์ ๋ ฅํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ํด๋น kakaomap์ด ์ถ๋ ฅ๋๋๋ก ํ๋ค.
- exit๋ฅผ ์ ๋ ฅํ๋ฉด ์ข ๋ฃํ๋ค.
โ๏ธ
์์ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ์ ๋ ฅ ํ๋ฉด
์์น ํค์๋๋ฅผ ์
๋ ฅํ์ธ์:
๊ฒ์ ๋ฐ๊ฒฝ์ ์
๋ ฅํ์ธ์(1000:1km):
์ถ๋ ฅ ํ๋ฉด
์
๋ ฅํ ์์น ํค์๋:
๊ฒ์ ๋ฐ๊ฒฝ:
**์ฃผ์ ์ ๊ฒ์ ๊ฒฐ๊ณผ**
- ์ฅ์ URL(์ง๋ ์์น):
- ์ํธ๋ช
:
- ์ฃผ์:
- ์ ํ๋ฒํธ:
- ๊ฑฐ๋ฆฌ(km):
**์ฝ๊ตญ ๊ฒ์ ๊ฒฐ๊ณผ**
- ์ฅ์ URL(์ง๋ ์์น):
- ์ํธ๋ช
:
- ์ฃผ์:
- ์ ํ๋ฒํธ:
- ๊ฑฐ๋ฆฌ(km):
kakaomap URL(์ฅ์ URL):http://place.map.kakao.com/26338954 -> ๊ฒ์๋ ๊ฒฐ๊ณผ์์ ์ฅ์ URL์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ ํ ์ํฐ -> ๋ธ๋ผ์ฐ์ ธ๊ฐ ์คํ
kakaomap URL(์ฅ์ URL):exit -> exit ์
๋ ฅํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ค.
ํ๋ก๊ทธ๋จ ์ข
๋ฃ
โ๏ธ์์กด์ฑ
- Java 8 ์ด์
- httpclient, json API
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
โ๏ธ
ํ๊ฐ ๊ธฐ์ค- ์ ์๋ ๊ธฐํ ๋ด ์ ์ถ (5์ )
- ๋ฌธ์ ์กฐ๊ฑด ์ค์ํ ์ฝ๋ (5์ )
- ์ ์๋ ๊ธฐ๋ฅ ์๋ ์ฌ๋ถ (5์ )
- ์ ์ถ๋ ฅ ํ๋ฉด์ด ์ ์ค๊ณ ๋์๋๊ฐ?
- JSON ๋ฐ์ดํฐ ์ ํ์ฑํ์ฌ ๋ชฉ๋ก์ ์ถ๋ ฅํ์๋๊ฐ?
- ๋ฐ๊ฒฝ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ์ ์ถ๋ ฅ์ด ๋๋๊ฐ?
- ์ฅ์๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ ํ์๋๋๊ฐ?
โ๏ธ
์ ์ถ๋ด์ฉ- ์์ค์ฝ๋ ์ ์ถ
- ์ ์ถ๋ ฅ ์คํํ๋ฉด ์บก์ฒ ์ ์ถ
- ์์ค์ฝ๋์ ๊ณผ์ 1 ํด๋๋ฅผ ๋ง๋ค๊ณ ๊ณผ์ 1 ํด๋์ ์๋ 2๊ฐ์ ์ด๋ฏธ์ง ํ์ผ์ ์ถ๊ฐํ ๊ฒ
- ์ ๋ ฅํ๋ฉด ์บก์ฒ
- ์ถ๋ ฅํ๋ฉด ์ฑ์ฒ
๐ฏKAKAO API๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ์ฃผ๋ณ ์ฝ๊ตญ ๊ฒ์
๐์์กด์ฑ
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
</dependencies>
๐MODEL Class
MyAddress.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyAddress {
private String query;
private String latitude;
private String longitude;
private int radius;
}
|
cs |
๊ฒ์ํ ๋ด ์ฃผ๋ณ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ฐ์ฒด
๊ฒ์ ์ฟผ๋ฆฌ์ ๊ฑฐ๋ฆฌ ๊ทธ๋ฆฌ๊ณ ์๋ต์ผ๋ก ์จ ๊ฒฝ๋, ์๋๋ฅผ ์ ์ฅํ property๋ฅผ ๊ฐ๊ณ ์๋ค.
Getter ์ Setter ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ์์ฑ์์ ๋ชจ๋ ์๊ท๋จผํธ๊ฐ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด๊ฐ ์์ฑ์๋ lombok API๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ก ์ค์ ํด์คฌ๋ค.
Pharmacy.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pharmacy implements Comparable<Pharmacy> {
private String url;
private String businessName;
private String address;
private String phoneNumber;
private Float distance;
@Override
public int compareTo(Pharmacy o) {
return (int) (this.getDistance() - o.getDistance());
}
}
|
cs |
๊ฒ์url์ฃผ์, ์ํธ๋ช , ์ฃผ์, ์ ํ๋ฒํธ๋ฅผ ์ ์ฅํ ์ฝ๊ตญ ๊ฐ์ฒด
๋์ค์ ์ฝ๊ตญ ๋ฆฌ์คํธ๋ฅผ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ์์ผ๋ก ๋์ดํ๊ธฐ ์ํด Comparable interface๋ฅผ implements ํ์ฌ compareTo() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ฃผ์๋ค.
๐์๋ฃจ์
์์ฒญ๊ณผ ์๋ต์ apache์์ ์ ๊ณตํ๋ HttpClient API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ์๋ค.
๊ฒ์ ์์น ์ฐพ๊ธฐ
kakao developers ์ ์ง๋/๋ก์ปฌ ์์ "ํค์๋๋ก ์ฅ์ ๊ฒ์ํ๊ธฐ" API๋ฅผ ์ฌ์ฉํ์๋ค.
ํ๋ผ๋ฏธํฐ๋ก ๊ฒ์ ํค์๋๋ฅผ ๋ฐ์ ํ ๊ฒ์์ ํ์ ๋ ๋์ด์ฐ๊ธฐ๊ฐ ์์ ์ ์์ผ๋ ๊ณต๋ฐฑ์ ์ง์ด ํ ํ๋์ ์ฟผ๋ฆฌ๋ ๋ง๋ค์ด ์ฟผ๋ฆฌ ์คํธ๋ง์ ๋ฃ์ด์ฃผ์๋ค.
ํค๋์๋ ์ธ์ฆ ๊ฐ์ธ API Key ๋ฅผ ํ์๋ก ๋ณด๋ด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฃ์ด์ ๋ณด๋ด์ฃผ์๋ค.
์ถ๋ ฅ์ผ๋ก๋ ์๋ต์ ์ํฐํฐ๋ก ๋ฐ์ json ํํ๋ก ๋ณด๋ด์จ ์๋ต์ jsonobject๋ก ๋ฐ๊ณ ๋ฐฐ์ด์ธ documents๋ฅผ ํ์ฑํ ํ ์ ค ์ฒซ๋ฒ์งธ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ ์ํด์ 0์ ๋ฃ์ด ์ฒซ๋ฒ์งธ jsonobject๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ดํ์๋ ํค๊ฐ์ ๋ง๋ ๋ฐธ๋ฅ๋ฅผ ํ์ฑํ์ฌ MyAddress ๊ฐ์ฒด์์ ๋ฃ์ด์ค ํ ๋ฆฌํดํ๋ค.
๊ทผ์ฒ ์ฝ๊ตญ ์์น ์ฐพ๊ธฐ
kakao developers ์ ์ง๋/๋ก์ปฌ ์์ "์นดํ ๊ณ ๋ฆฌ๋ก ์ฅ์ ๊ฒ์ํ๊ธฐ" API๋ฅผ ์ฌ์ฉํ์๋ค.
์นดํ ๊ณ ๋ฆฌ ๊ทธ๋ฃน ์ฝ๋๋ ์ฝ๊ตญ์ ๊ฒ์ํ๊ธฐ ์ํด ์ฝ๊ตญ ์ฝ๋์ธ PM9์ ๋ฃ๊ณ ์์์ ์ป์ ๊ฒฝ๋ , ์๋์ ๊ฒ์ํ ๋ ๋ฃ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฃ์ด์ GET ์์ฒญ ํด์ค๋ค.
์๋ต์ผ๋ก ์จ ์๋ต ์ํฐํฐ๋ฅผ JSONObject๋ก ํ์ฑํ์ฌ JSON ๋ฐฐ์ด์ ์ถ์ถํ๊ณ ์ฝ๊ตญ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐฐ์ด์ ํฌ๊ธฐ๋งํผ ์ฝ๊ตญ์ ์ ๋ณด๋ค์ ํค ๊ฐ์ ํตํด ํ์ฑํ์ฌ ์ ์ฅํ๋ค. ์ฝ๊ตญ ๊ฐ์ฒด๋ ์ฝ๊ตญ ๋ฆฌ์คํธ์ ๋ฌถ์ด ๋ฆฌํดํด์ค๋ค.
url์ ์ฝ์์ ์ ๋ ฅํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์นํ์ด์ง ๋ํ๋ด๊ธฐ
์๋ฐ์์ ์ ๊ณตํ๋ java.net.URI ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์์ url๋ฅผ ์ ๋ ฅํ์ ๋ ๋ฐ๋ก ๋ธ๋ผ์ฐ์ ์ ์นํ๋ฉด์ ๋์ฐ๊ฒ ํ๋ค.
๐ช์คํ ๊ฒฐ๊ณผ
์ ๋ ฅ ํ๋ฉด
์ถ๋ ฅ ํ๋ฉด
๐คํ๋ก์ ํธ ํ๊ณ
์ ๋ฐ์ ์ธ ๋์ด๋๋ ์ฌ์ด ํธ์ด์๋ ๊ฒ ๊ฐ๋ค.
์ฒ์ ์์น ํค์๋๋ฅผ ๋ฃ์ด ๊ฒ์ํ์๋ ์๋ชป๋ ์ฟผ๋ฆฌ๋ผ๋ ์ค๋ฅ๋ฅผ ๋ฐ์๋ค. ์ฟผ๋ฆฌ์ ๋์ด์ฐ๊ธฐ๊ฐ ๋์ด์์ผ๋ฉด ์ ๋๋ค๋ ๊ฑธ ์์๋ค. replaceAll()์ ์ฐ๊ธฐ์ strip()์ ์ผ๋๋ฐ๋ ์ฌ๋ฐฑ์ด ์ง์์ง์ง ์์ ์ฐพ์๋ณด๋ strip()์ ๋ฌธ์ฅ ์ฒ์๊ณผ ๋์ ์๋ ์ฌ๋ฐฑ๋ง์ ์ง์ฐ๋ ๊ฒ์์ ๋ฐฐ์ ๋ค. ์ฌ์ด์ฌ์ด์ ์๋ ๊ณต๋ฐฑ์ replaceAll() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ผ๋ง ํ๋ค. ์ด๋ ๊ณต๋ฐฑ์ ํํํ๋ ์ ๊ท์ ๋ํ ๋ฐฐ์ ๋ค.
์ฟผ๋ฆฌ์คํธ๋ง์ ํ์์ฝ๋ฉ ์์ผ๋ก ๋ง๊ณ ๋ ๊น๋ํ๊ฒ ํํํ ์ ์์ ๊ฑฐ ๊ฐ๋จ ์๊ฐ์ ํ๋ค. java.net.URI API๋ ์ฒ์ ์ฌ์ฉํด ๋ณด์๋๋ฐ, ์น ํ๋ก๊ทธ๋๋ฐ์ด ์๋๋ผ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์๊ฒ ๋ง๋ ๋ค๋ฉด ๊ฝค ๊ฐ๋ ฅํ ๊ธฐ์ ์ธ ๊ฒ ๊ฐ๋ค. ์๋์๋ฆฌ๊ฐ ๊ถ๊ธํ๋ค. ์ถ์ธกํด ๋ณด๊ฑด๋ฐ ์ด์์ฒด์ ๋ด์ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋ ๋ธ๋ผ์ฐ์ ์ URL์ ์ ์กํ์ฌ ์นํ์ด์ง๋ฅผ ๋์ธ ๊ฑฐ ๊ฐ๋ค.
์ฌ์ฐจ์ ์ฐจ ๋ค๋ฆฌ๋ ์์์ ์ํ๋ฉด ๋๊ตฐ๊ฐ๋ ExceptionHandler ๊น์ง ๋ง๋ค์ด ๊ตฌํ ํ๋ค๊ณ ํ๋๋ฐ, ๊ทธ์ ๋๊น์ง ํด์ผํ๋ ์๊ฐ์ ๋น ์ก๋ค. ๊ณผ์ ์์ ์ง์ผ์ผํ๋ ์ฌํญ์๋ง ํฌ๊ฑฐ์ค๋ฅผ ๋ง์ถ ๊ฑฐ ๊ฐ๊ธฐ๋ ํ๋ค. ๋ค์ ๊ณผ์ ์์ ์ข ๋ ์ ๊ฒฝ์ ์จ๋ด์ผ๊ฒ ๋ค.
๋๊ธ