๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ’ป๐Ÿ’ญ๐ŸŽง๐ŸŒ

[์›น ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ] 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 ์—”ํ‹ฐํ‹ฐ์™€์˜ ์ฐธ์กฐ๊ด€๊ณ„๋„ ์ž˜ ๋ณด์กด๋˜๋„๋ก ์ˆ˜์ •ํ•˜์ž.
- ๋งค์น˜ ์ฐธ๊ฐ€ ์‹ ์ฒญ ๊ตฌํ˜„๊นŒ์ง€...?

๋ฐ˜์‘ํ˜•