[Spring Boot] Discord Bot(๋””์Šค์ฝ”๋“œ ๋ด‡) ๋งŒ๋“ค๊ธฐ - JAVA๋ฅผ ์ด์šฉํ•œ API ํ˜ธ์ถœ

2023. 3. 17. 22:27ใ†๊ฐœ๋… ์ •๋ฆฌ ์ž‘์—…์‹ค/Java

728x90
๋ฐ˜์‘ํ˜•




 

 

 

 

์ „์ž์ •๋ถ€ ํ‘œ์ค€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์–‘๋Œ€ ํ•ต์‹ฌ ๊ธฐ์ˆ  ์„ธํŠธ : ์Šคํ”„๋ง + ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 



๐Ÿ—‚ ๋ชฉ์ฐจ

1. [Spring Boot] Discord Bot(๋””์Šค์ฝ”๋“œ ๋ด‡) ๋งŒ๋“ค๊ธฐ
2. [Spring Boot] Discord Bot(๋””์Šค์ฝ”๋“œ ๋ด‡) ๋งŒ๋“ค๊ธฐ - Spring Boot(์Šคํ”„๋ง ๋ถ€ํŠธ)๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ API ๋งŒ๋“ค๊ธฐ feat.Mybatis(๋งˆ์ด๋ฐ”ํ‹ฐ์Šค)

3. [Spring Boot] Discord Bot(๋””์Šค์ฝ”๋“œ ๋ด‡) ๋งŒ๋“ค๊ธฐ - JAVA๋ฅผ ์ด์šฉํ•œ API ํ˜ธ์ถœ

4. [Spring Boot] Discord Bot(๋””์Šค์ฝ”๋“œ ๋ด‡) ๋งŒ๋“ค๊ธฐ - ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ์ด์šฉํ•˜์—ฌ API ํ˜ธ์ถœ

 

 

 

 

 

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

    ๐Ÿ”ฝ  ๊ฐœ์š”

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ์ง€๋‚œ ์‹œ๊ฐ„์— ๊ฐ„๋‹จํ•œ ๋ชฉ๋ก ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  API๋ฅผ JAVA(์ž๋ฐ”)๋ฅผ ์ด์šฉํ•ด์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋ ค๊ณ  ํ•ด์š”.

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ํ†ตํ•ด ํ•ด๋‹น API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

API๊ฐ€ ํ•„์š”ํ•˜์‹  ๋ถ„๋“ค์€ ์ด ๊ณณ์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”.



 

All in One Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ : Spring Hibernate MyBatis๋ฅผ ํ™œ์šฉํ•œ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

 

 

GitHub - junyharang-personal-project/juny-discord-bot-test: JDA๋ฅผ ์ด์šฉํ•œ Spring Boot Discord Bot ์—ฐ์Šต์ด์—์š”.

JDA๋ฅผ ์ด์šฉํ•œ Spring Boot Discord Bot ์—ฐ์Šต์ด์—์š”. Contribute to junyharang-personal-project/juny-discord-bot-test development by creating an account on GitHub.

github.com

 

 

 

 

 

    ๐Ÿ”ฝ HTTP Util

์ตœ์ดˆ JAVA๋ฅผ ์ด์šฉํ•ด์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ URL ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ํ•ด ์ค„๊ฑฐ์—์š”.

URL์€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์žˆ๋Š”์ง€์™€ ์–ด๋–ค ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ , ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์—†์„ ๋•Œ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ์ •ํ™•ํ•œ URL์„ ๋งŒ๋“ค๊ณ , API๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•ด์š”.

com/junyss/discordbottest/common/util/HttpUtil.java 1 ~ 38๋ฒˆ์งธ ์ค„

 

crewByAll()์€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด ์—†์ด ๋ชจ๋“  ํฌ๋ฃจ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•  ๋•Œ, ํ˜ธ์ถœ๋˜๋Š” Method(๋ฉ”์†Œ๋“œ)์—์š”.

