์ด๋ฒ ํฌ์คํธ๋ ํ๋ก์ ํธ ๋๋ฒ์งธ ์ด์ ํ์ฑํ ๋ฐ์ดํฐ๋ก DB๊ตฌ์ถํ๊ธฐ์ ์ผ๋ถ ์ธ๋ฒ์งธ ์ด์๊ฐ ํฌํจ๋์ด์๋ค. ๋๋ ๋ผ๋ฒจ์ ํตํด ๋ฏธ๋ฆฌ ์ค๋นํด์ผํ๋ ๋ถ๋ถ์ Preparations
๋ก ๊ฐ๋ฐ๋ถ๋ถ์ feature
๋ก ๊ตฌ๋ถํ๊ณ ์๋ค.
์ ๋ช ํ ๋ฆฌ๊ทธ์ค๋ธ๋ ์ ๋ ์ ์ ์ฌ์ดํธ๋ฅผ ํด๋ก ์ฝ๋ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด๊ธฐ๋ก ํ๋ค. ํผ์์ ์งํํ๋๋งํผ 1์ฐจ์ ์ธ ๋ชฉํ๋ ๊ฐ๋จํ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ๋ก ํ๋ค.
๐จ RESTFUL Project ๐จ โข RIOT API + Spring Boot + AWS EC2 & RDS
์๊ฐ์ด ์ง๋์ ์ด ์๋น์ค๊ฐ ๊ณ์ ์ ์ง๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๋น์ฅ ๋ช๊ฐ์๋์์ ์๋น์ค๋ฅผ ํด๊ณ ์ถ์๋ง์์ AWS ํ๋ฆฌํฐ์ด๋ฅผ ์ด์ฉํด DB ๋ฐ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๊ธฐ๋ก ํ๋ค.
DB๋ MySQL 8.0.16 ๋ฒ์ ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. RDS๋ฅผ ์์ฑํ๋ฉฐ ํ๋ฆฌํฐ์ด ์ค์ ์์ ํฌ๊ฒ ๋ฐ๊พผ๊ฒ์ ์๊ณ , ๋จ์ํ ์ธ์ฝ๋ฉ์ utf-8๋ก ๋ฐ๊พธ๊ณ public access ํ์ฉ๊ณผ ๋ณด์์ฌํญ์ ๋ํด์๋ง ์์ ํ๋ค.
์ฌ์ค DB๋ฅผ ์ค๊ณํ๊ธฐ์๋ ์ง์์ด ๋ง์ด ๋ถ์กฑํ๊ณ ๊ฒฝํ๋ ๋ถ์กฑํ๋ค. ๊ทธ๋์ DB๋ฅผ ์ค๊ณํ๊ธฐ์ ์์์ ๋ค์๊ณผ๊ฐ์ ์๋ฌธ์ ์ด ๋ ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ณด ์์ฒญ์ ๋ฐ์ดํฐ๋ฅผ RIOT API์์ ๋ค์ด๋ ํธ๋ก ์ ๊ณตํด์ค๋ ๊ด์ฐฎ์๊น?
๋ค์ด๋ ํธ ์ ๊ณต์ด ๋ง๋ค๊ณ ํด๋ MVC๊ตฌ์กฐ ์ฐ์ต์์ํด DB๋ฅผ ์ฌ์ฉํ๊ณ ์ํ๋๋ฐ, ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋๋๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๊น?
๊ทธ๋์ OKKY์ ์ง๋ฌธ์ ๋์ผํ๊ฒ ์ฌ๋ ธ๋ค. ๋ฏผ๊ฐํ ๋๋ต์ธ์ง ๋ด๊ฐ ๋๋ฌด ๋์์์ด ๋ฌผ์ด๋ณธ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ต๊ธ์ด ํ๋๋ ์๋ฌ๋ ธ๋ค....
์ผ๋จ ์ ์ณ๋๊ณ ๋๋ฆ๋๋ก์ ๋ ผ๋ฆฌ๋ฅผ๊ฐ์ง๊ณ DB๋ฅผ ์ฝ์์ผ๋ก ๊ตฌ์ฑํ๊ธฐ๋กํ๋ค. ์ผ๋จ ์ฒซ๋ฒ์งธ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๊ฒ์ธ๊ฐ๋ฅผ ์๊ฐํด๋ณด์๋ค.
์๋ ์น ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์ฒ์์ผ๋ก ๋ง์ดํ ๋ชจ์ต์ธ๋ฐ, ๊ฒ์์ฐฝ์ ์ํ์ฌ ๋๋ค์์ ์ณ์ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์๋ ํ์์ผ๋ก ๊ตฌ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๋ฒํผ์ ๋๋ฅด๊ฒ ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์์ ์ ๋ณด๊ฐ ๋์จ๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ์ค ์ํ์ฌ ๋๋ค์์ํฌํจํด์ ์์ ๋์ดํ ๋ชจ๋ ๊ฒ์ด ์ธ์ ๋ ์ง ๋ณํ ์์๋ ๋ด์ฉ์ด๋ผ์, ์ฆ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฉ์ด ๋์ด์ผํ๋ฏ๋ก DB์ ์ ์ฅํ๋๊ฒ๋ณด๋ค API์์ ๊ฐ์ ธ์ค๋๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ๋๊ผ๋ค.
๊ทธ๋ฌ๋ ์ธ์ ๊น์ง๋ ์ฐ์ต์ ํฌ์ปค์ฑ์ ํ๊ธฐ๋๋ฌธ์ ์ ์ด๋ ํ๊ฐ์ง ํ ์ด๋ธ์ ๋ํด์๋ ๋ง๋ค๊ธฐ๋กํ๋ค. ๊ทธ๋์ ์ํ์ฌ ๋๋ค์์ ํตํด์ API๋ก ๋ถํฐ ์ป์ด์จ ์ํ์ฌ ์ ๋ณด๋ฅผ DB์ ๊ตฌ์ถํ๊ธฐ๋ก ํ๋ค. ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ ๊ฒ ์ฌ์ฉ์ ์ ๋ณด์ ๋ํ ๋ฐ์ดํฐ๋ง DB์ ์ผ๋จ ๊ตฌ์ถํด๋๊ณ ๋์ค์ ํ์์ ์ถ๊ฐํ๊ธฐ๋ก ํ๋ค.
๋จผ์ Spring boot๋ฅผ ์ด์ฉํด์ RESTํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ฆด๊ฒ์ด๊ธฐ๋๋ฌธ์ RestController ๋ฐ์์ ์์ ํ๋ค. ๋ํ maven 2.27 ๋ฒ์ , jdk 1.8์์ ์งํํ์ผ๋ฉฐ, ์ถ๊ฐ์ ์ธ dependency๋ ๊ธฐ๋ณธ jackson๊ณผ ์ถ๊ฐ์ ์ธ mybatis, junit๋ฑ์ ๋ฃ์ด์ ์งํํ๋ค.
๋จผ์ DB์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์ํ์ฌ ์ ๋ณด๊ฐ ์๋์ง ํ์ธํ๋ค.
@GetMapping(value = "/summoner/{name}")
public ResponseEntity<Summoner> summoner(@PathVariable String name) {
Summoner summoner = new Summoner();
summoner = summonerService.findByName(name); // ์ํ์ฌ ์ ๋ณด ์กฐํ
if(summoner != null && !summoner.equals(null)) {
return new ResponseEntity<Summoner>(summoner,HttpStatus.OK);
}
return new ResponseEntity<Summoner>(HttpStatus.NO_CONTENT);
}
Summoner ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ํ์ฌ ์ด๋ฆ์ ํตํด ์ํ์ฌ ์ ๋ณด๋ฅผ ์ป์ด์ค๊ฒ ํ๋ค. ์ดํ์ ๋ก์ง์๋ ํฐ ๋ค๋ฅธ ์ ์ด ์์ด์ ์๋ตํ๊ณ , SummonerMapper.xml์์ ์์ฑํ ์ฟผ๋ฆฌ๋ฌธ์ ํ์ธํด๋ณด์.
<mapper namespace="com.junho.mapper.SummonerMapper">
<select id="findByName" resultType="com.junho.dto.Summoner">
SELECT * FROM USR_INFO WHERE NAME = #{name};
</select>
</mapper>
๊ฐ๋จํ๊ฒ SELECT๋ฌธ์ ํตํด์ ์ ๋ณด๋ฅผ ์ป์ด์๋ค. id๋ SummonerMapper.java์ ๋ฉ์๋ ์ด๋ฆ๊ณผ ๋ง์ถฐ์ฃผ์๊ณ , resultType์ Summoner์ ๋ํ DTO๋ก ์ค์ ํด์ฃผ์๋ค.
์์์ ์ธ๊ธํ๋ฐ์๊ฐ์ด ์ฒ์๋ถํฐ DB์ ๋ฃ์ด๋์ง ์์ ์๊ฐ์ด๋ค. ๋ฐ๋ผ์ DB์ ์์ผ๋ฉด ์ฃผ์ ํด์ค์ผํ๋ ๋ก์ง์ ์ถ๊ฐํ๋ค.
summoner = summonerService.findByName(name); // ์ํ์ฌ ์ ๋ณด ์กฐํ
try {
System.out.println(summoner.getName() + " : DB์์ ์ฐพ์");
} catch(Exception e) { // DB์ ์๋ค๋ฉด API์์ ์ํ์ฌ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
SummonerParser summonerParser = new SummonerParser();
summoner = summonerParser.getJsonData(name);
summonerService.insertSummoner(summoner); // ์ํ์ฌ ์ ๋ณด DB์ ์ถ๊ฐ
}
}
findByName ์๋์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ค. ๋จผ์ DB์ ์ฐพ๊ณ ์ํ๋ ์ ๋ณด๊ฐ ์กด์ฌํ์ง์๋๋ค๋ฉด null Point Execption์ด ๋ฐ์ํ๋๋ฐ, ์ด๊ฒ์ '์' ์์ธ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ์ ์์๊ฐ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ summoner ์ ๋ณด๋ฅผ RIOT API๋ก๋ถํฐ ๊ฐ์ ธ์๋ค. (์์ธ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒํด์ผ ์ํ๋ค๊ณ ์๋ฌธ๋ ๊น์?)
๊ทธ๋ฆฌ๊ณ DB์ ๋ค์ ์ถ๊ฐํด์ฃผ๋ ๋ก์ง์ ์ํด์ insertSummoner๋ฅผ ํธ์ถํ๋ค.
<insert id="insertSummoner" parameterType="com.junho.dto.Summoner">
INSERT INTO USR_INFO VALUES(
#{accountId},
#{profileIconId},
#{revisionDate},
#{name},
#{id},
#{puuid},
#{summonerLevel})
</insert>
findByName๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ์ ํ ์ ํ์๊ณ , ๋ค๋ฅธ์ ์ resultType์ด ์๋ค๋ ์ ๊ณผ parameter๋ก ๋ฃ์ด์ค Summoner ๊ฐ์ฒด๋ฅผ ์ธ์ํ๊ธฐ์ํด์ parameterTpye์ Summoner DTO๋ก ์ค์ ํด์ฃผ์๋ค.
์ด๋ฒ์๋ AWS RDS๋ฅผ ๋ง๋ค์ด์ ํ
์ด๋ธ์ค๊ณ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ค์๊ฐ
์ด๋ผ๋ ์ ์์ ํผ๋์ด ์๋ค. ๊ฒ์์ ์ํ์ฌ ์์ด๋ ์ ๋ณด๋ ๋งค๋ฒ ๊ฐฑ์ ๋ฐ ์์ ์ด ๋ ํ
๊ณ , ์ ์ ๋ฆฌ์คํธ, ์๋ จ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐฑ์ ์ด ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ RIOT API๋ฅผ ์์กดํด์ผ๋ง ํ ๊น? ์ฌ๊ธฐ์ ๋ด๊ฐ ์๊ฐํ ๋ฐฉํฅ์ ์ด๋ ๋ค.
๊ทธ๋ฌ๋ 1๋ฒ์ ๋น๋ ์๊ฐ์ ์ ํํ์ ๋ณด๋ฅผ ์ ๋ฌํ์ง ๋ชปํ๋ค๋ ์ ์์ ์ ๋ฌ์ฌํญ์ด ์๊ธฐ๋๋ฌธ์ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ 3๋ฒ ๊ฐ์๊ฒฝ์ฐ ์ ์๋ฏธํ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๋จ๊ณ๋ ์๋๋ผ๊ณ ์๊ฐํด์ 2๋ฒ์ ์ฑํํด์ ์งํํ๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ RIOT API์์ ๋ค์ด๋ ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ฒ์ด ์ ๋ต์ด๋ผ๋ ๋๋์ ๋ฐ๋๋ค. ๊ทธ๋ฌ๋ MVCํจํด ๊ณต๋ถ๋ฅผ ์ํด์๋ผ๋ DB๋ฅผ ๊ตฌ์ถํ๊ธฐ๋ก ํ๊ธฐ๋๋ฌธ์ 2๋ฒ์ ๋ฐ๊ณ ๋๊ฐ๋ค. ์ด๋ ๊ฒ ๋ ํ๋ฒ ์ง์์ ํ๊ณ๋ฅผ ๋๋ผ๋ฉฐ ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ๊ฐ์ง๋ฉฐ 3ํธ์ ๋ง๋ฌด๋ฆฌํ๋ค.
Great