์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- nGrinder
- redis ์กฐํ
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ค์ค ์ปจํ ์ด๋
- s3 ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- private subnet ec2 ๋ก์ปฌ ์ ์
- s3 ์ด๋ฏธ์ง ์ ์ฅ
- aws ์ฟ ํฐ
- docker-compose kafka
- ํ๋ก๊ทธ๋๋จธ์ค ํฉ์นํ์์๊ธ
- aws saa ํฉ๊ฒฉ
- redis ํ ์คํธ์ฝ๋
- ์คํํ๋ ๋ฏธ์ค
- ์ ํจ์ค ์ค์ผ์ค๋ฌ
- ์๋ฐ
- prod docker-compose
- ์๋ฒ ํฐ์ง๋ ๋์ปค ์ฌ์คํ
- JPA
- docker compose
- Entity
- AWS Certified Solutions Architect - Associate
- ์ ํจ์ค ๋น๋ ์ค๋ฅ
- docker
- docker ps -a
- @RestControllerAdvice
- ํ์ดํผ๋ฐ์ด์
- Kafka
- ํ๋ก๊ทธ๋๋จธ์ค ์ปฌ๋ฌ๋ง๋ถ
- Codedeploy ์ค๋ฅ
- s3 log ์ ์ฅ
- Today
- Total
๋ชฉ๋ก๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด๐ป/๐๐ฉ๐ซ๐ข๐ง๐ (28)
๐๐ข๐๐ โ๐๐๐ ๐๐๐ก๐๐ ๐๐๐๐โง
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dueFef/btsF0E2AwYu/XQiXEhlpdpekKO6djMsKE0/img.png)
ํ์๋ ์ฒ์์๋ ์๋ฆผ ํ ์ด๋ธ์ ๊ตฌํํํ ๋๊ธ์ด ๋ฌ๋ฆฌ๋ฉด ์๋ฆผํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ก ์ ์ฅํ์๊ณ , API๊ฐ ํธ์ถ๋๋ฉด ํด๋น ์ฌ์ฉ์์ ์๋ฆผ ๋ฐ์ดํฐ๋ฅผ DB์์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค. ํ์ง๋ง ์ด๋ฐ polling ๋ฐฉ์์ ์ ํด์ง ์ฃผ๊ธฐ๋ง๋ค ๋ฌด์กฐ๊ฑด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ ํธ๋ํฝ์ ๋ฐ์์ํค๋ฉฐ, ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋์ง์๋๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋์ ํ์๋ Kafka๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆผ ์ด๋ฒคํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , Server-Sent Events(SSE)๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ์ผ๋ก ์๋ฆผ์ ์ ๋ฌํ๋ ์์คํ ์ ๊ตฌํํด๋ณผ๊ฒ์ด๋ค. ๊ฒ์ํ์ ๊ธ์ ๋๊ธ์ด ๋ฌ๋ฆฌ๋ฉด ์๋์ด ์๊ธฐ๊ณ , ์๋ฒ๋ Kafka๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ์ฒ๋ฆฌ๋ ์๋์ SSE๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์ ์กํ๋ ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Q1Sfv/btsFPp5z1YI/aWY7fnmLQTgXV5STD0Wk5K/img.png)
์ธ๋ฑ์ค ํ ์ด๋ธ์ ๋์ ์๋๋ฅผ ๋์ฌ์ฃผ๋ ์๋ฃ ๊ตฌ์กฐ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์์ค๋ค. ์๋ฅผ ๋ค์ด, ์ฑ ์ ์ฐพ์๋ณด๊ธฐ๊ฐ ์์ ๋ ํน์ ์ฃผ์ ๋ ๋จ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฑ ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ฐพ์๋ณด์ง ์๊ณ , ์ฐพ์๋ณด๊ธฐ์์ ํด๋น ๋จ์ด๋ฅผ ์ฐพ์ ๋ฐ๋ก ํด๋น ํ์ด์ง๋ก ๊ฐ ์ ์๋ฏ์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค๋ ๋น์ทํ ์ญํ ์ ํ๋ค. ์ธ๋ฑ์ค์ ์ฅ์ & ํจ๊ณผ ๊ฒ์ ์ฑ๋ฅ ํฅ์: WHERE ์ ์์ ํน์ ์นผ๋ผ์ ์ด์ฉํ ์กฐ๊ฑด ๊ฒ์์ด ๋นจ๋ผ์ง๋ค. ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ค์บํ์ฌ ์กฐ๊ฑด์ ๋ง๋ ํ์ ์ฐพ์์ผ ํ๋ค. ํ์ง๋ง ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋น ๋ฅด๊ฒ ๊ฒ์์ด ๊ฐ๋ฅํ๋ค. ์กฐ์ธ ์ฑ๋ฅ ํฅ์: JOIN ์ ์์ ์กฐ์ธํ ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ์กฐ์ธ์ ์ํํ ์ ์๋ค. ์ด๋ ๋ ํ ์ด๋ธ ๊ฐ์ ๋งค์นญ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/d6PnVc/btsFCBUHH7K/lQjvDZKvzjftTuYO8KQoE1/img.png)
Scouter Scouter๋ ์คํ ์์ค ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ํด๋ก, ์ฃผ๋ก ์๋ฐ(JAVA) ์ดํ๋ฆฌ์ผ์ด์ ์ ์ค์๊ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ฌธ์ ์ง๋จ์ ์ฌ์ฉ๋๋ค. ์ด ํด์ ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ฑ๋ฅ ์งํ๋ฅผ ์์งํ๊ณ , ๋ถ์ํ์ฌ ์ฑ๋ฅ ์ ํ์ ์์ธ์ ํ์ ํ๊ณ ๊ฐ์ ํ ์ ์๋๋ก ๋์์ค๋ค. Scouter๋ฅผ ์ฌ์ฉํ๋ฉด CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, SQL ์ฟผ๋ฆฌ ์ฑ๋ฅ, HTTP ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ ๋ฑ ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์๋ค. 1. ์ค์นด์ฐํธ ๋ชจ๋ํฐ๋ง TOOL ์ค์นํ๊ธฐ https://github.com/scouter-project/scouter/releases Releases · scouter-project/scouter Scouter is an open source APM (Application Performan..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/lxazF/btsFGBFnkvN/vJZLNwnCYbmIfg7twxn9y1/img.png)
ngrinder ์ฑ๋ฅ ํ ์คํธ ๋ฐ ๋ถํ ํ ์คํธ๋ฅผ ์ํํ๋ ์คํ ์์ค ํ๋ ์์ํฌ์ด๋ค. nGrinder๋ Java ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ nGrinder์์ ์ฌ๋ฌ๊ฐ์ง ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๋ง๋ค์ด ํธ๋ํฝ์ ๋ชฐ๋ ธ์ ๋ ์ฑ๋ฅ์ ์ธก์ ํ ์ ์๋๋ก ๋์์ค๋ค. 1. ngrinder ์ค์นํ๊ธฐ https://github.com/naver/ngrinder/releasesโ ์์ ngrinder-controller-3.5.5-p1.war ํ์ผ ๋ค์ด๋ก๋ํ๋ฉด ๋๋ค. ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ngrinder ๋ผ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๋ค์ด๋ฐ์ ํ์ผ์ ์์น์ํค์. ํด๋น ํ์ผ์ด ์๋ ๊ฒฝ๋ก์์ ํฐ๋ฏธ๋์ ์ด๊ณ java -jar ngrinder-controller-3.5.9.war --port=8300 ๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ์คํ๋๋ค. java ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bwcuhj/btsFwDxXPd1/1zG9LmRt6W4WcNe2FWtEVk/img.png)
dto ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํด์ผํ ์ง ๊ณ ๋ฏผ์ ์ ๋ง ๋ง์ด ํ๋ค. ๋์ ๋ฐฉ๋ฒ์ด ์ ๋ต์ด ์๋์ง๋ง ๋์ ๊ฐ์ ๊ณ ๋ฏผ์ ํ๋ ๋ถ๋ค์ ์ํด ๊ณ ๋ฏผ์ ๊ธฐ๋กํด๋ณธ๋ค. ๐ ๊ณ ๋ฏผ์ ์๋ง ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ง์ dto ๊ฐ ๋ง๋ค์ด์ก๋ค. ๊ทธ๋์ ์ฒ์์๋ ๋น์ทํ dto ๊ฐ์ฒด๋ค์ InnerStaticClass ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ์๋ค. ์ฐ์ InnerStaicClass ๋ฅผ ์์๋ณด์ ๐InnerStaicClass ๋ด๋ถ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ธ๋ถ ํด๋์ค์ ๋ด๋ถ ํด๋์ค๊ฐ ๊ธด๋ฐํ ๊ด๊ณ๋ฅผ ๋งบ์ ๋ ์ฌ์ฉํ๋ค. ๋ด๋ถ ํด๋์ค์์ ์ธ๋ถ ํด๋์ค์ ๋ฉค๋ฒ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค. ์๋ก ๊ด๋ จ์๋ ์ฝ๋๋ฅผ ๋ฌถ์ด์ ์ฝ๋์ ์บก์ํ๋ฅผ ์ฆ๊ฐ์ํจ๋ค. ์ธ๋ถ์์๋ ๋ด๋ถ ํด๋์ค์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ผ ์ ์๋ค. static์ด ๋ถ์ง ์์์ ๋ ๋จ์ ์ฐธ์กฐ๊ฐ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b9j1X3/btssbBfKEwU/bFNW1fTbHR2J9MJIerIvdK/img.png)
@Enumerated ์๋ฐ enum ํ์ ์@Enumerated ์ ๋ ธํ ์ด์ ์ ํตํด ์ํฐํฐ ๋งคํํ ์ ์๋ค. @Enumerated ์ด๋ ธํ ์ด์ ์๋ EnumType.ORIGINAL : enum ์์(์ซ์) ๊ฐ์ DB์ ์ ์ฅ EnumType.STRING: enum ์ด๋ฆ ๊ฐ์ DB์ ์ ์ฅ ๋๊ฐ์ง ํ์ ์ด ์๋ค. ์๋ก ๋ค์ด, @AllArgsConstructor public enum UserRole { ROLE_ADMIN("๊ด๋ฆฌ์"), ROLE_USER("ํ์"); private final String description; } @Column(nullable = false) @Enumerated(EnumType.ORDINAL) private UserRole roles; ํด๋น enum์ ORIDINAL๋ก ์ง์ ํ๊ณ role์..
๊ฒ์ ์กฐ๊ฑด member.username.eq("member1") // username = 'member1' member.username.ne("member1") //username != 'member1' member.username.eq("member1").not() // username != 'member1' member.username.isNotNull() //์ด๋ฆ์ด is not null member.age.in(10, 20) // age in (10,20) member.age.notIn(10, 20) // age not in (10, 20) member.age.between(10,30) //between 10, 30 member.age.goe(30) // age >= 30 member.age.gt(..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cDYe49/btsn12usF2i/NTzrID95qIMnEi6uboixL1/img.png)
QueryDSL ์ ์ ํ์ ์ ์ด์ฉํด SQL๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋๋ก ์ง์ํ๋ ํ๋ ์์ํฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์๊ฐ ์๋ ์ฝ๋๋ก ์์ฑํด๋, ์ฝ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ๊ทธ ๋ชจ์๋ ์ฟผ๋ฆฌ์ ๋น์ทํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ ์คํ์์ค ํ๋ก์ ํธ QueryDSL์ ์ฅ์ IDE๊ฐ ์ ๊ณตํ๋ ์ฝ๋ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ๋ฌธ๋ฒ์ ์ผ๋ก ์๋ชป๋ ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ ์์ ์ผ๋ก ํ์ฉ๋ QueryDSL์ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค. ๊ณ ์ ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค. ์ฝ๋๋ก ์์ฑํ๋ฏ๋ก ๊ฐ๋ ์ฑ ๋ฐ ์์ฐ์ฑ์ด ํฅ์๋๋ค. ๋๋ฉ์ธ ํ์ ๊ณผ ํ๋กํผํฐ๋ฅผ ์์ ํ๊ฒ ์ฐธ์กฐํ ์ ์๋ค. QueryDSL ์ค์ buildscript { ext { queryDslVersion = "5.0.0" } } plugins { i..