URL์„ ๋งŒ๋“ค ๋•Œ,  IOException์ด ํ„ฐ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— try-catch ๋ฌธ์œผ๋กœ ๊ฐ์‹ธ์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๊ณ , SpringBootAPICaller.callApi()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, HTTP Method ๊ฐ’๊ณผ URL ๊ฐ’์„ ๋งŒ๋“ค์–ด ๋˜์ ธ ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค API ํ˜ธ์ถœ์„ ํ†ตํ•ด Data Base(๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค)์— ์กฐํšŒ๋œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

์ฐธ๊ณ ๋กœ URL ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, URL ํ˜•์‹์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ MalformedURLException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์š”. ํ•ด๋‹น Exception์€ IOException์— ์ž์‹ Exception Class์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋‹ˆ๋Š” IOException์„ Catch๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.


com/junyss/discordbottest/common/util/HttpUtil.java 47 ~ 57๋ฒˆ์งธ ์ค„

 

crewBySearchOption()์€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์žˆ์„ ๋•Œ, ํ˜ธ์ถœ ๋˜๋Š” ๋ฉ”์†Œ๋“œ์—์š”.

ํ•ด๋‹น ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ , URL์„ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ URL์„ ๋งŒ๋“ค์–ด์„œ SpringBootAPICaller.callApi()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ API ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์กฐํšŒ๋œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.


com/junyss/discordbottest/common/util/HttpUtil.java 58 ~ 93๋ฒˆ์งธ ์ค„

 

์–ด์ฉŒ๋ฉด HttpUtil Class์—์„œ makeURL()์ด ๊ฐ€์žฅ ๋ณต์žกํ•˜๊ณ , ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ฒ ์–ด์š”.

makeURL()์€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๋‹ด์€ DTO๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜์š”.

์ตœ์ดˆ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์—†์–ด๋„ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์“ฐ์ด๋Š” ๊ธฐ๋ณธ URL ๊ฐ’์„ defaultUrl ๋ฌธ์ž์—ด ๋ณ€์ˆ˜์— ๋„ฃ์–ด ์ฃผ์—ˆ์–ด์š”.

makeURL()์— ์ง„์ž…ํ•˜๊ฒŒ ๋˜๋ฉด DTO ๊ฐ์ฒด์— ์–ด๋–ค ๊ฐ’์ด ์žˆ๋Š๋ƒ๋ฅผ ํ™•์ธํ•˜์—ฌ URL์„ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
์ฐธ๊ณ ๋กœ URL Parameter(๋งค๊ฐœ ๋ณ€์ˆ˜)์˜ Key (ํ‚ค - ์—ด์‡ ) ๊ฐ’์€ URLEncode.encode()๋ฅผ ํ†ตํ•ด ์ธ์ฝ”๋”ฉ ํ•ด์ฃผ๋ฉด API ํ˜ธ์ถœ์„ ํ•  ๋•Œ, ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์ธ์ฝ”๋”ฉ์ด ๋˜๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฑฐ์—์š”.

๊ทธ๋ž˜์„œ ํ‚ค ๊ฐ’์€ ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ , ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ Value(๊ฐ’)๋งŒ ์ธ์ฝ”๋”ฉ ํ•˜๋„๋ก ํ•˜์—ฌ ๋ฌธ์ž์—ด์ด ํ•ฉ์ณ ์ง€๋„๋ก ํ•˜์˜€์–ด์š”.

๋จผ์ € if๋ฌธ์„ ํ†ตํ•ด DTO์— ๋ชจ๋“  ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด Null์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๊ณ , Null์ด ์•„๋‹ˆ๋ผ๋ฉด URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ทธ์— ๋งž๊ฒŒ ์ƒ์„ฑ์„ ํ•ด์ฃผ๋Š” ๊ฑฐ์—์š”.

๊ทธ๋ ‡๊ฒŒ else if()๋ฅผ ํ†ตํ•ด์„œ DTO์— ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , URL์„ ๋งŒ๋“ค์–ด ์ค€ ๋’ค ๋งŒ๋“ค์–ด์ง„ URL ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ์—ˆ์–ด์š”.


