๊ณผ์ ๋ฅผ ํ๋ฉฐ ํํ์ด ํ ๊ณต๋ถ ๊ธฐ๋ก.โ๐ป ์์ง๋ ์ ๋ฆฌํ ๊ฒ๋ค & ์ฐ๊ณ ์๋ ๊ฒ๋ค์ด ์ฐ๋๋ฏธ๋ผ์ ์ฌ๋ฆฌ์ง ๋ชปํ ๊ธฐ๋ก์ด ๋ง๋ค. ๋นจ๋ฆฌ ์จ์ ์ฌ๋ ค์ผ๊ฒ ๋ค!
์ด์ Spring Security ๋์
์ ๋ง๋ฌด๋ฆฌ ํ๊ณ , ๋ค์ ๋จ๊ณ๋ฅผ ์งํํ๋ค๊ฐ ์ผ์ ์ ์์ฑํ๋ ๋ถ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ด NPE๊ฐ ๋ฐ์ํ๋ค.

Postman์์๋ 403 Forbidden ์๋ฌ๊ฐ ๋ ์ํฉ์ด๋ค.

ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธ์ ์ ์์ ์ผ๋ก ๋๊ณ , DB์๋ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค ๋น ์ง์์ด ๋ค์ด์๋ค.

์ userRole์ด null์ธ๊ฐ...๐ค DB์๋ ๋ค ๋ค์ด์๋๋ฐ ์ null์ด์ง...?

์ด ์ํฉ์ ๋ฏฟ์ ์๊ฐ ์์ด ์์ฑ์์์ userRole์ด null์ผ ๋ ์๋ฌ๋ฅผ ๋์ง๋๋ก ํด ๋ค์ ํ ๋ฒ ํ์ธํด๋ดค๋ค.

null์ด ๋ง๋ค. ๊ทธ๋ ๋ค๋ฉด ์์ผ๊น?

๊ฒ์์ ๋ช์ ๋น ์ ธ์๋ค๊ฐ ์ฌ๋ฌ ์ํฉ์ ๊ฐ์ ํ๊ณ ํ์ธํด๋ณด์๋ค.
userRole์ ๋ค๋ฅธ ๋จ์ด๋ก ์
๋ ฅํ ๊ฒฝ์ฐuserRole๋ก ๊ฐ์.userRole์ด ํฌํจ๋์ง ์์ ๊ฒฝ์ฐJwtAuthenticationFilter์์ setAuthentication()์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ฌ๊ธฐ์ ํด๋น ๋ฉ์๋๋ JWT ํ ํฐ์ ๊ฒ์ฆํ ํ, Spring Security์ SecurityContext์ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ญํ ์ ํ๋ค. ์ฌ๊ธฐ์ JwtAuthenticationToken ๋ถ๋ถ์ ๋ณด๋ฉด Spring Security์์ ์ฌ์ฉํ Authentication ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.

JwtAuthenticationToken ํด๋์ค๋ก ๊ฐ์ ๋ค์ ํ ๋ฒ ์ดํด๋ณด๋ ์ฌ์ฉ์์ ๊ถํ(userRole)์ ์ค์ ํ๊ณ , ์ธ์ฆ๋ ์ฌ์ฉ์๋ก setํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋งจ ์๋ getPrincipal() ๋ฉ์๋๋ฅผ ํตํด ํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค. ์ฌ๊ธฐ์ ์ด getPrincipal() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.

๋ฐ๋ผ์ ๋๋ ์ด ๋ถ๋ถ์ ์ด์ฉํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์ด TodoController์ saveTodo() ๋ฉ์๋์์ @Auth ์ด๋
ธํ
์ด์
์ ์ฃผ์ ์ฒ๋ฆฌํ ํ, ์ง์ getPrincipal() ๋ฉ์๋๋ฅผ ๋ถ๋ฌ authUser์ ๋ฃ๊ณ ํ
์คํธ ํด๋ดค๋ค.

๋๋์ด ์ ๋๋ก ์ผ์ ์ด ์์ฑ๋์๋ค! ํ์ง๋ง @Auth๋ฅผ ์ด์ฉํด ๋ฐ๊ฟ์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์์ ๋ด๊ฐ ์ด์ ์ค์๋ฅผ ํ๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค.

๋ฐ๋ก ํ์ผ ์ ๋ฆฌ๋ฅผ ํ๋ค๊ฐ ์๊ฐ์์ด AuthUserArgumentResolver์ WebConfig๋ฅผ ์ญ์ ํด๋ฒ๋ฆฐ ๊ฒ์ด๋ค.... ์ด ๋ถ๋ถ์ ์ญ์ ํ์ง ๋ง๊ณ Spring Security๋ก ๋ณ๊ฒฝํ์ด์ผ ํ๋๋ฐ, ํ์์๋ค๊ณ ์๊ฐํด์ ์ง์ ๋ค. ์ฐจ๋ผ๋ฆฌ ์ง์ฐ์ง ์์๋๋ผ๋ฉด ๋ ๋นจ๋ฆฌ ํด๊ฒฐํ ์ ์์์ ํ
๋ฐ ๋ง์ด๋ค. ์ ํํ ์ดํด ์์ด ์ ์ฉํ๋ ค๊ณ ๋ง ํด์ ์ด๋ฐ ์ผ์ด ๋ฒ์ด์ง ๊ฒ ๊ฐ๋ค.๐

