[Spring-Boot] 카카오 api 호출 후 저장하기(Mysql)

이주훈·2023년 8월 16일
0
post-thumbnail

이번 포스팅에서는 앞서 카카오 api를 호출해서 가져온 유저의 정보를 데이터베이스에 저장하는 것을 실습할 예정이다.

1. 순서

  1. User 엔티티 구성
  2. KakaoJoinApi 구현
  3. KakaoService 구현
  4. KakaoRepository 구현
  5. 시연

2. User 엔티티 구성

실제 프로젝트에 적용하기 위해 프로젝트에 관한 erd를 토대로 엔티티를 구성할 것이다.
아래 사진은 현재 구상중인 User에 관한 erd이다.
카카오 api 안에서는 아이디, 이름, 이메일, 성별 정보를 가져올 것이다.
또한 직접적으로 데이터베이스에 스키마를 구성하지 않고 jpa를 사용하여 스키마를 자동으로 생성할 것이다.

아래 코드는 User 엔티티를 생성하는 User 클래스이다.
userKey를 primary key로 설정하였다.

엔티티 안에 생성 메서드를 추가하였다. 객체를 setter로 하나씩 값을 추가하는 것보다는 생성메서드로 객체를 생성하는 것이 유지보수성에 좋기 때문이다.

package com.example.loginApiStudy.Entity;

import com.example.loginApiStudy.Enums.JoinGender;
import com.example.loginApiStudy.Enums.JoinType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;

@Entity
public class User {

    @Id @GeneratedValue
    @Column(name = "userKey")
    private int userKey;
    @Column(name = "regularUser")
    private JoinType regularUser;
    @Column(name = "kakaoUser")
    private JoinType kakaoUser;
    @Column(name = "googleUser")
    private JoinType googleUser;
    @Column(name = "userId")
    private String userId;
    @Column(name = "userPw")
    private String userPw;
    @Column(name = "userName")
    private String userName;
    @Column(name = "userEmail")
    private String userEmail;
    @Column(name = "userPhone")
    private String userPhone;
    @Column(name = "userGender")
    private JoinGender userGender;

    public static User createUser(String name, String email) {
        User user = new User();
        user.kakaoUser = JoinType.Y;
        user.googleUser = JoinType.N;
        user.regularUser = JoinType.N;
        user.userEmail = email;
        user.userName = name;
        return user;
    }
}

마지막으로 application.yml 파일에 데이터베이스 관련 아이디, 비밀번호, url, driver를 명시하면 엔티티의 구성은 완료했다.


3. KakaoJoinApi 구현

컨트롤러는 뷰의 이동만 담당하고 나머지 조회, 추가, 수정, 삭제는 api를 통해서 실습할 예정이다.
아래는 KakaoJoinApi.class이다. 앞에서 작성했던 글에서 getKakaoAccessToken과 receiveKakaoUser 메서드를 통해 user의 정보를 받아온 것을 joinUser 메서드에 요청하여 데이터베이스에 저장할 예정이다.

package com.example.loginApiStudy.Api;

import com.example.loginApiStudy.DTO.GoogleLoginResponse;
import com.example.loginApiStudy.Entity.User;
import com.example.loginApiStudy.Repository.UserRepository;
import com.example.loginApiStudy.Service.KakaoService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.WebClient;

@RestController
@RequiredArgsConstructor
public class kakaoJoinApi {

    private final KakaoService kakaoService;
    private final UserRepository userRepository;

    @GetMapping("/login/kakao")
    public String kakaoCallResource(@RequestParam("code") String code) throws Exception {
        System.out.println(code);
        String resourceToken = kakaoService.getKakaoAccessToken(code);
        User user = kakaoService.receiveKakaoUser(resourceToken);
        kakaoService.joinUser(user);
        return "success";
    }
}

4. KakaoService 구현

Service 단에서는 api 클래스에서 넘겨준 User 클래스를 Repository로 보내는 역할을 담당한다.

@Transactional
public void joinUser(User user){
    userRepository.join(user);
}

5. userRepository 구현

EntityManager를 주입한 후 Service에서 넘겨준 user를 persist를 사용하여 데이터베이스에 저장한다.

@Repository
@RequiredArgsConstructor
public class UserRepository {

    private final EntityManager em;
    
    public void join(User user){
        em.persist(user);
    }
}

6. 시연

api를 호출했을 때 받아온 User의 정보를 정상적으로 데이터베이스에 저장한 것을 볼 수 있다.
저장을 못 한 phone과 pw는 카카오 api에서 가져올 수 없는 정보이므로 별도의 페이지를 구성해 추가로 입력을 받을 수 있도록 구현해야한다.


7. 소감

스프링으로 카카오 api를 호출하고 mysql에 저장하면서 api 문서의 중요함을 느낄 수 있었다.
공식문서를 보는데 이해가 안 되는 부분은 블로그들을 참고하면서 구현할 수 있었다.
공식문서와 블로그들을 참조하면서 코드를 추가했기 때문에 정상적으로 구현은 되었다.
하지만 하나의 기능을 만들기 위해 사용하는 라이브러리가 개발자마다 다르기 때문에 코드가 뒤죽박죽 된 것을 볼 수 있었다. 다음 포스팅에서는 지금 구현한 프로젝트를 중복을 배제하고 최적화를 하기 위해 리펙토링 하는 과정을 포스팅하겠다.

profile
코딩 잘하고 싶다..

0개의 댓글