com/junyss/discordbottest/api/common/constant/APIUriInfo.java 1 ~ 9๋ฒˆ์งธ ์ค„

 


์œ„ Interface(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ํ†ตํ•ด URL ๊ด€๋ จ String(๋ฌธ์ž์—ด) ๊ฐ’๋“ค์„ ์ •์˜ํ•˜๊ณ , ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

 

 

 

    ๐Ÿ”ฝ API Caller


com/junyss/discordbottest/common/SpringBootAPICaller.java 1 ~ 13๋ฒˆ์งธ ์ค„

 

 

com/junyss/discordbottest/common/SpringBootAPICaller.java 14 ~ 48๋ฒˆ์งธ ์ค„

๋ฐ˜์‘ํ˜•

 

ํ•ด๋‹น ๊ฐ์ฒด๋Š” JAVA๋ฅผ ์ด์šฉํ•ด์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ฐ์ฒด์—์š”.

์‹ค์ œ API ํ˜ธ์ถœ์„ ๋‹ด๋‹นํ•˜๋Š” callApi()์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฒŒ์š”.

ํ•ด๋‹น Method(๋ฉ”์†Œ๋“œ)๋Š” HTTP Method์™€ URL์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
HTTP Method๋Š” GET ํ˜น์€ POST ๋“ฑ์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ›๊ฒŒ ๋˜์š”.

๊ทธ๋ฆฌ๊ณ , API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์ž…๋ ฅ ํ˜น์€ ์ถœ๋ ฅ ๊ด€๋ จํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์— ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด throws IOException์„ ๋ช…์‹œํ•ด ์ฃผ์—ˆ์–ด์š”.

31๋ฒˆ์งธ ์ค„์— StringBuilder ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์–ด์š”.


32๋ฒˆ์งธ ์ค„์— API ์—ฐ๊ฒฐ์„ ์œ„ํ•ด HttpURLConnection ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š”๋ฐ, URL ๊ฐ์ฒด์˜ openConnection()์„ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ’์„ HttpURLConnection ๊ฐ์ฒด๋กœ ํ˜• ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

URL ๊ฐ์ฒด์˜ openConnection()์„ ํ†ตํ•ด URLConnection ๊ฐ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”. ๋งŒ์•ฝ Protocol(ํ”„๋กœํ† ์ฝœ)์ด http:// ์ธ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋ฅผ HttpURLConnection ๊ฐ์ฒด๋กœ ํ˜• ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ฅผ ์œ„ํ•ด 32๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์ด ํ•ด ์ค€ ๊ฑฐ์—์š”.

33 ~ 37๋ฒˆ์งธ๊นŒ์ง€ ์‹ค์ œ๋กœ URLConnection ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์ž‘์—…์„ ํ•ด ์ฃผ์—ˆ์–ด์š”.

์‹ค์ œ๋กœ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์ „์— Time Out(ํƒ€์ž„์•„์›ƒ), Cache(์บ์‹œ), HTTP Request Method (HTTP ์š”์ฒญ ๋ฐฉ๋ฒ•) ๋“ฑ๊ณผ ๊ฐ™์ด Client(ํด๋ผ์ด์–ธํŠธ)์™€ Server(์„œ๋ฒ„) ๊ฐ„ ๋‹ค์–‘ํ•œ Option(์˜ต์…˜)์„ ์„ค์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๊ฒƒ์„ URLConnection ํด๋ž˜์Šค ์•ˆ์— ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํ•ด ์ค„ ์ˆ˜ ์žˆ๊ตฌ์š”.

โˆ™ setRequestMethod(String method) : HTTP Method(๋ฉ”์†Œ๋“œ) GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE ์ค‘ ํ•˜๋‚˜์ธ URL ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ ์„ค์ •. Default Value is GET (๊ธฐ๋ณธ๊ฐ’์€ GET)

โˆ™ setConnectTimeout(int timeout) : HTTP ์—ฐ๊ฒฐ ์ œํ•œ ์‹œ๊ฐ„ ์„ค์ •(๋‹จ์œ„๋Š” ms(๋ฐ€๋ฆฌ ์ดˆ))ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ œํ•œ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๊ณ , ์—ฐ๊ฒฐ์˜ ์ž…๋ ฅ Stream(์ŠคํŠธ๋ฆผ)์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” DATA(๋ฐ์ดํ„ฐ)๊ฐ€ ์—†์œผ๋ฉด SocketTimeoutException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ 0์ด๋ฉด, ๋ฌดํ•œ๋Œ€ ์ œํ•œ ์‹œ๊ฐ„ ์„ค์ •.

โˆ™ setRequestProperty (String key, String value) : ํ‚ค์™€ ๊ฐ’(Key=value) ์Œ์œผ๋กœ ์ง€์ •๋œ ์ผ๋ฐ˜ ์š”์ฒญ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ํ‚ค๊ฐ€ ์žˆ๋Š” ์†์„ฑ์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด์ „ ๊ฐ’์„ ์ƒˆ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋Š” ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ผ๋ถ€ ๋ฉ”์†Œ๋“œ๋Š” ์—ฐ๊ฒฐ์ด ์ด๋ฏธ ์„ค์ •๋œ ๊ฒฝ์šฐ IllegalStateException์„ ๋ฐœ์ƒ ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ, ์ž์‹ ํด๋ž˜์Šค HttpURLConnection์€ HTTP ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

โˆ™ setDoOutput(boolean doOutput) : URLConnection์ด Server(์„œ๋ฒ„)์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’์€ false - ๊ฑฐ์ง“)

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
๋˜๋‹ค๋ฅธ URLConnection Class ์•ˆ์˜ Method