๋ฐ๋ผ์ ๋ค์ ํด๋น ํ์ผ์ ๋ง๋ ํ, AuthUserArgumentResolver์ resolveArgument()๋ฉ์๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ค. ์ด์ ์๋ ๊ฐ์ request์์ ํ๋์ฉ ๊ฐ์ ธ์ ์๋ก์ด AuthUser ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ค.

์์ ํ, ํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์(SecurityContextHolder.getContext().getAuthentication()) Principal์ ๊บผ๋ด(getPrincipal()) AuthUser๋ก ๋ฐํํ๋ค. ์ด๋ ๊ฒ ๋ฐํ๋ AuthUser๋ TodoController์ authUser ํ๋ผ๋ฏธํฐ์ ์๋์ผ๋ก ๋ค์ด๊ฐ๋ค.

๋ฐ๋ผ์ ๊ธฐ์กด๊ณผ ๊ฐ์ด ์ด๋ ๊ฒ ์ ์ด์ค๋ ์ด์ ์ ์์ ์ผ๋ก ๋ค์ด๊ฐ๋ค.

Postman์์๋ ์ ํ
์คํธ ๋๋ค.

์, ์ด๋ ๊ฒ ๊ฒจ์ฐ๊ฒจ์ฐ ์๋ฌ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์๋ ์ด๋ ธํ ์ด์ ํ๋๋ก ํด๊ฒฐํ ์ ์์๋ค.
@AuthenticationPrincipal'
์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ๋ค.

...๋ ์ค๋ ๋ญํ๊ฑฐ์ง...?๐ ํ์ ๋ถ์ด ๋ง์ง๋ง ์คํฌ๋ผ๋ ์๋ ค์ฃผ์ ์ ์์๋ค. ๊ฐ์๋ฅผ ๋ ์์ธํ ๋ด์ผํ๋ค๋ ๊ตํ์ ์ป์๋ค.
Error creating bean with name 'jwtAuthenticationFilter' defined in file ... ์ค๋ฅJwtAuthenticationFilter ํด๋์ค๊ฐ JwtUtil์ ์ฃผ์
๋ฐ์ผ๋ ค๊ณ ํ๋๋ฐ ์คํ๋ง ์ปจํ
์ด๋์ JwtUtil ๋น์ด ๋ฑ๋ก๋์ด ์์ง ์์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค.JwtUtil์ Mock์ผ๋ก ์ฃผ์
ํด ํด๊ฒฐํ์๋ค.@WithMockUser์ ์ถ๊ฐํด ํ
์คํธ์ฉ์ผ๋ก ๊ฐ์ง ์ธ์ฆ ๊ฐ์ฒด(SecurityContext)์ ๋ฃ์ด์ฃผ๋ ์ญํ ์ ํ๋๋ก ํ๋ค.
application.properties์์ DB ์ค์ ์ ์ฃผ์ ์ฒ๋ฆฌํํ ๋ค์ ๋น๋ํ๋ค.

ps -ef | grep java ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด PID๋ฅผ ํ์ธ ํ, kill -9 [PID] ๋ช
๋ น์ด๋ก ๊ธฐ์กด ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ ํ, ๋ค์ ์๋ฒ๋ฅผ ์คํํ๋ค.8080 ํฌํธ๊ฐ ์ด๋ ค ์๋์ง ํ์ธํ๋ค. ๋ง์ฝ ์ด๋ ค์์ง ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด Inbound rules์ 8080 ํฌํธ๋ฅผ ์ถ๊ฐํ๋ค.
nohup java -jar expert-0.0.1-SNAPSHOT.jar & ๋ช
๋ น์ด ์ค๋ฅ : nohup: failed to run command 'java': No such file or directory ๋ผ๋ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋ํ๋ฌ๋ค. EC2 ์ธ์คํด์ค์ Java๊ฐ ์ค์น๋์ด ์์ง ์์์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด Java๋ฅผ ์ค์น ํ ๋ค์ ์๋ํ๋ค. sudo apt update
sudo apt install openjdk-17-jdk -y

java.net.ConnectException โ ์์ DB๋ก ๋คํธ์ํฌ ์ฐ๊ฒฐ ์์ฒด๊ฐ ์ ๋ ์ํโ RDS ์ฐ๊ฒฐ๋ง ๋จ์ ์์ด์ ํ ์คํธ ๋๋ฆฌ๋๊น RDS๋ก ๋ถ์ผ๋ ค๋ค๊ฐ ์คํจํ ์ํฉ
๋ฐ๋ผ์ ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ๋ค.
application-local.properties๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ํด๊ฒฐํ๋ค.application-local.properties ๋ก ์คํ โ application.properties์ spring.profiles.active=local ์ถ๊ฐ
application-local.properties ํ์ผ์ ์ฝ์ด๋ผ! ๋ผ๋ ๋ป.local์ ๋ช
์ํด์ผ ๋ก์ปฌ DB ์ฐ๊ฒฐ, ๋ก์ปฌ์ฉ S3 ํค๋ก ํ
์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.