์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- ์น๊ฐ๋ฐ
- ๋ฐฑ์ค1436
- ์ดํญ๊ณ์
- ChatGPT
- ํ๋ก๊ทธ๋๋ฐ
- boj11653
- spring
- ์๋ฃ๊ตฌ์กฐ
- ๋ฆฌ์กํธ
- ๋ชจ๋ฐ์ผ์ฑํ๋ก๊ทธ๋๋ฐ
- ๋ฐฑ์คํ์ด
- ๋ฐฑ์ค
- ์ฝ๋ฉ
- SSE
- ์คํ๋ง
- ๊ทธ๋ฆฌ๋
- ๊ฐ๋ฐ์
- ์ปดํจํฐ๊ณตํ
- ๊ทธ๋ฆฌ๋์๊ณ ๋ฆฌ์ฆ
- ์๊ณ ๋ฆฌ์ฆ
- ๋จ์ํ ์คํธ
- ํ์ด์ฌ
- ๋ฆฌ์กํธ๋ค์ดํฐ๋ธ
- ์ฝ๋ฉํ ์คํธ
- ํ๋ก ํธ์ค๋
- ์ปด๊ณต์
- ์ปด๊ณต
- ์น๊ฐ๋ฐ๊ธฐ๋ก
- ๋ฐฑ์๋
- ์ฐ์ ์์ํ
- Today
- Total
๐ป๐ญ๐ง๐
[์น ๊ฐ๋ฐ ํ๋ก์ ํธ] 3. ์์ ๋ก๊ทธ์ธ ์ ์ ์ ๋ณด์ DB ์ฐ๊ฒฐ ๋ณธ๋ฌธ
[์น ๊ฐ๋ฐ ํ๋ก์ ํธ] 3. ์์ ๋ก๊ทธ์ธ ์ ์ ์ ๋ณด์ DB ์ฐ๊ฒฐ
adorableco 2024. 1. 8. 00:15์ด๋ฒ์๋ ๊ตฌ๊ธ ์์
๋ก๊ทธ์ธ์ผ๋ก๋ถํฐ ์ ๊ณต๋ฐ์ ์ด๋ฆ, ์ด๋ฉ์ผ, ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์๋๋ก ๊ตฌํํ์๋ค. ์ด๋ ํ์๊ฐ์
์ ํ์ง ์์ ๊ตฌ๊ธ ๊ณ์ ์ ๊ฒฝ์ฐ, ์ฑ๋ณ, ๋์ด๋, ์ฑ๋ณ/๋์ด๋ ๊ณต๊ฐ ์ฌ๋ถ ํ๋๋ฅผ ๋ ์ถ๊ฐํด์ผํ๋ฏ๋ก ํ์๊ฐ์
์ฌ๋ถ๋ฅผ ํ์ธํด์ ๋ก์ง์ ๋๊ฐ๋ก ๋๋์๋ค.
</br>
ํ์ฌ๊น์ง ๊ตฌํํ ๋๋ฉ์ธ ๊ณ์ธต๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ด๋ฒ์ ์ค์ ์ ์ผ๋ก ๋ณผ ๊ฒ์ `LoginController.java`, `User.java`, `MemberStatusResponse`, `SaveUserRequest.java`, `UserService.java` ์ด๋ค.
LoginController.java ์ requestUserInfo ๋ฉ์๋
๊ธฐ์กด์ ๋จ์ํ ์ ์ ์ ๋ณด๋ฅผ ๋ก๋ํ๋ ๋ฐฉ์์์, ํ์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๋นํ์์ผ ๊ฒฝ์ฐ ํ์ ๊ฐ์
์ ์ฐจ๋ฅผ ๊ฑฐ์น ์ ์๋๋ก ๊ตฌ๊ธ ์ด๋ฉ์ผ์ ํตํด ์ฌ๋ถ๋ฅผ ํ์
ํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์๋ค.
@GetMapping("/login/oauth2/code/google")
public ResponseEntity<MemberStatusResponse> requestUserInfo(@RequestParam(name="code") String code) throws Exception{
final String accessToken = socialOAuth.requestAccessToken(code);
String userInfo = socialOAuth.getUserInfo(accessToken);
try{
JSONObject jsonObject = new JSONObject(userInfo);
Optional<User> user = userService.findByEmail(jsonObject.getString("email"));
if (!user.isPresent()) {
String name = jsonObject.getString("name");
String email = jsonObject.getString("email");
String picture = jsonObject.getString("picture");
return ResponseEntity.ok()
.body(new MemberStatusResponse(Role.GUEST.name(), name, email,picture,accessToken));
}else{
return ResponseEntity.ok()
.body(new MemberStatusResponse(Role.USER.name(),accessToken));
}
}catch (Exception e){
return ResponseEntity.internalServerError()
.body(new MemberStatusResponse(Role.GUEST.name(),"false","false","false","false"));
}
}
- `user` ๋ณ์์ `getUserInfo` ๋ฉ์๋๋ฅผ ํตํด ์ป์ ์ ์ ์ ๋ณด ์ค ์ด๋ฉ์ผ์ ํตํด ์ฐพ์ `User` ๊ฐ์ฒด๋ฅผ ๋ด๋๋ค. ํ์์ด๋ผ๋ฉด ์ด๋ฉ์ผ์ ํตํด ๋ฐ๊ฒฌ๋ ๊ฐ์ฒด๊ฐ ๋ด๊ธธ ๊ฒ์ด๊ณ ๋นํ์์ด๋ผ๋ฉด ์ผ์นํ๋ ์ ๋ณด๊ฐ ์์ผ๋ฏ๋ก null ์ด ๋ด๊ธธ ๊ฒ์ด๋ค.
- `user` ๊ฐ null ์ด๋ผ๋ฉด (`if (!user.isPresent())`)
- ์ญํ (GUEST), ์ด๋ฆ, ์ด๋ฉ์ผ, ํ๋กํ ์ด๋ฏธ์ง, accessToken ์ response์ ๋ด์ ๋ณด๋ธ๋ค. โก๏ธ ์ ์ ์ ๋ณด๋ ํ์ ๊ฐ์ ์ ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
- null ์ด ์๋๋ผ๋ฉด
- ์ญํ (USER), accessToken ์ response์ ๋ด์ ๋ณด๋ธ๋ค.
โ
์ด๋ accessToken์ด Authorization ๊ถํ์ ์ ๊ณตํด์ฃผ๋ ์ญํ (jwtToken ์ญํ )์ ํ๋ค๊ณ ์ค์ธํ๊ณ ๋ค ๋ฐํ์ ํ๋๋ฐ ์๋ฌด๋๋ ๋นผ๋ ๊ฒ์ด ๋ง๊ฒ ๋ค.
- ์ฌ๊ธฐ์ ๋ฌด์กฐ๊ฑด ์์ ์ ํด์ผํ๋ ๋ถ๋ถ ์ด ์๋๋ฐ ๋ฐ๋ก catch ๋ฌธ์ด๋ค.
- Exception์ผ๋ก ์ธํด response์ internalServerError()์ ํจ๊ป ๋ฐ๋๋ฅผ ๋ด์์ผํ ๋๋ ์ ํด์ง dto ํ์์ ๊ณ์ ์ง์ผ์ผ ํ๋๊ฑด๊ฐ? ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์ ์ผ๋จ ๋ชจ๋ ํ๋๋ฅผ "false" ๋ก ๋ฉ๊ฟ ๋์๋๋ฐ ์๋ฌด๋๋ ๋ ์ข์ ๋ฐฉ์์ด ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ผ ๋ฐํ dto ํ์์ด ์ด๋ป๊ฒ ๋์ด์๋์ง ํ์ธํด๋ณด์
MemberStatusResponse.java
@AllArgsConstructor
@RequiredArgsConstructor
@Getter
public class MemberStatusResponse {
@NonNull
private String role;
private String name;
private String email;
private String picture;
@NonNull
private String accessToken;
public User toEntity() {
return User.builder()
.role(Role.GUEST)
.name(name)
.email(email)
.accessToken(accessToken)
.build();
}
}
โ
`@RequiredArgsConstructor` ์ ํด๋์ค ๊ฐ์ฒด ์์ฑ ์ ์์ฑ์์ `@NonNull` ์ด๋
ธํ
์ด์
์ด ๋ถ์ด์๋ ๋ณ์๋ง ์ ๋ฌ ์ธ์๋ก ๋ด๊ธธ ์ ์๋๋ก ํ๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ ํ์์ธ ๊ณ์ ์ธ ๊ฒฝ์ฐ์๋ `@NonNull` ์ธ role ๊ณผ accessToken ๋ง response์ ๋ด์ ์ ์๊ฒ ๋ผ๊ณ ๋นํ์์ธ ๊ฒฝ์ฐ์๋ `@AllArgsConstructor` ๋ก ๋ชจ๋ ํ๋๋ฅผ response์ ๋ด์ ๋ณด๋ด๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด์ ๋นํ์์ธ ๊ตฌ๊ธ ๊ณ์ ์ด ์ด ์๋น์ค์ ํ์์ด ๋ ์ ์๋๋ก ํ์๊ฐ์
๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
LoginController.java ์ signUp ๋ฉ์๋
@PostMapping("/api/signup")
public ResponseEntity signUp(@RequestBody SaveUserRequest request) {
User save = userService.save(request);
try {
return ResponseEntity.status(HttpStatus.CREATED)
.body(save);
}catch (Exception e){
return ResponseEntity.internalServerError()
.body(save);
}
}
- ๊ฐ๋จํ๋ค! `SaveUserRequest` dto ํ์๋๋ก ์์ฑ๋ json์ request๋ก ๋ฐ์ผ๋ฉด ์ด๊ฒ์ save ํด์ค๋ค.
- save ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ `UserService` ํด๋์ค๋ JpaRepository<User,Long> ์ ์์ํ๋ค. ์ด๋ ๊ฒ ์ฝ๋๊ฐ ๊ฐ๋จํด์ง ์๊ฐ..
โ
`LoginController.java` ์ `requestUserInfo` ๋ฉ์๋์์ ํ์ ์ฌ๋ถ ํ์ธ ์์ ์ฌ์ฉ๋ `findByEmail` ๋ jpaRepository์ ๊ธฐ๋ฅ์ ์ด์ฉํ ๊ฒ์ด๋ค. `findBy` + `์ํฐํฐ์ ํ๋๋ช
` ์ผ๋ก ๋ฉ์๋ ์ด๋ฆ์ ์ง๋ฉด ํด๋น ์ํฐํฐ์ ํ๋๋ก ๊ฒ์ํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ์ข๋ค..
- ์ฐธ๊ณ ๋ก`countBy` + `์ํฐํฐ์ ํ๋๋ช
` ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ ์ฝ๋ ์๋ฅผ ๋ฐํํ๋ค.
SaveUserRequest.java
ํ์ ๊ฐ์ ์์ request body์ ๋ด์์ผํ๋ dto์ด๋ค.
@Getter
public class SaveUserRequest {
private String name;
private String email;
private String picture;
private char gender;
private String age;
private boolean genderVisible;
private boolean ageVisible;
public User toEntity() {
return User.builder()
.name(name)
.email(email)
.picture(picture)
.gender(gender)
.age(age)
.genderVisible(genderVisible)
.ageVisible(ageVisible)
.build();
}
}
+ `name`, `email`, `picture`, `gender`, `age`, `genderVisible`, `ageVisible` ํ๋๊ฐ ์๋ค. ์ด๋ `name`, `email`, `picture` ๋ ๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ ๋ฐํ ๋ฐ๋ ์ ๋ณด์ด๋ค. ๋๋จธ์ง๋ ์ถ๊ฐ์ ์ผ๋ก ์ด ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ํ์ํ ํ๋๋ค์ด๋ฏ๋ก ๋ฐ์์ค๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ์ฅ๋์์์ ํ์ธํ ์ ์๋ค.
๋ค์ ํ ์ผ
- ์ด์ ํ์ ์ ๋ณด๋ ๊ฐ์ง ์ ์์ผ๋ ํด๋น ์ ์ ๊ฐ ๋ฑ๋กํ๋ ๋ชจ์ง๊ธ๊ณผ ์ฐธ์กฐ๊ด๊ณ๊ฐ ์ ๋ณด์กด๋๋๋ก ๋ชจ์ง๊ธ ๋ฑ๋ก api๋ฅผ ์์ ํ์.
- ๋ชจ์ง๊ธ ๋ฑ๋ก์ tag ์ํฐํฐ์์ ์ฐธ์กฐ๊ด๊ณ๋ ์ ๋ณด์กด๋๋๋ก ์์ ํ์.
- ๋งค์น ์ฐธ๊ฐ ์ ์ฒญ ๊ตฌํ๊น์ง...?