1. setReadTimeout (int timeout) : ์ฝ๊ธฐ ์ œํ•œ ์‹œ๊ฐ„ ๊ฐ’ ์„ค์ •(๋‹จ์œ„ ๋ฐ€๋ฆฌ์ดˆ). ์ œํ•œ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๊ณ , ์—ฐ๊ฒฐ์˜ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ SocketTimeoutException์ด ํ„ฐ์ง„๋‹ค. ํ•ด๋‹น ์„ค์ • ๊ฐ’์ด 0์ด๋ฉด ๋ฌดํ•œ๋Œ€๋ฅผ ์˜๋ฏธ.

2. setDefulatUseCaches (boolean defulat) : URLConnection์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ์„ค์ •. (๊ธฐ๋ณธ๊ฐ’์€ True) ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” URLConnection ํด๋ž˜์Šค์˜ ๋‹ค์Œ ์ธ์Šคํ„ด์Šค์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

3. setUseCaches (boolean useCaches) : ์—ฐ๊ฒฐ์ด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ์„ค์ •(๊ธฐ๋ณธ๊ฐ’ True).

4. setDoInput (boolean doInput) : URLConnection์„ ์„œ๋ฒ„์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ๋Š”๋ฐ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’ True).

5. selfModifiedSince (long itme) : ์ฃผ๋กœ HTTP Protocol(ํ”„๋กœํ† ์ฝœ)์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฒ€์ƒ‰ํ•œ ์ฝ˜ํ…์ธ ์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์„ ์ƒˆ๋กœ ์„ค์ •. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„ ์ดํ›„ ์ •์  ์ฝ˜ํ…์ธ (Image, HTML ๋“ฑ)๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ , HTTP Statue Code(HTTP ์ƒํƒœ ์ฝ”๋“œ) 304 - ์ˆ˜์ •๋˜์ง€ ์•Š์Œ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„๋ณด๋‹ค ์ตœ๊ทผ์— ์ˆ˜์ •๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

6. setAllowUserInteraction (boolean allow) : ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์„ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™” ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธ์ฆ ๋Œ€ํ™” ์ƒ์ž ํ‘œ์‹œ ๋“ฑ.(๊ธฐ๋ณธ๊ฐ’ false)

7. setDefaultAllowUserInteraction (boolean default) : ์ดํ›„ ๋ชจ๋“  URLConnection ๊ฐ์ฒด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์˜ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •.

