๋ก๊ทธ์ธ ์ธ์ฆ์์ฒญ ์คํจ
์๋์ ๊ฐ์ ์์ธ ๋ฐ์
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.codestates.auth.dto.LoginDTO` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('username')
at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.13.3.jar:2.13.3]
๊ธฐ๋ณธ์์ฑ์๊ฐ ์์ด์ ๋ฐ์ํ๋ ์ค๋ฅ๊ฐ ๋ง๋? ๋ํดํธ ์์ฑ์๋ ๋ณ๋ ์์ฑ์๊ฐ ์์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐํด์ฃผ๋ ๊ฒ์ผ๋ก ์๊ณ ์๋๋ฐ.
ํน์ ๋ชจ๋ฅด๋๊น ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ก ํ์.
์ด๋ฒ์ ๋ค๋ฅธ ์์ธ๊ฐ ์ถ๋ ฅ๋์๋ค. : successfulAuthentication()
์์ Authentication ๊ฐ์ฒด์ MemberDetails ๊ฐ์ฒด ์ ๋ณด๊ฐ ๋ด๊ธฐ์ง ์์์ ๋ฐ์ํ๋ ํ๋ณํ ์์ธ
java.lang.ClassCastException: class java.lang.String cannot be cast to class com.codestates.member.entity.Member
(java.lang.String is in module java.base of loader 'bootstrap'; com.codestates.member.entity.Member is in unnamed module of loader 'app')
java.lang.ClassCastException: class java.lang.String cannot be cast to class com.codestates.member.entity.Member
- String ํด๋์ค๋ฅผ Member ์ํฐํฐ๋ก ํ๋ณํํ ์ ์๋ค๊ณ ํ๋ค.
JwtAuthenticationFilter.java:55
Member member = (Member) authResult.getPrincipal();ใ
ก๊ณผ์ ์์ ํ๋ณํ ์์ธ๊ฐ ๋ฐ์ํ๋ค. authResult
๊ฐ String์ด๋ผ Member๋ก ๋งคํํ์ง ๋ชปํ๋ค๋ ๋ป ๊ฐ์๋ฐ getPrincipal()์ ๋ฐํํ์
์ ์๋ ๋ฌด์์ผ๊น?
์ฐพ์๋ณด๋ ์๋๋ Object ํ์
์ผ๋ก ๋ฐํ๋์ด์ผ ํ๋ค๊ณ ํ๋ค.
์ด๋์ ๋ฌธ์ ๊ฐ ์์๊น?
๋ ํผ๋ฐ์ค ์ฝ๋์์ Member member = (Member) authResult.getPrincipal();
๋ฅผ ๋๋ฒ๊น
ํด๋ณด๋ฉด MemberDetailsService๊ฐ ๋ง๋ MemberDetails ๊ฐ์ฒด๊ฐ ์กด์ฌํจ์ ์ ์ ์์ง๋ง,
๋ด ์ฝ๋์์ Member member = (Member) authResult.getPrincipal();
๋ฅผ ๋๋ฒ๊น
ํด๋ณด๋ฉด
principal ํ๋์ MemberDetails ๊ฐ์ฒด๊ฐ ์๋ username๋ง ๋ณด์ ํ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
๋ฌธ์ ์ ์์ธ์ ์ฐพ์๋ดค๋๋ MemberDetailsService
ํด๋์ค์ @Component๊ฐ ์๋ถ์ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๋ค์ @Component๋ฅผ ๋ถ์ฌ์ฃผ์๋ค.
๊ทธ๋๋ ์ฌ์ ํ ํด๋น ํํธ(2๏ธโฃ ๋ก๊ทธ์ธ ์ธ์ฆ ์์ฒญ
)์์ ์์ธ๊ฐ ์ถ๋ ฅ๋๋ค.
์ฌ์ ํ principal์ MemberDetailsService์์ ๋ฐํํ๋ MemberDetails๊ฐ ์ถ๋ ฅ๋์ง ์๋๋ค.
๋ค์ ๋ณด๋ ๋ด ์ฝ๋์์๋ MemberDetailsService๊ฐ UserDetailsService๋ฅผ ๊ตฌํํ์ง๋ ์์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๋ค์ UserDetailsService๋ฅผ ๊ตฌํํ๊ณ ๋๋ฒ๊น
ํด๋ณด์.
์ฌ์ ํ ๊ฐ์ ์ค๋ฅ๊ฐ ์ถ๋ ฅ๋๋ค.
๋ก๊ทธ์ธ DTO๋ก๋ถํฐ ๋๋ฒ๊น
์ ๋๋ ค๋ณด๋
return authenticationManager.authenticate(authenticationToken);
ํ๋ ๊ฒ์ด ์๋ return authenticationToken
์ด attemptAuthentication()
์ ๊ฒฐ๊ณผ๋ก ๋์ด๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
โญ์ธ์ฆํ ํฐ์ด AuthenticationManer
์ authenticate
๋ฅผ ๊ฑฐ์ณ์ ๋ฐํ๋๋๋ก ๋ค์ ์์ฑํด์คฌ๋ค.
๋๋์ด ์ ์์ ์ผ๋ก ๊ฐ์ด ์ ๋ฌ๋๋๊ฒ์ ํ์ธํ ์ ์์๋ค.