์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํด์,
์ ์ ํ ์ด๋ธ์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์๋ผ๋ฉด
๋ฆฌ์์ค ์๋ฒ์์ ์ ๊ณตํด์ฃผ๋ ์ด๋ฆ์ ์ ๋ํด์ค.
์ ์ ํ ์ด๋ธ์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์๋ผ๋ฉด
์ ์ฌ์ฉ์๋ฅผ ์์ฑํด์ DB์ ์ ์ฅ
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class User implements UserDetails {
// ์๋ต
// ๋๋ค์ ํ๋ ์ถ๊ฐ
@Column(name = "nickname", unique = true)
private String nickname;
// ๋น๋ ํจํด์ ๋๋ค์ ์ถ๊ฐ
@Builder
public User(String email, String password, String nickname) {
this.email = email;
this.password = password;
this.nickname = nickname;
}
// ์ฌ์ฉ์ ์ด๋ฆ ๋ณ๊ฒฝ
public User update(String nickname) {
this.nickname = nickname;
return this;
}
}
๋ฆฌ์์ค ์๋ฒ์์ ๋ฐ์์จ ์ฌ์ฉ์ ์ ๋ณด๋ก
ํ ์ด๋ธ ์กฐํ & ์ ๋ฐ์ดํธor์ ์ฅํ๋ ํด๋์ค
@RequiredArgsConstructor
@Service
public class OAuth2UserCustomService extends DefaultOAuth2UserService {
private final UserRepository userRepository;
// ๋ฆฌ์์ค ์๋ฒ์์ ๋ณด๋ด์ฃผ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฉ์๋
// ์ด ๋ฉ์๋๋ฅผ ํตํด ์ฌ์ฉ์ ์กฐํํ๊ณ
// user ํ
์ด๋ธ์ ์๋ค๋ฉด ์ด๋ฆ์ ์๋ฐ์ดํธ
// ์๋ค๋ฉด saveOrUpdate()๋ฉ์๋ ์คํํด์ ํ
์ด๋ธ์ ํ์ ์ถ๊ฐ.
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
// ์์ฒญ์ ๋ฐํ์ผ๋ก ์ ์ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด ๋ฐํ
OAuth2User user = super.loadUser(userRequest);
saveOrUpdate(user);
return user;
}
private User saveOrUpdate(OAuth2User oAuth2User) {
Map<String, Object> attributes = oAuth2User.getAttributes();
String email = (String) attributes.get("email");
String name = (String) attributes.get("name");
User user = userRepository.findByEmail(email)
.map(entity -> entity.update(name))
.orElse(User.builder()
.email(email)
.nickname(name)
.build());
return userRepository.save(user);
}
}
loadUser()๋ฉ์๋๋
๋ฆฌ์์ค ์๋ฒ์๊ฒ ์์ธ์ค ํ ํฐ ์ฃผ๊ณ ,
์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ๋ฉ์๋์.
GET https://kapi.kakao.com/v2/user/me
Authorization: Bearer {access_token}
์ด๋ฐ ์์ผ๋ก...
OAuth2UserRequest์๋
์์ธ์ค ํ ํฐ
ํด๋ผ์ด์ธํธ ๋ฑ๋ก ์ ๋ณด (๊ตฌ๊ธ์ธ์ง ์นด์นด์ค์ธ์ง..)
์ฌ์ฉ์ ์ ๋ณด URI
๋ฑ์ ๋ด๊ณ ์์.
์ฌ์ฉ์ ์ ๋ณด ์์ฒด๋ ์๋ค์ด๊ฐ ์์!
์ฌ์ฉ์ ์ ๋ณด๋ super.loadUser()๋ถ๋ชจ ๋ฉ์๋ ํตํด์ ์ป์ด์ด.
Q. ์ฌ์ฉ์ ์ ๋ณด๋ ์ด๋์ ๋ฐ๋?
super.loadUser(userRequest)๊ฐ ์์ธ์ค ํ ํฐ์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด ์์ฒญํด์ ๋ฐ์์ค๋๊ฑฐ์.
Q. ์์ธ์ค ํ ํฐ์ JSON์ผ๋ก ๋ฐ์์ค๋๊ฑฐ๋ผ๋ฉฐ?
OAuth2UserRequest๋ SpringSecurity๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ค.
์ฆ, ์คํ๋ง์ํ๋ฆฌํฐ๋ JSON์ ๋ฐ์์ OAuth2UserRequest๋ฅผ ๋ง๋๋๊ฑฐ์.

'Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JUnit] does not declare any static, non-private, non-final, nested classes annotated with @Configuration ์๋ฌ ํด๊ฒฐ (0) | 2025.05.28 |
|---|---|
| [OAuth] OAuth2 ์ค์ ํ์ผ ์์ฑ (0) | 2025.05.11 |
| [OAuth] OAuth ์์กด์ฑ ์ถ๊ฐ, ์ฟ ํค ๊ด๋ฆฌ ํด๋์ค ๊ตฌํํ๊ธฐ (0) | 2025.05.08 |
| [OAuth] ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ1 ( ํ ํฐ ๋ฐ๊ธ๋ฐ๊ธฐ) (5) | 2025.05.07 |
| [Spring Boot] ์ฟ ํค๋? Cookie ๐ช (0) | 2025.05.07 |