8. setFixedLengthStreamingMode (long contentLength) : ์ฝ˜ํ…์ธ  ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€ ๋ฒ„ํผ๋ง ์—†์ด HTTP ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

9. setFollowRedirects (boolean follow) : HTTP Redirection(๋ฆฌ๋‹ค์ด๋ ‰์…˜) ๋’ค์— HttpURLConnection ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋”ฐ๋ผ์™€์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ์„ค์ •. (๊ธฐ๋ณธ๊ฐ’ True) 

10. setInstanceFollowRedirects (boolean follow) : HTTP ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋’ค HttpURLConnection ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋”ฐ๋ผ์™€์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ์„ค์ •(๊ธฐ๋ณธ๊ฐ’ True)ํ•˜๋ฉฐ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” Setter(์„ธํ„ฐ)์ด๋ฉฐ, URLConnection๊ณผ HttpURLConnection ํด๋ž˜์Šค๋Š” ํ•ด๋‹น Getter(๊ฐœํ„ฐ)๋„ ์ œ๊ณต. 

 

com/junyss/discordbottest/common/SpringBootAPICaller.java 14 ~ 48๋ฒˆ์งธ ์ค„

 


์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด API๋ฅผ ์„ค์ •ํ•œ ๊ฐ’์— ๋”ฐ๋ผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ , 39๋ฒˆ์งธ ์ค„์— ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘ HTTP ์‘๋‹ต ๊ฒฐ๊ณผ ์ฝ”๋“œ๊ฐ€ 200 ์ฆ‰, OK๋ผ๋ฉด 40 ~ 48๋ฒˆ์งธ ์ค„์ด ์ž‘๋™ํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

์ตœ์ดˆ 40๋ฒˆ์งธ ์ค„์— try-with-resource ๋ฌธ์„ ํ†ตํ•ด BufferReader๊ฐ€ ๋ชจ๋“  ์‚ฌ์šฉ์„ ๋๋‚ด๊ณ , ๋‹ซํž ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

HttpURLConnection ๊ฐ์ฒด์— getInputStream()์„ ํ†ตํ•ด URL ํด๋ž˜์Šค์˜ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์„ค์ • ์ฆ‰, URL ํด๋ž˜์Šค๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ž์›์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ BufferdReader ๊ฐ์ฒด๋กœ ๊ฑฐ์ณ์„œ ๋ฐ›์•„ ์˜ค๋Š”๋ฐ, ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ InputStream ๊ฐ์ฒด๋กœ ๋ฐ›์•„์˜ค๊ฒŒ ๋˜๋ฉด ์ด๋Š” Byte(๋ฐ”์ดํŠธ) ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ธ€๊ณผ ๊ฐ™์ด ASCII Code(์•„์Šคํ‚ค) ์ฝ”๋“œ ์™ธ์— ๊ธ€์ž๋“ค์ด ๊นจ์ง€๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

728x90

๊ทธ๋Ÿฐ ๋’ค JSON ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด JSONObject ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๊ณ , API์—์„œ ๋ฐ›์•„์˜จ DATA ๊ฐ’์„ ๋ฐ›์•„์ค„ line ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ์ฃผ์—ˆ์–ด์š”.

44๋ฒˆ์งธ ์ค„์— bufferReader์˜ readLine()์ด Null์ด ์•„๋‹ˆ๋ฉด ์ฆ‰, API๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ฐ’์„ ๋ฐ›์•„์™”๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ line์— ๋„ฃ๊ฒŒ ํ•˜๊ณ , JSONObject ๊ฐ์ฒด์— ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ์–ด JSON Type์œผ๋กœ ๋ณ€ํ™˜๋˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

48๋ฒˆ์งธ ์ค„์— JSON์—๋Š” 

Response Value


์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ฐ’์„ ๋ฐ›์•„ ์™”๊ธฐ ๋•Œ๋ฌธ์— JSON ๊ฐ’ ์ค‘ data๋ผ๋Š” ํ‚ค์˜ ๊ฐ’์„ ๊บผ๋‚ด data ๋ผ๋Š” JSONArray ๋ณ€์ˆ˜์— ๋„ฃ์–ด ์ฃผ์—ˆ์–ด์š”.

 

 

