๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€

(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์— ์ €์žฅํ•˜๋ฉฐ ํšŒ์›๊ฐ€์ž…์„ ๋งˆ์นœ๋‹ค. ์ฐจ์žฅ๋‹˜๊ณผ์˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ์—์„œ ํ•ด๋‹น ๋กœ์ง์— ๋Œ€ํ•ด ์กฐ์–ธ์„ ๋ฐ›์•˜๋‹ค. ์ตœ๊ทผ์—๋Š” ํšŒ์›๊ฐ€์ž…์„ ๋งˆ์ณค์ง€๋งŒ ์•„์ง ์ธ์ฆ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ๋‹จ ์ผ๋ถ€์˜ ๊ถŒํ•œ(์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ)๋งŒ ์ œ๊ณตํ•œ ํ›„, ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ์ถ”๊ฐ€ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ์„œ๋น„์Šค(์ž์†Œ์„ค๋‹ท..