์ ์ฒด ๊ธ (18) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [2018 ์นด์นด์ค ๋ธ๋ผ์ธ๋ ์ฑ์ฉ] ์ถ์ ํธ๋ํฝ ๋ฌธ์ https://programmers.co.kr/learn/courses/30/lessons/17676 ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์. programmers.co.kr ์์ค์ฝ๋ import java.util.Arrays; class Solution { public int solution(String[] lines) { int[] tps = new int[24*60*60*1000 + 4000]; Arrays.stream(lines).forEach(log -> check(log, tps)); return Arrays.stream(tps).max().getAsInt(); }.. ๐ ์ค๋ง์ผ๊ฒ์ดํธ ์๋ฒ๊ฐ๋ฐ์บ ํ 4๊ธฐ - ํ๊ณ ์ค๋ง์ผ๊ฒ์ดํธ์์ ๋ ๋ฌ ๊ฐ ์งํ๋์๋ ์๋ฒ๊ฐ๋ฐ์บ ํ๊ฐ ์ข ๋ฃ๋์๋ค. ์ฝ๋ก๋ ๋๋ฌธ์ ๊ฐ์์ค๋ฝ๊ฒ ๋ง๋ฌด๋ฆฌ๋์ด ์์ฌ์ ์ง๋ง, ๋ง์ ๊ฒ์ ์ป์ ์ ์์๋ ์๊ฐ์ด์๋ค. ์ด๋ฒ ํฌ์คํ ์์ ์๋ฒ๊ฐ๋ฐ์บ ํ๋ฅผ ํตํด ์ป์ ์ ๊ณผ ๋๋์ ์ ๋ํด ์ ์ด๋ณด๋ คํ๋ค. RESTful API ๊ฐ๋ฐ ์ด๋ฒ ํ๋ก์ ํธ์์๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐ์ ์งํํ๊ฒ๋์๋ค. ๋ค์ด๋ฒ ๋ถ์คํธ์ฝ์ค๋ฅผ ์งํํ๋ฉฐ REST API๋ฅผ ๊ฐ๋ฐํด๋ดค์ง๋ง, ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ํ์ ํ์ฌ API๋ฅผ ๊ฐ๋ฐํ ๊ฒ์ ์ฒ์์ด์๊ณ , ์์ฃผ ์๋ก์ด ๊ฒฝํ์ด์๋ค. ์ผ๋จ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ์ ์ํต์ด ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฒ ํ๋ก์ ํธ์์ API๋ฌธ์๋ฅผ ์์ฑํ์ฌ ๊ณต์ ํ๋ค. ํด๋น API๋ฌธ์์๋ API๋ณ URL๊ณผ ๋ฉ์๋, ์์ฒญ๊ณผ ์๋ต์ ๋ํ ๋ด์ฉ๋ค์ด ๋ด๊ฒจ์์๋ค. ํด๋น ๋ด์ฉ์ ๋ฏธ๋ฆฌ.. [2018 ์นด์นด์ค ๋ธ๋ผ์ธ๋ ์ฑ์ฉ] ํ์ผ๋ช ์ ๋ ฌ ๋ฌธ์ https://programmers.co.kr/learn/courses/30/lessons/17686 ์ฝ๋ฉํ ์คํธ ์ฐ์ต - [3์ฐจ] ํ์ผ๋ช ์ ๋ ฌ | ํ๋ก๊ทธ๋๋จธ์ค ํ์ผ๋ช ์ ๋ ฌ ์ธ ์ฐจ๋ก์ ์ฝ๋ฉ ํ ์คํธ์ ๋ ์ฐจ๋ก์ ๋ฉด์ ์ด๋ผ๋ ๊ธฐ๋๊ธด ๋ธ๋ผ์ธ๋ ๊ณต์ฑ๋ฅผ ๋ฌด์ฌํ ํต๊ณผํด ์นด์นด์ค์ ์ ์ฌํ ๋ฌด์ง๋ ํ์ผ ์ ์ฅ์ ์๋ฒ ๊ด๋ฆฌ๋ฅผ ๋งก๊ฒ ๋์๋ค. ์ ์ฅ์ ์๋ฒ์๋ ํ๋ก๊ทธ๋จ์ ๊ณผ๊ฑฐ ๋ฒ์ ์ ๋ชจ๋ ๋ด๊ณ ์์ด, ์ด๋ฆ ์์ผ๋ก ์ ๋ ฌ๋ ํ์ผ ๋ชฉ๋ก์ ๋ณด๊ธฐ๊ฐ ๋ถํธํ๋ค. ํ์ผ์ ์ด๋ฆ ์์ผ๋ก ์ ๋ ฌํ๋ฉด ๋์ค์ ๋ง๋ค์ด์ง ver-10.zip์ด ver-9.zip๋ณด๋ค ๋จผ์ ํ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฒ์ ๋ฒํธ ์ธ์๋ ์ซ์๊ฐ ํฌํจ๋ ํ์ผ ๋ชฉ๋ก์ ์ฌ๋ฌ ๋ฉด์์ ๊ด๋ฆฌํ๊ธฐ ๋ถํธํ๋ค. ์ programmers.co.kr ์์ค์ฝ๋ import java.util.Arrays; p.. [์๋ฒ๊ฐ๋ฐ์บ ํ] ์ธ์ฆ ์๋ฒ - ์์ ๋ก๊ทธ์ธ ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ ์ธ์ฆ์๋ฒ์ ๋ค์ด๋ฒ ์์ด๋๋ก ๋ก๊ทธ์ธ(๋ค์๋ก) ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค. ๋ค์๋ก์ ์ ์ฒด์ ์ธ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค. 1. NAVER Developers์์ Application์ ๋ฑ๋กํด client_id์ client_secret์ ๋ฐ๊ธ๋ฐ๋๋ค. 2. client_id๋ก access_code๋ฅผ ์์ฒญํ๋ค. 3. client_id์ client_secret, access_code๋ก ์ฌ์ฉ์ ์ ๋ณด์ ์ ๊ทผํ ์ ์๋ access_token๊ณผ refresh_token์ ์์ฒญํ๋ค. 4. access_token์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ค. ์ฌ๊ธฐ์ access_code๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ฒญํ ์ ์๋ ํ ํฐ์ด ์๋๋ฉฐ, ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด์๋ ์์ NAVER Developers์์ ๋ฐ๊ธ๋ฐ์ client_id ๋ฐ cl.. [์๋ฒ๊ฐ๋ฐ์บ ํ] ์ธ์ฆ ์๋ฒ - ๋ก๊ทธ์ธ ์ฑ๋ฅ ํ ์คํธ : nGrinder AWS RDS ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ถ์ ์ํด AWS์์ ํ๋ฆฌํฐ์ด๋ก ์ ๊ณตํ๋ RDS db.t2.micro ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค. ํด๋น ์ธ์คํด์ค์ ์ต๋ ์ปค๋ฅ์ ์๊ฐ 66์ด์๊ณ , ์ฐ๋ฆฌ ์๋น์ค์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ์๋น์ค ์๋ฒ๊ฐ ์ธ ๋์๊ธฐ ๋๋ฌธ์ ๊ฐ ์๋ฒ์ ์ต๋ ์ปค๋ฅ์ ์๋ฅผ 20์ผ๋ก ์ง์ ํ๋ค. ์ด๋ฅผ ์ํด HikariDataSource๋ฅผ ์ฌ์ฉํ๋ค. DatabaseConfig.java @Configuration @PropertySource("classpath:application.properties") public class DatabaseConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariConfig hik.. [์๋ฒ๊ฐ๋ฐ์บ ํ] ์ธ์ฆ ์๋ฒ - AWS EC2 & RDS ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ถ ์ธ์ฆ์๋ฒ๋ฅผ AWS EC2์ ๋ฐฐํฌํ๊ณ , RDS์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ค. ์๋ ๋ธ๋ก๊ทธ์ ํด๋น ๋ด์ฉ์ด ์ ์ ๋ฆฌ๋์ด ์์ด ๊ตฌ์ถํ๋๋ฐ๋ ํฐ ์ด๋ ค์์ด ์์์ง๋ง, ๋ฐฐํฌ ํ ๋ EC2 ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ๊ณผ ํฌํธ ๋ฌธ์ ๋๋ฌธ์ ํ๋ค์๋ค. ์ฐธ๊ณ ๋งํฌ ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ : 4) ์คํ๋ง๋ถํธ๋ก ์น ์๋น์ค ์ถ์ํ๊ธฐ - 4. AWS EC2 & RDS ๊ตฌ์ถํ๊ธฐ 5) ์คํ๋ง๋ถํธ๋ก ์น ์๋น์ค ์ถ์ํ๊ธฐ - 5. EC2์ ๋ฐฐํฌํ๊ธฐ PuTTY Gen์ผ๋ก ppk ํ์ผ ์์ฑ : [REST API ์ค์ต] 4. Springboot ํ๋ก์ ํธ AWS EC2 ์ธ์คํด์ค์ ๋ฐฐํฌ AWS ํ๋ฆฌํฐ์ด์ ๊ฒฝ์ฐ ํ ๊ณ์ ๋ด์ ๋์๊ฐ๋ ๋ชจ๋ ์ธ์คํด์ค์ ์๊ฐ์ด ํ ๋ฌ ๊ธฐ์ค 750์๊ฐ์ด ์ด๊ณผํ๋ฉด ์ถ๊ฐ์๊ธ์ด ๋ถ๊ณผ๋๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๊ณ์ ์ผ๋ก ๋๋์ด ๊ฐ ์๋ฒ๋ฅผ ๋ฐฐ.. [์๋ฒ๊ฐ๋ฐ์บ ํ] ์ธ์ฆ ์๋ฒ - ๋ก๊ทธ์ธ : JWT + Redis ๋ก๊ทธ์ธ JWT ๊ธฐ๋ฐ์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. ์ ์ฒด์ ์ธ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค. 1. ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์์ฒญ 2. ์ฌ์ฉ์ ํ์ธ ํ, access token๊ณผ refresh token ๋ฐ๊ธ 3. refresh token์ Redis์ ์ ์ฅ 4. ํ ํฐ ์ฌ๋ฐ๊ธ ์์ฒญ ์, Redis์ refresh token ์ ๋ณด๊ฐ ์กด์ฌํ๋์ง ํ์ธ ํ ๋ฐ๊ธ 5. ๋ก๊ทธ์์ ์, Redis์ refresh token ์ ๋ณด ์ญ์ access token์ 30๋ถ, refresh token์ 2์ฃผ์ ์ ํจ๊ธฐ๊ฐ์ ๋์๋ค. refresh token์ ๊ฒฝ์ฐ ์ ํจ๊ธฐ๊ฐ์ด ๊ธธ๊ธฐ ๋๋ฌธ์, ์๋ฒ์ฌ์ด๋์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก Redis์ ์ ์ฅํ๋ค. refresh token์ ํตํด ํ ํฐ ์ฌ๋ฐ๊ธ ์์ฒญ ์, refresh token์ ์ ํจ์ฑ ์ฌ๋ถ ๋ฟ๋ง์๋๋ผ Redis.. [์๋ฒ๊ฐ๋ฐ์บ ํ] ์ธ์ฆ ์๋ฒ - ์ด๋ฉ์ผ ์ธ์ฆ ํ์๊ฐ์ ํ์๊ฐ์ ์ด๋ฉ์ผ ์ธ์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ์๊ฐ์ ๋ก์ง์ ์์ฑํ๋ค. ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค. 1. ์ฌ์ฉ์๊ฐ ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ ๋ฑ ํ์์ ๋ณด๋ฅผ ์ ๋ ฅํ ํ, ํ์๊ฐ์ ์์ฒญ์ ๋ณด๋ธ๋ค. 2. ์๋ฒ์์๋ ์ฌ์ฉ์์ ์ด๋ฉ์ผ๋ก ์ธ์ฆ๋ฉ์ผ์ ์ ์กํ๊ณ , ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ๋ณด๋ฅผ Redis์ ์์์ ์ฅํ๋ค. 3. ์ฌ์ฉ์๊ฐ ์ ์ก๋ ๋ฉ์ผ์ ๋งํฌ๋ฅผ ํตํด ์ธ์ฆํ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค. 4. ์๋ฒ์์๋ ์ธ์ฆํ์ธ ํ, Redis์ ์ ์ฅ ๋ ํ์ ์ ๋ณด๋ฅผ DB์ ์ ์ฅํ๋ฉฐ ํ์๊ฐ์ ์ ๋ง์น๋ค. ์ฐจ์ฅ๋๊ณผ์ ์ฝ๋๋ฆฌ๋ทฐ์์ ํด๋น ๋ก์ง์ ๋ํด ์กฐ์ธ์ ๋ฐ์๋ค. ์ต๊ทผ์๋ ํ์๊ฐ์ ์ ๋ง์ณค์ง๋ง ์์ง ์ธ์ฆ์ด ์๋ฃ๋์ง ์์ ์ฌ์ฉ์์๊ฒ ์ผ๋จ ์ผ๋ถ์ ๊ถํ(์ต์ํ์ ๊ถํ)๋ง ์ ๊ณตํ ํ, ์ธ์ฆ์ด ์๋ฃ๋๋ฉด ์ถ๊ฐ ๊ถํ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ผ๋ ๊ฒ์ด์๋ค. ํ์ง๋ง ํ์ฌ ๊ฐ๋ฐ ์ค์ธ ์๋น์ค(์์์ค๋ท.. ์ด์ 1 2 3 ๋ค์