com/junyss/discordbottest/common/SpringBootAPICaller.java 50 ~ 77๋ฒˆ์งธ ์ค„


๊ทธ๋Ÿฐ ๋’ค ๋ฐ˜๋ณต๋ฌธ์„ data๋ผ๋Š” JSONArray ๋ฐฐ์—ด ํฌ๊ธฐ ๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค ์ฃผ๋ฉด์„œ ๋‹ค์‹œ ํ•ด๋‹น ๋ฐฐ์—ด์— index ๋ฒˆ์งธ ๊ฐ’์„ ๊บผ๋‚ด JSONObject ๊ฐ์ฒดํ˜• ๋ณ€์ˆ˜ dataJSONObject์— ๋‹ด์•„ ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค ์œ„์—์„œ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋˜ StringBuilder ๊ฐ์ฒด ๋ณ€์ˆ˜ resultMessage์— ์ฃผ๋‹ˆ๊ฐ€ ๋ฐ›๊ณ  ์‹ถ์€๋Œ€๋กœ ์š”๋ฆฌํ•˜์—ฌ API๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ๊ฐ’๋“ค์„ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ€๊ณตํ•œ ๋’ค StringBuilder ๊ฐ์ฒด toString()์„ ํ†ตํ•ด ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•˜์—ฌ ์ฃผ์—ˆ์–ด์š”.

ํ•˜์ง€๋งŒ, API ํ†ต์‹ ์ด ์‹คํŒจํ•˜์—ฌ ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ 200์ด ์•„๋‹ˆ๋ผ๋ฉด else ์ ˆ์„ ํ†ตํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹จ ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธํŠธ ์ฆ‰, ๋””์Šค์ฝ”๋“œ ๋ด‡์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜ํ™˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๋ณด๋‚ด์ฃผ๋„๋ก ํ•˜์˜€์–ด์š”.

๊ทผ๋ฐ if๋ฌธ์—๋„ ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๊ณ , else ๋ฌธ์—๋„ ๋“ค์–ด์˜ค์ง€ ๋ชปํ•œ ์–ด๋–ค ๋ฌธ์ œ๋Š” 75๋ฒˆ์งธ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋˜๊ฒŒ ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Œ์„ ์•Œ๋ฆฌ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

 

์ด๋ฒˆ์—๋Š” ์ด๋ ‡๊ฒŒ JAVA๋ฅผ ์ด์šฉํ•ด์„œ API์— ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์–ด์š”.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ์ด์šฉํ•ด์„œ ์ด๋ฒˆ์— ๋งŒ๋“  API ํ˜ธ์ถœ์„ ์œ„ํ•œ ํด๋ž˜์Šค๋“ค์„ ์ด์šฉํ•ด์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋‚ด์— ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ์›ํ•˜๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋ฉด์„œ ๊ฐ€๊ณตํ•ด์„œ ๋ฐ›์•„ ๋ณด๋Š” ๊ฒƒ์„ ์ •๋ฆฌํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

 

 

 

 

 

GitHub - junyharang-personal-project/juny-discord-bot-test: JDA๋ฅผ ์ด์šฉํ•œ Spring Boot Discord Bot ์—ฐ์Šต์ด์—์š”.

JDA๋ฅผ ์ด์šฉํ•œ Spring Boot Discord Bot ์—ฐ์Šต์ด์—์š”. Contribute to junyharang-personal-project/juny-discord-bot-test development by creating an account on GitHub.

github.com

 

์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  Source Code(์†Œ์Šค ์ฝ”๋“œ)๊ฐ€ ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ์œ„์— Git Hub ๋งํฌ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ค€๋น„ํ•ด ๋‘์—ˆ์–ด์š”.









 

All in One Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ : Spring Hibernate MyBatis๋ฅผ ํ™œ์šฉํ•œ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•